工业质检实战:基于YOLOv5的钢材缺陷检测全流程解析
在工业制造领域,钢材表面缺陷检测是质量控制的关键环节。传统人工检测方式效率低下且容易疲劳,而计算机视觉技术为这一难题提供了创新解决方案。本文将手把手带您完成从数据集准备到模型部署的完整流程,特别针对工厂技术员和初学者的实际需求设计,避开那些官方文档不会告诉你的"坑"。
1. 项目准备与环境搭建
工欲善其事,必先利其器。在开始钢材缺陷检测项目前,需要做好以下基础准备工作:
开发环境推荐配置:
- 操作系统:Windows 10/11 或 Ubuntu 18.04+
- GPU:NVIDIA GTX 1660及以上(需支持CUDA)
- Python:3.8.x(这是与YOLOv5兼容性最好的版本)
- PyTorch:1.9.0+cu111(需与CUDA版本匹配)
注意:如果使用较新的RTX 30/40系列显卡,建议安装CUDA 11.3及以上版本以避免兼容性问题
安装核心依赖包的推荐命令:
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install yolov5 # 这会安装ultralytics维护的YOLOv5官方包常见环境问题解决方案:
- CUDA out of memory:降低batch-size或减小输入图像尺寸
- DLL load failed:检查CUDA和cuDNN版本是否匹配
- OpenCV无法导入:尝试
pip install opencv-python-headless
2. 数据集处理与标注转换
NEU-CLS数据集是钢材表面缺陷检测的基准数据集,包含六类常见缺陷:
- 裂纹 (Crazing)
- 夹杂 (Inclusion)
- 麻点 (Pitted Surface)
- 划痕 (Scratches)
- 氧化皮 (Rolled-in Scale)
- 斑块 (Patches)
数据集处理全流程:
- 下载原始数据集(通常为VOC格式的XML标注文件)
- 创建目录结构:
NEU-DET/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/ - 使用以下Python脚本将XML转换为YOLO格式的TXT:
import xml.etree.ElementTree as ET import os def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def convert_annotation(xml_file, output_dir): tree = ET.parse(xml_file) root = tree.getroot() txt_file = os.path.join(output_dir, os.path.splitext(os.path.basename(xml_file))[0] + '.txt') with open(txt_file, 'w') as f: for obj in root.iter('object'): cls = obj.find('name').text cls_id = class_names.index(cls) xmlbox = obj.find('bndbox') b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text)) bb = convert((width, height), b) f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')3. 模型配置与训练技巧
YOLOv5提供了多种预训练模型,对于钢材缺陷检测这种相对简单的任务,推荐使用yolov5s模型:
| 模型类型 | 参数量(M) | 推理速度(FPS) | 适用场景 |
|---|---|---|---|
| yolov5n | 1.9 | 120+ | 边缘设备 |
| yolov5s | 7.2 | 90 | 入门推荐 |
| yolov5m | 21.2 | 60 | 平衡型 |
| yolov5l | 46.5 | 30 | 高精度 |
data.yaml配置示例:
train: ../NEU-DET/images/train val: ../NEU-DET/images/val nc: 6 names: ['Crazing', 'Inclusion', 'Pitted', 'Scratches', 'Scale', 'Patches']关键训练参数优化建议:
- batch-size:根据GPU显存调整(8GB显存建议8-16)
- img-size:钢材缺陷通常较小,建议640或更高
- epochs:100-300(观察验证集指标变化)
- optimizer:SGD比Adam更适合小数据集
启动训练的命令示例:
python train.py --img 640 --batch 16 --epochs 150 --data data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name steel_defect4. 模型评估与性能优化
训练完成后,在runs/train/steel_defect目录下会生成关键结果文件:
- results.png:损失函数和指标变化曲线
- confusion_matrix.png:各类别识别混淆矩阵
- val_batchX_labels.jpg:验证集预测示例
常见性能问题及解决方案:
漏检率高:
- 增加正样本数量
- 降低conf-thres(如从0.5降到0.3)
- 使用更小的anchor boxes
误检率高:
- 增加负样本(无缺陷图像)
- 提高conf-thres(如从0.5到0.7)
- 使用更大的训练集
小目标检测效果差:
- 增大输入图像尺寸(从640到1280)
- 使用FPN结构更强的模型(如yolov5m)
- 尝试添加小目标检测层
模型剪枝与量化(适用于部署到边缘设备):
from yolov5 import export # 导出ONNX格式 export.export(weights='runs/train/steel_defect/weights/best.pt', imgsz=(640,640), format='onnx', dynamic=True) # 量化模型 export.quantize(onnx_model='best.onnx', calib_data='datasets/NEU-DET/images/val')5. 生产环境部署方案
根据不同的应用场景,YOLOv5模型有多种部署方式:
1. 本地Python环境部署
最简单的检测脚本示例:
import yolov5 # 加载模型 model = yolov5.load('runs/train/steel_defect/weights/best.pt') # 设置参数 model.conf = 0.6 # 置信度阈值 model.iou = 0.45 # NMS IoU阈值 # 检测图像 results = model('test.jpg') # 显示结果 results.show() # 保存结果 results.save('output/')2. 工业相机实时检测方案
使用OpenCV捕获视频流:
import cv2 from yolov5 import YOLOv5 model = YOLOv5('best.pt') cap = cv2.VideoCapture(0) # 0为默认摄像头 while True: ret, frame = cap.read() if not ret: break # 推理 results = model.predict(frame) # 绘制结果 annotated_frame = results.render()[0] cv2.imshow('Steel Defect Detection', annotated_frame) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()3. 边缘设备部署优化
对于树莓派等边缘设备,建议:
- 使用TensorRT加速
- 将模型量化为FP16或INT8
- 降低输入分辨率(如从640到320)
- 使用更轻量级的yolov5n模型
实际项目中,我们在某钢铁厂部署的检测系统达到了:
- 检测速度:45FPS(RTX 3060)
- 平均精度:98.2%(mAP@0.5)
- 最小缺陷尺寸:3mm×3mm(在4K图像中)