AI-深度学习

嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办

展开合集目录
  1. 嵌入式视觉模型进阶 01:怎样读懂一个实际模型
  2. 嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积
  3. 嵌入式视觉模型进阶 03:MobileNet:深度可分离卷积与倒残差
  4. 嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3
  5. 嵌入式视觉模型进阶 05:ShuffleNet:通道拆分与重排
  6. 嵌入式视觉模型进阶 06:结构重参数化:训练分支怎样合为一个卷积
  7. 嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征
  8. 嵌入式视觉模型进阶 08:FPN 与 PAN:怎样融合不同尺度的信息
  9. 嵌入式视觉模型进阶 09:检测头:分类、位置与置信度
  10. 嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算
  11. 嵌入式视觉模型进阶 11:完整 YOLOv8 推理:从图片到原图目标框
  12. 嵌入式视觉模型进阶 12:训练自己的检测器与错误分析
  13. 嵌入式视觉模型进阶 13:检测器导出对照与其他结构路线
  14. 嵌入式视觉模型进阶 14:跟踪基础:运动预测、匹配与轨迹生命周期
  15. 嵌入式视觉模型进阶 15:ByteTrack 思路:用低分框恢复已有轨迹
  16. 嵌入式视觉模型进阶 16:外观特征与 ReID:怎样比较两个目标
  17. 嵌入式视觉模型进阶 17:目标跟随:从轨迹到云台控制接口
  18. 嵌入式视觉模型进阶 18:视频系统:队列、时间戳与异步流水线
  19. 嵌入式视觉模型进阶 19:人脸处理流程:检测、关键点与对齐
  20. 嵌入式视觉模型进阶 20:特征识别:人脸向量、相似度与阈值
  21. 嵌入式视觉模型进阶 21:人体关键点与姿态估计
  22. 嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片
  23. 嵌入式视觉模型进阶 23:OCR 识别:序列模型与 CTC
  24. 嵌入式视觉模型进阶 24:完整 OCR 流程与识别错误分析
  25. 嵌入式视觉模型进阶 25:轻量语义分割与实例分割
  26. 嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办
  27. 嵌入式视觉模型进阶 27:深度估计与图像恢复:两个专题入口
  28. 嵌入式视觉模型进阶 28:面向 NPU 的计算图与算子兼容
  29. 嵌入式视觉模型进阶 29:量化、蒸馏与剪枝的实际取舍
  30. 嵌入式视觉模型进阶 30:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办的封面

第 26 / 30 课。 前置:上一课。本篇的运行范围以实验说明和验证记录为准,构造样例不代表真实任务精度或板端性能。

缺陷种类可能没有穷尽

普通分类需要定义并收集类别,实际缺陷可能稀少且不断变化。异常检测的一种思路是先描述正常外观,再把偏离正常的区域标为可疑。可疑不等于缺陷:光照变化、位置偏移或新批次材料也可能产生高分。

PatchCore 等方法使用局部特征记忆库。本课用构造的二维 patch 特征说明最近邻距离,不实现预训练特征网络和 coreset 选择,因此不能称为完整 PatchCore 复现。

特征库来自哪里

只将训练正常样本用于建库。独立正常验证样本用于设定可接受误报下的阈值,带缺陷验证样本用于观察召回;测试样本不得回流参与选阈值。

把训练样本与自己匹配会得到零距离,这是自匹配,不是对新正常样本的泛化能力。若缺陷误混入正常库,其邻域可能不再被判为异常。

从 patch 分数到图片分数

本实验对每个 patch 计算到库中最近向量的欧氏距离,排列回 8×8 热图。图像分数可用最大值或高分区域聚合;最大值对单点噪声敏感,均值则可能淹没很小的缺陷。

代码在一块区域加入明确偏移,检查它与正常验证分布的分离。结果只来自构造特征,不代表真实产线漏检率。完整系统需保存原图坐标映射,便于定位返修。

练习与工程取舍

把异常向量加入记忆库,观察异常分数下降;把所有测试特征整体平移,观察域变化引起的误报。扩大库会增加存储与检索成本,不能只考虑编码网络的 NPU 时间。

交付正常数据来源、排除缺陷的方法、阈值依据、区域定位结果和失败样本。设备换镜头或灯光后,需要重新验证正常分布。

配套实验与运行记录

实验:工业异常检测:缺陷样本少时怎么办

查看完整代码:main.py
"""建立正常特征库与最近邻异常分数,分析阈值、空间热图和数据污染。"""

import numpy as np


def nearest(query, bank):
    return np.linalg.norm(query[:, None, :] - bank[None, :, :], axis=2).min(1)


def main():
    rng = np.random.default_rng(7)
    bank = rng.normal(0, 0.1, (100, 2))
    validation = rng.normal(0, 0.1, (200, 2))
    threshold = float(np.quantile(nearest(validation, bank), 0.99))
    query = rng.normal(0, 0.1, (64, 2))
    query[27:30] += 2
    heat = nearest(query, bank).reshape(8, 8)
    assert (heat.flat[27:30] > threshold).all()
    polluted = np.vstack([bank, query[27:30]])
    assert np.max(nearest(query[27:30], polluted)) == 0
    print(
        "constructed normal validation threshold",
        threshold,
        "image max",
        float(heat.max()),
        "hot positions",
        np.argwhere(heat > threshold).tolist(),
    )
    print("contaminated memory bank hides injected anomalies")


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/26-工业异常检测/code' && python3 main.py

在本篇代码目录执行 python3 main.py。依赖安装、可选入口见包内 README.md;实际运行结果见 verification.md。下载包包含本课使用的辅助模块与样例。

参考与进一步阅读

原始论文或官方文档用于核对结构、接口和适用范围。本篇代码是围绕教学目标编写的最小实验;除明确注明的完整入口外,不视为对应论文模型的完整复现。


完整进阶目录 · 入门系列 · 上一篇 · 下一篇