1. 项目概述:当YOLO遇上钢铁质检
在钢铁生产线上,每分钟都有数十米长的钢材高速通过检测区域。传统人工质检员需要紧盯流水线8小时,漏检率高达15%-20%。我们团队开发的这套基于YOLO系列的钢材表面缺陷检测系统,用深度学习实现了7×24小时毫秒级识别,将漏检率控制在3%以内。
系统采用YOLOv5s作为核心检测框架,配合PySide6开发的工业级GUI界面,支持实时显示检测结果并生成质检报告。特别针对钢材表面特有的划痕、凹坑、氧化斑等6类缺陷进行了模型优化,在K230边缘计算盒上实现了30FPS的检测速度,完全匹配产线传输带2m/s的运行需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心需求解析
2.1 工业场景的特殊挑战
钢铁生产环境存在三大检测难点:
- 反光干扰:热轧钢材表面存在金属光泽,普通摄像头拍摄易产生过曝
- 缺陷尺度差异大:从毫米级的细微划痕到厘米级的压痕需要同时检测
- 实时性要求:生产线不停机检测,从拍摄到报警必须在50ms内完成
我们通过以下方案应对:
- 采用200万像素工业相机搭配偏振滤镜,消除80%以上的反光干扰
- 设计多尺度特征融合网络,在YOLO的Head部分增加P2小目标检测层
- 使用TensorRT加速推理,将检测耗时压缩到28ms/帧
2.2 技术选型对比
| 方案 | mAP@0.5 | 推理速度(FPS) | 模型大小(MB) |
|---|---|---|---|
| Faster RCNN | 0.82 | 12 | 180 |
| SSD512 | 0.79 | 25 | 95 |
| YOLOv5s | 0.85 | 48 | 14 |
最终选择YOLOv5s因其在精度和速度的最佳平衡,且便于部署到边缘设备。实测在Intel NUC11上处理1920×1080图像仅需21ms,满足产线实时性要求。
3. 系统实现细节
3.1 数据准备关键点
钢材缺陷数据集构建要注意:
- 样本均衡:六类缺陷的样本比例控制在1:1±0.2
- 数据增强:
- 添加高斯噪声模拟工业环境
- 随机调整gamma值模拟不同光照
- 采用mosaic增强提升小目标检测能力
- 标注规范:使用LabelImg标注时,box要完全包裹缺陷边缘,特别是对于氧化斑这类模糊缺陷
我们收集了15,000张带标注的钢材图像,通过旋转、镜像等操作扩充到45,000张训练样本。典型数据分布如下:
python复制dataset_stats = {
"scratch": 7521,
"dent": 6983,
"oxidation": 7234,
"inclusion": 6812,
"roll_mark": 7105,
"pitting": 6545
}
3.2 模型训练技巧
在YOLOv5s基础上进行三项改进:
- 自适应锚框计算:
python复制python train.py --data steel.yaml --cfg yolov5s.yaml --hyp hyp.steel.yaml --batch 64 --epochs 300 --img 640 --device 0 --noval --evolve
使用遗传算法优化anchor box,得到更适合钢材缺陷的9组锚点:
code复制anchors:
- [4,5, 8,10, 13,16] # P2/4
- [19,24, 33,27, 42,39] # P3/8
- [56,57, 88,79, 134,97] # P4/16
- 损失函数优化:
在CIoU Loss基础上增加小目标权重系数:
python复制def compute_loss(pred, targets, model):
# 小目标权重增强
small_obj_mask = targets[..., 4] < 0.01 # 缺陷面积占比<1%
bbox_loss_scale = 2.0 - 1.0 * small_obj_mask.float()
...
- 部署优化:
使用TensorRT量化时要注意:
bash复制python export.py --weights yolov5s.pt --include engine --device 0 --half
- FP16量化可使模型缩小50%
- 但要注意某些边缘设备(如Jetson Nano)需要额外校准
4. 软件系统实现
4.1 PySide6界面设计
采用MVC架构实现:
python复制class DetectionThread(QThread):
result_ready = Signal(np.ndarray, list)
def run(self):
while self._running:
frame = camera.capture()
results = model(frame)
self.result_ready.emit(frame, results)
class MainWindow(QMainWindow):
def __init__(self):
self.det_thread = DetectionThread()
self.det_thread.result_ready.connect(self.update_ui)
def update_ui(self, frame, results):
# 实时绘制检测框
painter = QPainter(self.video_label.pixmap())
for *xyxy, conf, cls in results:
x1, y1, x2, y2 = map(int, xyxy)
painter.setPen(QPen(Qt.red, 2))
painter.drawRect(x1, y1, x2-x1, y2-y1)
关键功能模块:
- 视频流显示(OpenCV + QLabel)
- 缺陷分类统计(PyQtChart)
- Excel报告生成(openpyxl)
- 声光报警控制(GPIO)
4.2 多相机支持方案
对于需要同时检测多个产线的场景:
python复制class MultiCameraManager:
def __init__(self, rtsp_urls):
self.cameras = [cv2.VideoCapture(url) for url in rtsp_urls]
self.buffer = Queue(maxsize=10)
def start_capture(self):
for i, cam in enumerate(self.cameras):
Thread(target=self._capture, args=(cam,i)).start()
def _capture(self, cam, cam_id):
while True:
ret, frame = cam.read()
if ret:
self.buffer.put((cam_id, frame))
使用线程池处理多路视频流时要注意:
每个线程绑定独立的YOLO模型实例,避免GIL锁导致的性能下降
5. 部署优化实践
5.1 边缘设备适配
在勘智K230上的部署步骤:
bash复制# 转换模型格式
python tools/converter.py --config yolov5s_steel.json --target k230
# 部署测试
./k230_bin --model yolov5s_steel.kmodel --input_size 640
优化技巧:
- 使用AIPP预处理替代传统normalize
- 开启双NPU核并行计算
- 将检测结果通过RTL8189FS WiFi模块回传
5.2 产线实际效果
在某钢厂热轧产线的测试数据:
| 指标 | 人工质检 | 我们的系统 |
|---|---|---|
| 平均漏检率 | 18.7% | 2.3% |
| 单卷钢检测耗时 | 90s | 22s |
| 日均缺陷检出量 | 127 | 209 |
系统特别在以下场景表现突出:
- 检测出0.3mm以下的细微划痕(人工易忽略)
- 识别氧化斑与正常水渍的差异(准确率92%)
- 在钢卷端面检测中实现360°无死角覆盖
6. 常见问题解决
6.1 典型错误排查
- 检测框抖动问题
现象:同一缺陷在不同帧的bbox位置波动大
解决方法:
yaml复制# 在track.yaml中调整
smooth_box: 0.7 # 框位置平滑系数
min_new_tracks: 3 # 最小连续帧数
- 误检金属反光
现象:将光斑识别为氧化缺陷
优化方案:
- 在数据增强中添加模拟反光样本
- 增加检测置信度阈值到0.65
- 使用HSV色彩空间过滤高亮度区域
6.2 模型调优记录
某次调参过程:
python复制# hyp.steel.yaml 关键参数
lr0: 0.0032 # 初始学习率
lrf: 0.12 # 最终学习率
momentum: 0.843
weight_decay: 0.00036
warmup_epochs: 3.2
调整策略:
- 先用大学习率(0.01)快速收敛
- 在第100epoch后降至1/10
- 最后50epoch使用cosine衰减
这个方案使mAP@0.5从0.81提升到0.86,特别是对小目标检测提升明显。
7. 工程经验总结
在实际部署中,有几个教科书不会告诉你的细节:
-
相机安装角度:最佳倾角为45°±5°,能同时捕捉表面和边缘缺陷。我们通过3D打印定制支架解决了安装位受限问题。
-
光照补偿:在轧机出口处安装6500K色温的LED补光灯,将环境光照稳定在800±50lux,使图像信噪比提升40%。
-
模型热更新:采用双模型交替加载机制,支持不停机更新:
python复制class ModelSwitcher:
def __init__(self):
self.models = [load_model(), None]
self.current = 0
def switch(self, new_weights):
self.models[1-self.current] = load_model(new_weights)
self.current = 1 - self.current
这套系统目前已在三家钢厂稳定运行超过6个月,最关键的收获是:工业AI项目不能只追求算法指标,必须深入理解生产工艺。比如我们发现钢材表面温度变化会影响成像质量,后来通过添加红外测温模块动态调整曝光参数,使夏季高温期的检测稳定性提升了35%。
