1. 工业视觉检测的现状与AI切入的真实痛点
工业视觉检测这个词,在制造业圈子里其实不算新鲜。十几年前,流水线上就已经有基于传统算法的视觉系统在跑,比如用固定阈值做二值化、用边缘检测算子找轮廓、用模板匹配定位产品。这些方案在规则明确、光照稳定、产品单一的场景下确实能跑得不错,但一旦遇到表面纹理复杂、缺陷形态多变、光照条件波动的情况,传统算法的短板就暴露得非常彻底。
我接触过不少做产线自动化的朋友,他们最常抱怨的一句话是:“调参调到怀疑人生。”传统视觉检测的核心逻辑是人把“什么是缺陷”翻译成一组数学规则,比如灰度值低于某个数、面积大于某个阈值、圆形度在某个区间内。问题是,很多工业缺陷根本没法用几条规则描述清楚。划痕有深有浅、有长有短、有直有弯;气泡有大有小、有密集有稀疏;脏污更是千奇百怪,颜色、形状、分布都没有固定模式。你写规则的速度,永远赶不上缺陷形态变化的速度。
这就是AI切入工业视觉检测的真实起点。不是因为它“先进”,而是因为传统方法在某些场景下确实扛不住了。深度学习尤其是卷积神经网络,最大的价值在于它不需要人去显式定义缺陷长什么样,而是通过大量样本让模型自己学习特征。你给它看几千张合格品和几千张缺陷品,它自己会找到那些人眼都说不清但确实存在的判别依据。
但这里有个很大的误区需要提前说清楚:AI不是万能药。我见过太多项目,一上来就说要上深度学习,结果数据只有几十张缺陷图,光照条件还天天变,最后模型在产线上跑得一塌糊涂。AI赋能工业视觉检测,核心不是“用不用AI”,而是“在什么条件下用AI、怎么用AI、用完之后怎么保证稳定”。这个判断,比选什么网络结构重要得多。
这篇文章想聊的,就是从一个真实的工业视觉检测系统开发视角出发,把AI赋能这件事拆开来看。我会讲清楚传统算法和深度学习的边界在哪里、数据怎么准备、模型怎么选、工程上怎么落地、产线环境里有哪些坑。适合正在考虑给产线加视觉检测的工程师、正在做相关项目的开发者,以及想了解这个方向到底怎么回事的技术管理者。
2. 传统算法与深度学习的分界线:什么时候该换方案
2.1 传统视觉算法的能力边界在哪里
传统视觉算法并不是一无是处,相反,在很多场景下它比深度学习更靠谱。我先把它的优势说清楚,免得读者产生“AI一上,传统全废”的误解。
传统算法的第一个优势是确定性。你给它同样的输入,它永远给你同样的输出。这在工业场景里非常重要,因为产线需要的是可预测、可追溯、可复现的检测结果。深度学习的输出是概率性的,同一个产品,今天判合格,明天可能因为模型微小的数值波动判成缺陷,这种不确定性在某些行业是致命的。
第二个优势是速度。传统算法经过几十年优化,很多算子已经做到极致。一个简单的阈值分割加轮廓分析,在普通工控机上跑几百帧每秒毫无压力。深度学习模型即使经过剪枝和量化,推理速度也很难达到这个水平,除非上专用加速硬件。
第三个优势是样本需求低。传统算法不需要训练,你只要把规则调好就行。深度学习动辄需要几千张标注样本,这在很多小批量、多品种的产线里根本不现实。
那传统算法什么时候会扛不住?我总结了几条判断标准:
- 缺陷形态无法用几何或灰度规则描述,比如织物表面的随机纹理异常、金属表面的复杂反光缺陷
- 缺陷与背景的对比度极低,传统阈值分割无法稳定分离
- 产品种类多、换型频繁,每换一种产品就要重新调一套参数
- 缺陷样本极少但合格样本极多,且缺陷类型还在不断新增
- 光照条件无法完全控制,存在自然光干扰或反光变化
如果你的场景命中了两条以上,那基本可以考虑深度学习方案了。
2.2 深度学习在工业检测中的真实优势与代价
深度学习在工业视觉检测里的核心优势,说白了就是“端到端学习”。你不需要告诉它边缘在哪里、纹理怎么描述,它自己从数据里学。这对那些“人眼能看出问题但说不出规则”的缺陷特别有效。
但代价也很明显。首先是数据成本。工业场景的缺陷样本天然稀少,一条产线可能跑一天才出几个缺陷品。你要收集几千张缺陷图,可能需要几个月甚至更久。而且收集到了还要标注,标注工业缺陷需要专业知识,不是随便找个人画框就行。
其次是模型的不确定性。深度学习模型的输出是概率,这就带来一个阈值选择的问题。阈值设高了漏检,设低了误检。而且这个阈值在不同批次、不同光照下可能还需要调整。产线最怕的就是今天调好的参数明天就不灵了。
第三是维护成本。传统算法出问题,你去看代码就知道哪条规则不对。深度学习模型出问题,你很难解释为什么。是训练数据分布不对?是模型过拟合了?是输入图像预处理有问题?排查起来非常耗时。
所以我的建议是:不要一上来就全盘AI化。可以先做混合方案,传统算法负责定位和粗筛,深度学习负责精细分类。这样既能利用传统算法的稳定性,又能发挥深度学习的灵活性。
2.3 一个实用的选型决策表
为了让大家更直观地判断,我整理了一个选型对照表:
| 判断维度 | 优先传统算法 | 优先深度学习 |
|---|---|---|
| 缺陷规则清晰度 | 可用几何/灰度规则描述 | 无法用规则描述 |
| 样本数量 | 缺陷样本少于50张 | 缺陷样本超过500张 |
| 产品换型频率 | 低,一种产品跑很久 | 高,频繁换型 |
| 光照稳定性 | 可控,有专用光源 | 不可控或变化大 |
| 检测速度要求 | 极高,超过200fps | 中等,30fps以内可接受 |
| 可解释性要求 | 极高,需要追溯原因 | 中等,能定位到区域即可 |
| 硬件预算 | 普通工控机 | 可接受GPU加速卡 |
这个表不是绝对的,但可以作为初始判断的参考。实际项目中,我见过很多场景是传统算法做预处理、深度学习做最终判定的组合方案,效果比纯传统或纯深度学习都好。
3. 数据准备:工业视觉项目里最容易被低估的环节
3.1 缺陷样本的采集策略
数据是深度学习的地基,但工业场景的数据采集和互联网场景完全不同。互联网上你可以爬几百万张图,工业产线上你只能等缺陷自然出现。这个矛盾怎么解决?
第一个策略是主动制造缺陷。在允许的情况下,可以通过调整工艺参数、人为引入干扰等方式,在实验环境下生成缺陷样本。比如调整温度、压力、速度等参数,让产品出现划痕、气泡、变形等缺陷。这样可以在短时间内积累大量样本。但要注意,人为制造的缺陷和自然产生的缺陷在分布上可能有差异,需要做分布对齐。
第二个策略是数据增强。对已有的缺陷样本做旋转、翻转、缩放、亮度调整、对比度调整、添加噪声等操作,扩充样本数量。但工业图像的增强要谨慎,因为有些增强会改变缺陷的物理意义。比如你把一个划痕旋转90度,它可能就不像划痕了。所以增强策略要结合具体缺陷类型来设计。
第三个策略是合成数据。用渲染引擎或者生成模型合成缺陷图像。这个方案在学术界很热,但工业落地要小心,因为合成数据和真实数据的域差异可能很大,模型在合成数据上训练,到真实产线上可能完全失效。
第四个策略是少样本学习。如果缺陷样本实在太少,可以考虑用预训练模型加微调的方式,或者用度量学习、元学习等方法。但这些方法目前在实际产线上的稳定性还需要验证。
我的经验是:优先用真实数据,真实数据不够就用增强,增强还不够再考虑合成。合成数据只能作为补充,不能作为主力。
3.2 标注质量比标注数量更重要
工业缺陷标注是个技术活。我见过太多项目,标注员根本不知道什么是缺陷,把灰尘当成划痕,把反光当成裂纹,最后模型学出来的东西完全不能用。
标注工业缺陷有几个关键点:
- 标注员必须经过培训,理解每种缺陷的物理成因和外观特征
- 标注标准要统一,比如划痕的长度阈值、宽度阈值、深度判断标准
- 要有复核机制,至少两个人交叉检查,或者由工艺工程师抽检
- 边界样本要特别标注,比如“疑似缺陷但不确定”的样本,单独归类
还有一个容易被忽略的点:标注的一致性。同一个缺陷,不同标注员可能画出不同的框。如果标注框差异太大,模型学习的时候就会困惑。所以标注规范里要明确框的边界怎么定,是紧贴缺陷边缘还是留一定余量。
3.3 数据集的划分与分布对齐
数据集划分看起来简单,训练集、验证集、测试集按比例分就行了。但工业场景有个特殊问题:数据分布可能随时间变化。比如你收集了一个月的数据,前半个月光照条件好,后半个月光照条件差。如果你随机划分,训练集和测试集的分布可能不一致,导致测试结果虚高。
正确的做法是按时间划分,用前面的数据训练,用后面的数据测试。这样才能真实反映模型在未来数据上的表现。如果条件允许,最好用不同批次、不同产线的数据做交叉验证。
另外,工业场景里合格样本和缺陷样本的比例通常极度不平衡,可能是一万比一。这种不平衡会导致模型倾向于把所有样本都判为合格,因为这样准确率也有99.99%。解决方法是重采样、加权损失函数、或者用异常检测的思路,只学习合格样本的分布,偏离分布的就判为异常。
4. 模型选型与训练:不是越深越好,而是越合适越好
4.1 工业检测常用的网络结构对比
工业视觉检测的任务类型主要分三类:分类、检测、分割。分类是判断整张图有没有缺陷;检测是找出缺陷的位置并分类;分割是像素级地标出缺陷区域。不同任务对应不同的网络结构。
分类任务常用ResNet、EfficientNet、MobileNet等。ResNet结构经典,容易训练,适合作为基线。EfficientNet在精度和速度的平衡上做得不错。MobileNet适合部署在边缘设备上,速度极快但精度略低。
检测任务常用YOLO系列、Faster R-CNN、SSD等。YOLO系列速度快,适合实时检测,最新版本在精度上也不错。Faster R-CNN精度高但速度慢,适合离线检测。SSD介于两者之间。
分割任务常用U-Net、DeepLab系列、Mask R-CNN等。U-Net结构简单,适合小样本训练,在工业缺陷分割里用得很多。DeepLab系列在语义分割上表现好,但参数量大。Mask R-CNN可以同时做检测和分割,但速度慢。
我的建议是:先从简单的结构开始,比如分类用ResNet18,检测用YOLO的小模型,分割用U-Net。跑通之后再根据效果决定要不要换更复杂的模型。不要一上来就上大模型,训练慢、部署难、调试复杂,性价比很低。
4.2 迁移学习在工业小样本场景下的正确用法
工业场景的缺陷样本通常很少,从头训练模型基本不可能。迁移学习是标配。但迁移学习怎么用,有很多细节。
最常见的做法是用ImageNet预训练权重初始化,然后在自己的数据上微调。但这里有个问题:ImageNet是自然图像,工业图像和自然图像在纹理、颜色、对比度上差异很大。直接用ImageNet权重,效果可能不如预期。
更好的做法是用工业图像预训练权重。如果找不到公开的工业预训练模型,可以先用大量无标注的工业图像做自监督预训练,比如用MAE、SimCLR等方法,然后再用少量标注数据微调。这样模型学到的特征更贴近工业场景。
微调的时候,学习率要设小,通常比从头训练小一个数量级。因为预训练权重已经学到了通用特征,你只需要微调高层语义部分。如果学习率太大,会把预训练权重破坏掉。
还有一个技巧是分层微调。底层网络学的是边缘、纹理等通用特征,这些不需要大改,可以冻结或者用极小的学习率。高层网络学的是语义特征,需要根据你的任务调整,可以用较大的学习率。
4.3 训练过程中的关键参数与调参经验
训练深度学习模型,参数很多,但工业场景里最关键的几个是学习率、批大小、损失函数、优化器。
学习率是最重要的。太大不收敛,太小收敛慢。我通常用余弦退火或者阶梯下降,初始学习率设1e-3到1e-4之间,根据批大小调整。批大小越大,学习率可以适当调大。
批大小受显存限制。工业检测的图像分辨率通常很高,比如2048x2048,批大小可能只能设2或4。这时候可以用梯度累积,累积几个批次的梯度再更新一次,等效于更大的批大小。
损失函数要根据任务选。分类用交叉熵,检测用CIoU Loss加分类损失,分割用Dice Loss加交叉熵。工业场景样本不平衡严重,可以在损失函数里给缺陷样本更高的权重。
优化器我常用AdamW,收敛快,对学习率不敏感。SGD加动量也可以,但调参更麻烦。如果追求极致精度,可以试试Lookahead或者LAMB等优化器。
还有一个容易被忽略的点是数据归一化。工业图像的像素值分布可能和自然图像不同,用ImageNet的均值和方差做归一化不一定合适。最好统计自己数据集的均值和方差,用这个来做归一化。
5. 工程落地:从模型到产线系统的最后一公里
5.1 推理加速与硬件选型
模型训练好了,怎么在产线上跑起来?这是工程落地的核心问题。
首先要明确速度要求。产线节拍是多少?比如每分钟生产60个产品,那每个产品的检测时间不能超过1秒。如果产线速度更快,比如每分钟300个,那检测时间就要压缩到200毫秒以内。
推理加速有几个方向:
- 模型剪枝:去掉冗余的通道或层,减小模型体积和计算量
- 量化:把FP32权重转成INT8,速度提升2-4倍,精度损失通常很小
- 知识蒸馏:用大模型教小模型,让小模型达到接近大模型的精度
- TensorRT或OpenVINO等推理框架:针对特定硬件优化,速度提升明显
硬件选型要看预算和场景。普通工控机加一张中端GPU,比如RTX 3060或4060,可以满足大部分中等速度的检测需求。如果速度要求极高,可以考虑专用推理卡或者FPGA。如果成本敏感,可以用边缘计算设备,比如Jetson系列,但要注意算力限制。
我的经验是:先在工控机上跑通,测出实际速度,再决定要不要上专用硬件。很多项目其实用普通GPU就够了,没必要一上来就买最贵的卡。
5.2 与产线控制系统的对接方式
视觉检测系统不是孤立的,它要和产线的PLC、MES、剔除机构等对接。对接方式主要有几种:
- IO信号:最简单的方式,检测结果通过数字IO输出,比如合格给一个高电平,缺陷给一个低电平
- 串口/网口通信:通过Modbus、TCP/IP等协议传输更丰富的信息,比如缺陷类型、位置、置信度
- 数据库对接:检测结果写入数据库,MES系统从数据库读取,适合需要追溯的场景
对接的时候要注意时序。视觉系统处理需要时间,如果产线速度很快,可能在检测结果出来之前产品已经流走了。这时候要么加缓存区,要么用编码器跟踪产品位置,确保剔除机构在正确的位置动作。
还有一个坑是触发信号。相机拍照需要触发,触发信号可能来自光电传感器、编码器、或者PLC。触发信号的稳定性直接影响图像质量。如果触发抖动,图像可能模糊或者位置偏移。所以触发信号的硬件和软件都要做滤波和防抖。
5.3 误检与漏检的平衡策略
产线最怕的是漏检,因为缺陷品流到客户手里可能造成严重后果。但误检也很烦,因为误检会导致合格品被剔除,降低良率。
误检和漏检是一对矛盾。你把阈值调高,漏检减少但误检增加;你把阈值调低,误检减少但漏检增加。怎么平衡?
首先要明确业务需求。有些行业对漏检零容忍,比如医药、汽车安全件,那就要牺牲一些误检率。有些行业对良率敏感,比如消费电子,那就要控制误检率。
其次可以用多级判定。第一级用高灵敏度阈值,把所有可疑品都挑出来;第二级用高特异性阈值,对可疑品做精细判定。这样可以在保证不漏检的前提下,尽量减少误检。
还可以引入人工复核。对于置信度处于中间区间的样本,自动推送给人工复核。这样既保证了自动化效率,又保证了判定准确性。
最后要建立反馈机制。产线运行过程中,误检和漏检的样本要收集起来,定期重新训练模型。模型不是一次训练就完事的,需要持续迭代。
6. 产线环境里的那些坑:从实验室到车间的落差
6.1 光照变化对模型的影响与应对
实验室里光照是可控的,车间里光照是变化的。白天有自然光从窗户照进来,晚上只有灯光;夏天和冬天光照角度不同;甚至同一班次里,随着时间推移,灯光也会衰减。
光照变化对深度学习模型的影响很大。模型在某种光照下训练,换一种光照可能就失效了。应对方法有几个:
- 硬件上做遮光:给相机加遮光罩,给工位加暗箱,尽量隔绝自然光
- 光源上做稳定:用恒流源驱动光源,定期检查光源亮度,及时更换衰减的光源
- 算法上做增强:训练时加入各种光照条件下的样本,让模型学会忽略光照变化
- 预处理上做归一化:用直方图均衡化、自适应对比度增强等方法,把不同光照的图像归一化到相似分布
我见过一个项目,实验室里模型精度99.5%,到产线上只有85%。排查了半天,最后发现是车间窗户没遮光,下午阳光斜射导致图像对比度变化。加了个遮光帘,精度就恢复到98%以上。所以硬件上的问题,有时候比算法问题更致命。
6.2 产品位置与姿态变化的处理
产线上的产品不可能每次都停在完全相同的位置和姿态。可能有平移、旋转、甚至倾斜。传统算法可以用模板匹配做定位和矫正,深度学习模型对位置变化相对鲁棒,但姿态变化大了也会影响精度。
处理位置变化,可以在检测前加一个定位步骤。用传统算法或者轻量级深度学习模型找到产品的位置和角度,然后做仿射变换,把产品矫正到标准姿态,再送入检测模型。
如果产品是旋转对称的,比如圆形零件,那旋转不影响检测。但如果产品有方向性,比如有文字或标记,那旋转就会导致误判。这时候要么做姿态估计,要么在训练时加入各种旋转角度的样本。
还有一个问题是产品遮挡。产线上产品可能互相遮挡,或者被夹具遮挡。这时候检测模型需要能处理部分可见的情况。可以在训练时加入遮挡增强,或者用分割模型先分离出产品区域,再做检测。
6.3 模型更新与版本管理
产线系统上线后,模型不是一成不变的。新产品导入、新缺陷类型出现、光照条件变化,都可能需要更新模型。但模型更新是个风险操作,搞不好会导致批量误判。
我的做法是建立一套模型版本管理流程:
- 每次模型更新都要有完整的训练日志、验证结果、测试报告
- 新模型上线前要在产线上做影子测试,也就是新模型和旧模型同时跑,对比结果
- 影子测试通过后,先在小批量产线上试运行,观察一段时间
- 试运行没问题再全量上线,同时保留旧模型作为回滚方案
- 上线后持续监控误检率和漏检率,异常时自动告警
还有一个细节是模型文件的版本管理。模型文件要和训练代码、配置文件、数据集版本一一对应。否则出了问题,你都不知道这个模型是用哪份数据训练的。
7. 一个完整的工业视觉检测系统开发流程复盘
7.1 从需求分析到方案设计的完整链路
把前面讲的东西串起来,一个完整的工业视觉检测系统开发流程大概是这样的:
第一步是需求分析。要搞清楚检测什么缺陷、精度要求多少、速度要求多少、产线环境怎么样、预算多少。这一步最关键,需求不清楚后面全是白干。
第二步是可行性验证。用少量样本快速跑一个原型,看看深度学习能不能做。如果原型效果就很差,那要么换方案,要么重新定义问题。
第三步是数据采集和标注。这是最耗时的环节,通常占整个项目一半以上的时间。要制定采集计划、标注规范、质量控制流程。
第四步是模型训练和调优。选基线模型,跑通训练流程,然后逐步优化。不要追求一步到位,先保证能跑,再追求精度。
第五步是工程化部署。模型转换、推理加速、系统集成、界面开发。这一步需要软件工程师和算法工程师配合。
第六步是产线试运行和迭代。上线后持续监控,收集bad case,定期更新模型。
7.2 项目中最容易翻车的三个环节
根据我的经验,工业视觉项目最容易翻车的地方有三个:
第一个是数据。数据量不够、标注质量差、分布不一致,这些问题在项目后期才会暴露,但那时候已经来不及补救了。所以数据工作要前置,要在项目早期就投入足够资源。
第二个是光照。实验室和车间的光照差异,是导致模型精度下降的最常见原因。一定要在真实产线环境下采集数据,不要只在实验室里做。
第三个是集成。视觉系统和产线控制系统的对接,涉及硬件、软件、时序、通信协议等多个方面。任何一个环节出问题,都会导致系统不稳定。所以集成测试要充分,要留足时间。
7.3 持续迭代:模型上线只是开始
很多人以为模型上线就完事了,其实上线只是开始。产线在跑,数据在产生,模型需要持续迭代。
迭代的驱动力来自几个方面:新缺陷类型出现、原有缺陷形态变化、光照条件变化、产品换型。每次迭代都要重新评估模型效果,确保没有退化。
迭代的节奏要看产线情况。如果产线稳定,可能几个月迭代一次。如果产线变化频繁,可能每周都要迭代。但迭代不能太频繁,因为每次迭代都有风险,要平衡收益和风险。
最后说一个我自己的体会:工业视觉检测系统,算法只占30%,工程占70%。很多人把精力都花在调模型上,忽略了工程稳定性、可维护性、可追溯性。结果模型精度很高,但系统天天出问题,产线根本没法用。所以做这个方向,一定要有系统工程思维,不能只盯着算法指标。