1. 项目背景与需求分析
在汽车制造装配线上,螺栓装配到位检测是确保产品质量的关键环节。传统人工目检方式存在效率低、易疲劳、标准不统一等问题,而基于规则的传统机器视觉方案对光照变化、零件位置偏移等工况适应性较差。我们团队在某车企总装车间的实际项目中,需要解决以下核心痛点:
- 螺栓规格多样(M6-M12),头部特征差异大
- 装配角度不固定(0-45度倾斜常见)
- 产线节拍要求高(单工位检测时间<500ms)
- 环境干扰复杂(金属反光、油污、遮挡)
经过多方案对比,最终选择"C#上位机+YOLO"的技术路线,主要基于:
- C# WinForms开发上位机界面,便于与PLC、机器人控制器集成
- YOLOv8n模型轻量化优势(仅6MB权重文件)
- OpenCVSharp图像处理库的工业级稳定性
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 硬件配置方案
mermaid复制graph TD
A[2000万像素工业相机] --> B[工控机 i7-1185G7]
B --> C[PLC控制器]
C --> D[报警指示灯]
B --> E[机械臂控制器]
关键硬件参数:
- 相机:Basler ace acA2000-50gm,500万像素@50fps
- 镜头:Computar M0814-MP2,8mm焦距
- 光源:红色环形光,波长625nm(抑制金属反光)
2.2 软件模块划分
csharp复制// 核心类结构示例
public class BoltInspectionSystem {
private CameraController _camera;
private YOLOWrapper _detector;
private PLCInterface _plc;
public void RunInspection() {
var img = _camera.Capture();
var results = _detector.Detect(img);
_plc.SendResult(results);
}
}
3. YOLO模型专项优化
3.1 数据集构建要点
收集2000+张产线实际图片,标注注意:
- 不同光照条件(正常/过曝/欠曝)
- 不同装配阶段(未旋入/半旋入/到位)
- 异常情况(滑牙、歪斜、漏装)
数据增强策略:
python复制# Albumentations配置示例
transform = A.Compose([
A.RandomBrightnessContrast(p=0.5),
A.MotionBlur(blur_limit=3, p=0.2), # 模拟产线振动
A.GridDropout(ratio=0.1, p=0.3) # 模拟油污遮挡
])
3.2 模型训练关键参数
yaml复制# yolov8n-bolt.yaml
parameters:
batch: 64
epochs: 300
imgsz: 640
optimizer: AdamW
lr0: 0.001
weight_decay: 0.05
fl_gamma: 1.5 # 聚焦困难样本
3.3 精度提升技巧
- 自适应锚框计算:
python复制from ultralytics.yolo.utils.autoanchor import check_anchors
check_anchors(dataset, model, thr=4.0) # 调整锚框匹配阈值
- 关键点检测增强:
python复制kpt_shape = [4, 2] # 检测螺栓头部四个象限点
4. C#上位机开发实战
4.1 图像采集优化
csharp复制// 使用DirectShow避免UI卡顿
private void Camera_NewFrame(object sender, NewFrameEventArgs e) {
Bitmap bmp = (Bitmap)e.Frame.Clone();
this.BeginInvoke(new Action(() => {
pictureBox.Image = bmp;
}));
}
4.2 多线程处理架构
csharp复制ThreadPool.QueueUserWorkItem(state => {
var result = _detector.Process(currentImage);
this.Invoke(new Action(() => UpdateUI(result)));
});
4.3 PLC通讯协议
采用Modbus TCP协议,关键寄存器映射:
| 寄存器地址 | 功能 | 数据类型 |
|---|---|---|
| 40001 | 检测结果 | uint16 |
| 40002 | 螺栓X坐标 | float32 |
| 40003 | 螺栓Y坐标 | float32 |
| 40004 | 旋转角度 | float32 |
5. 现场调试经验
5.1 典型问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 漏检率高 | 光照不均匀 | 增加偏振片+调整光源角度 |
| 误检相邻螺栓 | 锚框尺寸不合适 | 重新计算dataset的锚框 |
| 通讯延迟 | PLC响应超时设置过短 | 将Timeout从100ms改为500ms |
| 角度检测偏差大 | 关键点标注不准确 | 重新标注训练集 |
5.2 性能优化记录
- 图像预处理耗时从28ms降至9ms:
csharp复制// 使用指针操作替代Bitmap.GetPixel
unsafe {
byte* p = (byte*)bmpData.Scan0;
// 并行处理像素...
}
- YOLO推理速度提升方案:
- 启用TensorRT加速(FP16精度)
- 将OpenCV DNN后端改为CUDA
6. 最终效果验证
经2000次连续测试:
- 检测准确率:99.2%
- 平均耗时:136ms/帧
- 误检率:<0.5%
产线实际应用后:
- 不良品流出率下降82%
- 人工复检工作量减少75%
- 实现装配过程全追溯
关键改进点:
- 采用动态ROI机制,先定位螺栓孔再检测
- 增加扭矩传感器数据融合判断
- 开发异常样本自动收集功能
