1. 项目背景与核心痛点
汽车制造流水线上,螺栓装配质量检测一直是个让人头疼的问题。传统人工目检方式,工人平均每8小时要检查超过5000个螺栓连接点,疲劳导致的漏检率高达3%-5%。我曾亲眼见过某车企因为一颗未拧紧的螺栓导致整车召回,损失超过800万元。
目前行业常见的解决方案主要有两种:一种是基于传统OpenCV的模板匹配,另一种是采用激光测距传感器。前者对光照变化极其敏感,后者则无法识别螺栓缺失或型号错误的情况。而YOLOv8这类目标检测算法,在保持高精度的同时,单帧推理速度可以达到15ms(RTX 3060显卡),完美适配产线0.5秒/件的节拍要求。
2. 系统架构设计
2.1 硬件选型方案
我们采用分层式架构设计,硬件配置如下表所示:
| 组件类型 | 推荐型号 | 关键参数 | 单价(元) |
|---|---|---|---|
| 工控机 | 研华ARK-3530 | i7-1185G7/16GB/RTX A2000 | 28,000 |
| 工业相机 | 海康MV-CA020-10GC | 200万像素/86fps | 6,500 |
| 光源 | 奥普特环形光源 | 白色LED/直径100mm | 1,200 |
| PLC | 西门子S7-1200 | 1214C DC/DC/DC | 3,800 |
这套配置在实测中可实现:
- 图像采集延迟:<8ms
- YOLOv8推理延迟:12-18ms
- 系统整体响应时间:<50ms
2.2 软件架构设计
系统采用经典的MVVM模式分层:
code复制[硬件层]
├── 相机控制(海康SDK)
├── PLC通信(S7.Net)
└── IO信号采集(研华PCI-1756)
[业务逻辑层]
├── 图像预处理(OpenCvSharp)
├── YOLOv8推理(ONNX Runtime)
└── 质量判定引擎
[展示层]
├── 实时画面显示(WinForms)
├── 报警看板
└── 统计报表(LiveCharts)
3. 核心功能实现
3.1 YOLOv8模型训练
螺栓检测需要自定义数据集,建议采集至少2000张包含以下情况的样本:
- 正常紧固的螺栓
- 松动的螺栓(不同松动角度)
- 缺失的螺栓
- 错误型号的螺栓
使用LabelImg标注时,建议采用YOLO格式,标注框应完整包含螺栓头部和部分螺纹。训练参数示例:
python复制# yolov8n.yaml
train: ../datasets/bolt/train/images
val: ../datasets/bolt/valid/images
# 训练命令
yolo detect train data=yolov8n.yaml model=yolov8n.pt epochs=100 imgsz=640
3.2 C#上位机集成
关键代码实现图像采集与推理:
csharp复制// 相机初始化
var capture = new VideoCapture();
capture.Open(0, VideoCaptureAPIs.DSHOW);
capture.Set(VideoCaptureProperties.FrameWidth, 1920);
capture.Set(VideoCaptureProperties.FrameHeight, 1080);
// ONNX模型加载
var session = new InferenceSession("bolt_detection.onnx");
// 推理循环
while (true)
{
using var frame = new Mat();
capture.Read(frame);
// 预处理
var input = new DenseTensor<float>(new[] {1, 3, 640, 640});
Cv2.CvtColor(frame, frame, ColorConversionCodes.BGR2RGB);
Cv2.Resize(frame, frame, new Size(640, 640));
// 推理
var inputs = new List<NamedOnnxValue> {
NamedOnnxValue.CreateFromTensor("images", input)
};
using var results = session.Run(inputs);
// 后处理
ProcessResults(results);
}
3.3 PLC联动控制
当检测到异常时,通过Modbus TCP协议发送控制指令:
csharp复制// PLC通信初始化
var factory = new ModbusFactory();
using var master = factory.CreateMaster(tcpClient);
// 写入报警信号
master.WriteSingleRegister(0, 1); // 触发报警
master.WriteSingleCoil(1, true); // 启动剔除气缸
4. 工程优化技巧
4.1 性能提升方案
- 多线程处理:采用生产者-消费者模式
csharp复制var imageQueue = new BlockingCollection<Mat>(5);
Task.Run(() => Producer(capture, imageQueue));
Task.Run(() => Consumer(imageQueue, session));
- 内存优化:复用Mat对象
csharp复制private static readonly Mat ReusableMat = new Mat();
capture.Read(ReusableMat);
- GPU加速:启用TensorRT
csharp复制var options = SessionOptions.MakeSessionOptionWithCudaProvider();
var session = new InferenceSession("model.trt", options);
4.2 可靠性保障措施
- 心跳检测:每30秒检查一次设备状态
csharp复制timer = new System.Timers.Timer(30000);
timer.Elapsed += (s, e) => CheckDeviceStatus();
- 自动恢复:异常时重启服务
csharp复制AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
System.Diagnostics.Process.Start(Application.ExecutablePath);
Environment.Exit(1);
};
5. 常见问题排查
5.1 典型问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 检测框偏移 | 相机标定不准 | 重新进行9点标定 |
| 误检率高 | 光照不均匀 | 增加偏振片或调整光源角度 |
| PLC无响应 | 寄存器地址错误 | 使用Modbus Poll工具调试 |
| 内存泄漏 | Mat未释放 | 使用using语句或手动Dispose |
5.2 模型优化建议
- 对于小目标检测,可以将输入分辨率从640x640提升到1024x1024
- 添加数据增强:
python复制# data.yaml
augment:
- hsv_h: 0.015
- hsv_s: 0.7
- hsv_v: 0.4
- translate: 0.1
- scale: 0.9
- 使用K-Fold交叉验证确保模型泛化能力
6. 实施效果验证
在某新能源汽车电池包生产线实测数据:
| 指标 | 人工检测 | 本系统 | 提升幅度 |
|---|---|---|---|
| 检测速度 | 2秒/件 | 0.4秒/件 | 500% |
| 漏检率 | 4.2% | 0.3% | 93% |
| 误检率 | 1.8% | 0.5% | 72% |
| 人力成本 | 3人/班 | 0.5人/班 | 83% |
这套系统在实际部署中最大的收获是发现了传统检测方法难以察觉的"半紧固"状态——螺栓看似拧紧但实际上扭矩不足。通过分析YOLOv8的注意力热图,我们发现模型会特别关注螺栓与垫片的接触面状态,这是人工检测完全无法实现的精度。
