1. 工业AI缺陷检测系统的整体设计与思路拆解
1.1 为什么传统视觉方案越来越吃力
我在产线做视觉项目这些年,最直观的感受就是:以前一套规则算法能撑三五年的场景,现在半年就得大改。原因不复杂,产品迭代快了,表面工艺越来越复杂,反光、拉丝、渐变纹理这些以前算“异常”的东西,现在成了正常外观。你再用固定阈值去卡,误判率直接起飞。
传统机器视觉的套路是:打光、拍照、预处理、特征提取、阈值判断。这套流程在检测螺丝有无、孔位偏移、字符识别这类结构化任务上依然很稳,成本也低。但一旦遇到划痕、脏污、色差、毛刺这类非结构化缺陷,规则就不好写了。划痕的灰度值可能和正常纹理一样,只是方向不同;脏污的形状千变万化,你没法穷举。
工业AI缺陷检测系统要解决的,就是这类“说不清规则、但人眼一看就知道”的问题。它的核心思路是用大量样本让模型自己学出正常与异常的边界,而不是靠工程师手写规则。标题里说的“正确率超99.9%”,在特定场景下是能落地的,但前提是数据、打光、部署三件事都做对了,缺一个都到不了这个数。
1.2 系统整体架构怎么搭
一套完整的工业AI缺陷检测系统,我习惯把它拆成五层,从下往上分别是:
- 成像层:相机、镜头、光源、工控机/采集卡。这层决定你能不能拍到缺陷,拍不到后面全白搭。
- 预处理层:图像去噪、畸变校正、ROI裁剪、图像增强。目的是把原始图变成模型爱吃的“干净数据”。
- 算法层:检测模型(分类/分割/检测)+ 后处理逻辑。这是AI的核心,但不是全部。
- 决策层:OK/NG判定、缺陷分类、置信度过滤、多模型投票。
- 执行层:与PLC通信、剔除机构、MES上传、报警联动。
很多人一上来就盯着算法层,觉得模型牛就行。实际项目里,成像层和决策层才是决定成败的地方。我见过太多团队模型训到99.5%,上产线一跑只有92%,问题全出在打光不稳定和判定逻辑太粗暴。
1.3 方案选型:分类、分割还是检测
选哪种模型,取决于你要回答什么问题:
| 任务类型 | 适用场景 | 输出 | 典型缺陷 |
|---|---|---|---|
| 图像分类 | 整图判定OK/NG | 类别标签 | 表面脏污、色差 |
| 语义/实例分割 | 需要知道缺陷位置和形状 | 像素级掩码 | 划痕、裂纹 |
| 目标检测 | 缺陷位置+类别 | 边界框 | 缺件、异物 |
| 异常检测 | 只有正常样本 | 异常热力图 | 未知缺陷 |
我的经验是:如果缺陷种类固定且样本充足,优先用分割或检测;如果缺陷种类未知、样本极少,用异常检测打底,再逐步积累样本转监督模型。标题里说正确率超99.9%,通常是在缺陷种类明确、样本量上千、打光稳定的场景下达到的,不是随便一个场景都能复现。
1.4 99.9%这个数字怎么理解
先泼盆冷水:99.9%的正确率,必须明确三个前提——缺陷定义、样本分布、判定阈值。
- 如果缺陷率本身只有0.1%,那全判OK也有99.9%准确率,这种数字没意义。
- 真正要看的是漏检率(缺陷判成OK)和过杀率(OK判成缺陷)。产线通常要求漏检率接近0,过杀率控制在0.5%以内。
- 99.9%往往是“在测试集上”的结果,测试集和产线分布是否一致,才是关键。
所以我在项目里从不只看一个准确率,而是看混淆矩阵、PR曲线、以及产线连续跑72小时的稳定性数据。下面会详细讲怎么把这些指标落地。
2. 核心细节解析与实操要点
2.1 打光:决定上限的第一步
打光是视觉项目的天花板。模型再强,图拍不好也白搭。我常用的几种打光方式:
- 同轴光:适合检测平面上的划痕、字符,反光均匀。
- 低角度环形光:突出表面凹凸、毛刺,划痕会形成明暗对比。
- 背光:测轮廓、孔位、透明件内部杂质。
- 条形光/组合光:适合圆柱面、曲面,需要多角度拼接。
实操心得:先用肉眼+手电筒模拟打光效果,再选光源。我经常拿一个可调亮度的环形灯在样品上转角度,找到缺陷最明显的角度,再让供应商配对应光源。别一上来就买贵的,先验证可行性。
注意:产线环境光变化是隐形杀手。一定要加遮光罩,并把光源亮度锁定,避免白天黑夜差异导致图像漂移。
2.2 相机与镜头选型的关键参数
选相机不是像素越高越好,核心是分辨率够不够检出最小缺陷。
计算公式:
所需像素 = 视野宽度 / 最小缺陷尺寸 × 安全系数比如视野100mm,最小缺陷0.05mm,安全系数取3,则至少需要 100/0.05×3 = 6000像素宽。选800万像素(约3200×2400)就不够,得选1200万以上或缩小视野。
镜头方面,远心镜头适合测量类,畸变小;普通工业镜头适合大视野检测。景深要覆盖产品高度波动,否则会虚焦。
| 参数 | 建议 | 原因 |
|---|---|---|
| 分辨率 | 最小缺陷占3-5像素 | 保证特征可提取 |
| 帧率 | ≥产线节拍×1.5 | 留余量 |
| 接口 | GigE/USB3.0 | 稳定传输 |
| 快门 | 全局快门 | 运动物体不拖影 |
2.3 数据采集与标注的坑
AI模型的上限由数据决定。我踩过的坑:
- 样本不均衡:正常样本几万张,缺陷样本几十张。解决方法是数据增强+异常检测+主动学习。
- 标注不一致:不同人标同一张图,边界差几个像素。必须制定标注规范,定期交叉复核。
- 测试集污染:测试集和训练集来自同一批次,导致指标虚高。要按批次、按时间划分。
标注工具我用过LabelMe、CVAT、LabelImg,分割任务推荐CVAT,检测任务LabelImg够用。标注完一定要做一次标注质量抽检,随机抽10%复核,IoU低于0.7的重新标。
2.4 模型训练的核心参数
以分割任务为例,我常用的配置:
# 训练配置示例 backbone = "ResNet50" # 或EfficientNet input_size = (512, 512) # 根据缺陷尺寸调整 batch_size = 8 lr = 1e-4 # Adam初始学习率 epochs = 100 loss = "Dice + BCE" # 分割常用组合 augmentation = ["flip", "rotate", "brightness", "noise"]关键点:
- 学习率:太大震荡,太小收敛慢。用余弦退火或ReduceLROnPlateau。
- 数据增强:几何变换+光度变换都要,但别用会改变缺陷性质的增强(比如把划痕旋转成正常纹理)。
- 早停:验证集连续10轮不降就停,防止过拟合。
2.5 后处理与判定逻辑
模型输出的是概率图,直接阈值化往往过杀高。我常用的后处理:
- 置信度过滤:低于0.5的忽略。
- 面积过滤:缺陷面积小于N像素的忽略(需根据实际最小缺陷换算)。
- 形态学操作:开运算去噪点,闭运算连断裂。
- 多帧投票:连续3帧都判NG才输出NG,降低误报。
判定阈值不是拍脑袋定的,要用验证集画PR曲线,找到满足漏检率要求的阈值点。
3. 实操过程与核心环节实现
3.1 从零搭建一个缺陷检测Demo
假设我们要检测金属表面的划痕,流程如下:
第一步:硬件搭建
- 相机:1200万像素全局快门,GigE接口
- 镜头:35mm定焦,工作距离300mm
- 光源:低角度环形光,亮度可调
- 工控机:i7+16G+RTX3060(推理够用)
第二步:采集样本
- 正常样本500张,划痕样本200张(不同方向、长度、深度)
- 每张图保存原始格式,记录采集参数
第三步:预处理
import cv2 import numpy as np def preprocess(img): # 畸变校正 img = cv2.undistort(img, mtx, dist) # ROI裁剪 roi = img[200:800, 300:900] # 去噪 roi = cv2.bilateralFilter(roi, 9, 75, 75) # 归一化 roi = roi / 255.0 return roi第四步:训练分割模型用U-Net或DeepLabV3+,输入512×512,输出二值掩码。训练100轮,验证集IoU达到0.85以上。
第五步:部署推理
import torch model.eval() with torch.no_grad(): output = model(input_tensor) prob = torch.sigmoid(output) mask = (prob > 0.5).cpu().numpy()第六步:后处理与判定
def judge(mask, min_area=50): contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: if cv2.contourArea(cnt) > min_area: return "NG" return "OK"第七步:与PLC通信用Modbus TCP或TCP Socket,把OK/NG信号发给PLC,触发剔除。
3.2 参数计算实例
假设产线节拍2秒/件,视野120mm×90mm,最小缺陷0.03mm。
- 所需像素宽 = 120/0.03×3 = 12000像素
- 选相机:12000×9000约1.08亿像素,太贵。实际可缩小视野到60mm,则需6000像素宽,选1200万像素(4000×3000)勉强够,或选2000万像素更稳。
- 帧率:2秒/件,留余量选5fps以上。
- 光源:低角度环形光,亮度调到划痕对比度最大。
3.3 产线部署的现场记录
我第一次部署时,实验室99.2%,产线只有94%。排查发现:
- 产线振动导致图像轻微模糊 → 加防震支架
- 环境光从缝隙漏入 → 加遮光罩
- 产品高度波动导致虚焦 → 换大景深镜头
- 判定阈值太严 → 重新用产线数据调阈值
调整后稳定在99.5%以上。实验室和产线永远是两回事,必须现场调。
4. 常见问题与排查技巧实录
4.1 常见问题速查表
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 漏检高 | 缺陷样本少、打光不足 | 补样本、改打光 |
| 过杀高 | 阈值太严、正常样本多样性不足 | 调阈值、补正常样本 |
| 推理慢 | 模型太大、输入分辨率高 | 换轻量模型、降分辨率 |
| 图像不稳定 | 环境光、振动 | 遮光、防震 |
| 模型不收敛 | 学习率、数据标注 | 调LR、检查标注 |
| 产线指标下降 | 分布漂移 | 定期更新模型 |
4.2 独家避坑技巧
- 别迷信大模型:产线推理用ResNet18或MobileNet就够,大模型延迟高。
- 异常检测打底:新场景先用PatchCore或PaDiM,只需正常样本,快速上线。
- 主动学习:把产线置信度低的图挑出来人工标注,迭代模型,效率最高。
- 版本管理:每次模型更新记录数据版本、参数、指标,出问题可回滚。
- 多模型投票:两个模型都判NG才NG,降低过杀。
4.3 学习路线建议
如果你刚入行机器视觉,我建议:
- 先学OpenCV基础:图像读写、滤波、边缘、轮廓。
- 再学传统视觉:模板匹配、Blob分析、卡尺。
- 然后学深度学习:CNN、分割、检测。
- 最后学部署:ONNX、TensorRT、PLC通信。
热词里提到的“图像傅里叶变换”,在频域滤波去纹理很有用;“机器视觉和机器人坐标系”,做引导抓取必须掌握手眼标定。这些都是一步步积累的,别急。
4.4 关于LabVIEW做视觉
LabVIEW在产线很常见,配合Vision Development Module能做传统视觉。但AI部分,LabVIEW调用Python或ONNX模型是主流做法。我一般用LabVIEW做流程控制和UI,Python做AI推理,两者通过TCP或共享内存通信。这样既利用了LabVIEW的稳定性,又发挥了Python的AI生态。
5. 系统扩展与长期维护
5.1 模型迭代机制
产线跑久了,产品批次变化、模具磨损都会导致分布漂移。我建议建立月度迭代机制:
- 每月收集产线NG图和低置信度图
- 人工复核后加入训练集
- 重新训练并A/B测试
- 指标达标后灰度上线
5.2 数据管理
数据是资产,要分类存储:
- 原始图:按日期/批次存
- 标注图:按版本存
- 训练日志:记录参数和指标
- 模型文件:带版本号和日期
我见过团队数据乱放,半年后想复现都找不到,血的教训。
5.3 成本控制
一套AI视觉系统成本主要在相机、光源、工控机、软件。省钱技巧:
- 相机选国产工业相机,性价比高
- 光源可定制,不必买进口
- 工控机用消费级显卡,推理够用
- 软件用开源框架,省授权费
但别在打光和镜头上省钱,这两个是成像质量的根本。
5.4 团队协作
视觉项目不是一个人能搞定的,需要:
- 光学工程师:打光、选型
- 算法工程师:模型训练
- 软件工程师:部署、通信
- 产线工程师:现场调试
沟通成本很高,建议每周开一次对齐会,用数据说话。
6. 我个人在实际操作中的体会
做了这么多项目,我最大的体会是:AI缺陷检测的难点从来不在模型,而在工程化。模型开源的一大把,但能把打光、采集、标注、训练、部署、维护串起来的团队不多。99.9%这个数字,是系统工程的结果,不是单点技术的胜利。
另外,别指望一次上线就完美。我做的项目,第一版通常只能到95%左右,靠产线数据迭代两三个月才能到99%以上。耐心和持续优化,比追求一步到位更重要。
最后分享一个小技巧:每次调参只改一个变量,记录结果。同时改打光和阈值,出了问题你都不知道是哪个引起的。这个习惯让我少走了很多弯路。