1. 项目背景与挑战
去年在天津武清区的一个汽车刹车盘厂,我遇到了一个典型的工业视觉检测难题。客户原有的传统视觉检测系统存在三大痛点:一是对光照条件极度敏感,车间窗户透进来的阳光角度变化都会导致误检;二是算法泛化能力差,不同批次的刹车盘表面纹理稍有差异就需要重新调试;三是扩展性差,新增一种缺陷类型就要推翻原有算法逻辑重写。
具体到技术指标上,客户要求检测四种典型缺陷:
- 划痕(最小长度0.1mm)
- 气孔(最小直径0.1mm)
- 砂眼(不规则凹坑)
- 裂纹(细长型缺陷)
产线节拍达到30件/分钟,意味着从图像采集到给出判断结果必须在2秒内完成(含机械动作时间)。更棘手的是预算限制——8万元要覆盖硬件采购和软件开发全部成本。
2. 技术选型与方案设计
2.1 为什么选择YOLOv11
传统OpenCV方案需要为每种缺陷单独设计特征提取算法,而YOLOv11的端到端检测特性完美解决了这个问题。实测对比发现:
- 传统方案在理想光照下准确率约85%,但实际车间环境会降至70%以下
- YOLOv11即使在强光干扰下仍能保持95%+的准确率
- 模型训练完成后,新增缺陷类型只需补充标注数据重新训练,无需修改算法架构
选择v11而非v8的主要原因是其新增的Attention Guided Upsampling模块,对小目标检测效果提升显著。在测试集上,v11对0.1mm缺陷的召回率比v8高12个百分点。
2.2 系统架构设计
采用分层架构实现关注点分离:
code复制[数据采集层]
↓
[边缘推理层] - YOLOv11模型推理(ONNX Runtime)
↓
[业务逻辑层] - C#实现质检逻辑
↓
[设备控制层] - Modbus TCP控制剔除装置
↓
[MES对接层] - 数据上报与追溯
每层通过消息队列解耦,例如边缘层将推理结果以JSON格式推送到RabbitMQ,业务层异步消费处理。这种设计使系统峰值处理能力达到50件/分钟,留有充足余量。
3. 模型训练关键细节
3.1 数据准备与增强
原始数据集只有2000张标注图像,通过以下方法扩充至8000张:
- 光学变异增强:模拟不同光照角度(±30°)、强度(50%-150%)
- 物理仿真:在Blender中生成带随机划痕的3D刹车盘模型渲染图
- 缺陷移植:将真实缺陷抠图粘贴到正常样本上
标注时特别注意:
- 对微小缺陷采用9点标注法(中心点+8个边缘点)
- 为裂纹类缺陷增加方向属性标注(0-360°)
- 对疑似缺陷但不确定的样本一律不标注,避免噪声
3.2 模型训练技巧
使用迁移学习加载COCO预训练权重,关键训练参数:
python复制model.train(
data='brake_disk.yaml',
epochs=300,
imgsz=640,
batch=16,
optimizer='AdamW',
lr0=0.001,
augment=True,
fliplr=0.5,
mixup=0.2,
label_smoothing=0.1,
nbs=64
)
特别加入的改进:
- 注意力引导上采样:在FPN层添加AGU模块,小目标AP提升7.2%
- 自适应锚框:根据刹车盘缺陷分布重新聚类anchor尺寸
- 难例挖掘:对漏检样本进行3倍加权重训练
最终模型在测试集上的表现:
| 缺陷类型 | 准确率 | 召回率 |
|---|---|---|
| 划痕 | 99.1% | 98.7% |
| 气孔 | 98.5% | 97.9% |
| 砂眼 | 97.8% | 96.5% |
| 裂纹 | 98.3% | 97.1% |
4. C#端工程化实现
4.1 高性能推理部署
使用ONNX Runtime C# API实现多线程流水线:
csharp复制var session = new InferenceSession("yolov11.onnx");
var inputTensor = new DenseTensor<float>(inputData, new[] { 1, 3, 640, 640 });
var inputs = new List<NamedOnnxValue>
{
NamedOnnxValue.CreateFromTensor("images", inputTensor)
};
using var results = session.Run(inputs);
var output = results.First().AsTensor<float>();
优化技巧:
- 开启ORT_ENABLE_ALL:启用所有图优化
- 固定内存分配:预分配输入输出缓冲区
- 异步处理:将图像预处理与推理分到不同线程
在i5-1135G7工控机上实测,单帧推理时间稳定在15ms以内。
4.2 设备控制集成
通过Modbus TCP控制剔除气缸:
csharp复制var factory = new ModbusFactory();
using var master = factory.CreateMaster(tcpClient);
// 写入线圈地址0x0001(气缸触发)
master.WriteSingleCoil(slaveId: 1, startAddress: 1, value: true);
Thread.Sleep(50); // 保持50ms
master.WriteSingleCoil(slaveId: 1, startAddress: 1, value: false);
关键安全设计:
- 双信号确认机制:先检测到位传感器信号,再触发气缸
- 超时熔断:连续3次操作失败自动进入安全模式
- 状态心跳包:每500ms向PLC发送状态报文
5. 产线部署实战经验
5.1 光学系统调试
虽然YOLO对光照不敏感,但合理布光仍能提升效果:
- 采用30°环形低角度光源,突出表面凹凸特征
- 添加650nm红色滤光片,抑制金属反光
- 使用偏振片消除镜面反射
相机选用2000万像素黑白工业相机,实际分辨率设置为1280×1024,配合25mm定焦镜头,单个像素对应0.05mm的物方尺寸。
5.2 系统稳定性保障
采取的可靠性措施:
- 看门狗机制:Python服务监控C#进程,异常时自动重启
- 数据校验:对每帧图像记录MD5值,防止传输错误
- 温度保护:当工控机CPU温度>75℃时自动降频运行
日志系统采用NLog+ELK栈,关键指标(如推理耗时、内存占用)每分钟采样一次,通过Grafana展示实时仪表盘。
6. 典型问题排查实录
6.1 漏检问题分析
曾出现砂眼缺陷漏检率突然升高的情况,排查过程:
- 检查训练数据:发现新增批次的砂眼颜色更接近基体
- 验证模型:在测试集上表现正常
- 检查光源:发现LED亮度衰减15%
- 解决方案:更换光源后增加对比度增强预处理
6.2 误触发处理
遇到过一次连续误触发剔除装置,最终发现:
- 产线振动导致相机轻微位移
- 触发信号线受到变频器干扰
- 采取的措施:
- 加固相机支架
- 信号线改用双绞屏蔽线
- 在软件端增加移动平均滤波
7. 效果与扩展
系统上线后指标:
- 平均检测时间:18ms/件
- 准确率:98.5%(客户抽检结果)
- 日均检测量:14,400件
- 误检导致的停机时间:0
后续扩展方向:
- 增加热成像模块检测内部缺陷
- 集成SPC统计分析功能
- 开发Android端巡检APP
这个项目的成功验证了:在预算有限的情况下,基于YOLO+C#的技术路线完全可以替代传统机器视觉方案,且具备更好的扩展性和适应性。对于准备尝试工业AI落地的同行,我的建议是先把数据质量抓好,再简单的模型配上高质量数据,效果也会远超复杂算法+垃圾数据的组合。
