1. 项目概述:基于YOLOv8的织物瑕疵检测实战
去年帮一家服装厂做质检系统升级时,我第一次接触到织物瑕疵检测这个细分领域。当时产线上每小时要处理3000多米布料,靠8个质检员用强光灯肉眼检查,不仅漏检率高,员工离职率更高——这活实在太费眼睛了。我们尝试用YOLOv8搭建的检测系统最终将漏检率从12%降到了3%以下,今天就把这套方法完整分享出来。
这个项目使用包含2115张图像的数据集,覆盖6种典型织物瑕疵(勾丝、污渍、破洞、纬斜、色差、跳线),同时提供JSON和YOLO两种标注格式。相比通用目标检测,织物瑕疵检测有三大特殊挑战:瑕疵区域通常只占图像的1%-5%、纹理背景干扰严重、同类瑕疵形态差异大。接下来我会详细拆解从数据准备到模型部署的全流程,重点分享我们在实际工业场景中验证过的调优技巧。
2. 数据集深度解析与预处理
2.1 数据集结构剖析
原始数据集包含以下关键文件:
code复制dataset/
├── images/
│ ├── train/ (1510张)
│ └── val/ (605张)
├── labels_json/ (COCO格式标注)
│ ├── train.json
│ └── val.json
├── labels_yolo/ (YOLO格式标注)
│ ├── train/
│ └── val/
└── class_names.txt
重要提示:虽然提供了两种标注格式,但YOLOv8训练时建议使用YOLO格式。COCO格式需要先用
ultralytics/data/converter.py转换,这个过程中容易丢失细小的瑕疵区域。
2.2 数据增强策略
针对织物检测的特殊性,我们采用分层增强方案:
-
基础增强(对所有样本应用):
- 随机旋转±15°(模拟布料进料时的轻微偏移)
- 亮度调整±20%(应对不同光照条件的产线)
- 高斯模糊σ=0.5(缓解相机对焦不准的情况)
-
针对小目标的增强(仅对瑕疵面积<3%的样本):
- 马赛克增强(4图拼接,提升小目标检出率)
- 随机裁剪(放大瑕疵区域占比)
- 复制粘贴(在合理范围内人工增加瑕疵密度)
python复制# 示例:YOLOv8的马赛克增强配置
train:
mosaic: 1.0 # 启用100%马赛克增强
mixup: 0.2 # 20%概率使用mixup
copy_paste: 0.5 # 50%概率使用复制粘贴
2.3 数据分布优化
原始数据统计显示"跳线"类占比仅4.7%,我们采用以下方法平衡:
- 过采样:对少数类样本应用更激进的增强
- 损失函数加权:在
loss.py中设置class_weights=[1.0, 1.0, 1.0, 1.5, 1.0, 2.0] - 难例挖掘:训练初期自动识别漏检样本,提高其采样概率
3. YOLOv8模型训练关键技巧
3.1 模型选型对比
我们在RTX 3060显卡上测试不同版本的推理速度与mAP:
| 模型 | 参数量 | 推理速度(ms) | mAP@0.5 | 适用场景 |
|---|---|---|---|---|
| YOLOv8n | 3.2M | 6.8 | 0.72 | 嵌入式设备 |
| YOLOv8s | 11.4M | 8.3 | 0.81 | 主流推荐 |
| YOLOv8m | 26.3M | 12.7 | 0.85 | 高精度要求 |
| YOLOv8l | 43.7M | 18.2 | 0.86 | 算力充足环境 |
实际项目中选用YOLOv8s,因其在精度和速度间取得最佳平衡。若部署到Jetson等边缘设备,可改用YOLOv8n并启用TensorRT加速。
3.2 关键训练参数
yaml复制# yolov8s-cloth.yaml
lr0: 0.01 # 初始学习率
lrf: 0.01 # 最终学习率(0.01*lr0)
momentum: 0.937 # SGD动量
weight_decay: 0.0005 # 权重衰减
warmup_epochs: 3 # 热身epochs
box: 7.5 # box损失权重
cls: 0.5 # 分类损失权重
dfl: 1.5 # DFL损失权重
调参经验:
- 将
box损失权重调高,因为瑕疵检测对定位精度要求更高 - 使用
cosine学习率调度器,配合warmup避免初期不稳定 - 早停机制设置为
patience=15,防止过拟合
3.3 小目标检测优化方案
针对织物瑕疵普遍较小的问题,我们进行以下改进:
-
特征图增强:
- 在Neck部分增加P2特征层(下采样4倍)
- 修改
model.yaml中的head部分:yaml复制head: - [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 上采样 - [[-1, -2], 1, Concat, [1]] # 拼接特征
-
Anchor调整:
- 使用k-means重新聚类anchors:
python复制from utils.autoanchor import kmean_anchors kmean_anchors(dataset='cloth.yaml', n=9, img_size=640) - 得到的新anchors:
yaml复制anchors: - [4,5, 8,10, 13,16] # P3/8 - [23,29, 43,55, 73,91] # P4/16 - [146,185, 231,300, 335,421] # P5/32
- 使用k-means重新聚类anchors:
-
损失函数改进:
- 将CIoU替换为WIoU(Weighted IoU),更关注小目标定位
- 在
loss.py中增加小目标权重系数:python复制def __call__(self, pred, targets): # 根据目标大小动态调整权重 area = (targets[:, 4] * targets[:, 5]).sqrt() weight = 0.5 + (area < 0.03).float() * 0.5 return (self.loss(pred, targets) * weight).mean()
4. 工业部署实战经验
4.1 模型轻量化方案
为适应产线工控机的有限算力,我们采用以下优化:
-
剪枝:
python复制from torch_utils.prune import prune_model model = prune_model(model, prune_ratio=0.3) # 剪枝30%通道 -
量化:
python复制model.export(format='onnx', dynamic=False, simplify=True, opset=12) !onnxruntime-tools quantize -m model.onnx -o model_int8.onnx -q uint8 -
TensorRT加速:
bash复制
trtexec --onnx=model.onnx --saveEngine=model.engine \ --fp16 --workspace=4096 --builderOptimizationLevel=3
4.2 部署架构设计
实际产线部署采用三级检测架构:
code复制工业相机 → 初筛模型(YOLOv8n) → 精检模型(YOLOv8s) → 人工复检
- 初筛模型运行在工控机(i5-1135G7),处理帧率可达45FPS
- 仅当初筛发现疑似瑕疵时,才触发精检模型(运行在T4服务器)
- 最终检出结果通过MQTT推送到质检工位显示屏
4.3 性能优化指标
在真实产线环境下的关键指标:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 推理延迟(ms) | 38 | 11 |
| CPU占用率(%) | 85 | 45 |
| 内存占用(MB) | 2100 | 680 |
| 漏检率(%) | 12.3 | 2.8 |
| 误检率(%) | 8.7 | 3.1 |
5. 常见问题与解决方案
5.1 训练过程问题排查
问题1:验证集mAP波动大
- 检查数据增强是否过于激进(特别是mixup)
- 降低学习率并增加
warmup_epochs - 尝试关闭马赛克增强(设置
mosaic=0)
问题2:某些类别始终检测不佳
- 检查标注质量:
python utils/annotations.py --check-labels - 对该类别样本应用过采样
- 在
loss.py中增加该类的分类权重
5.2 部署后性能下降
现象:测试集准确但产线漏检
- 检查光照条件是否与训练数据一致
- 采集产线样本进行领域适应训练(Domain Adaptation)
- 增加测试时的TTA(Test Time Augmentation)
现象:推理速度不达标
- 使用
trtexec生成FP16精度的TensorRT引擎 - 限制输入分辨率(不超过1280x720)
- 启用CUDA Graph优化:
python复制torch.backends.cudnn.benchmark = True torch.backends.cuda.graph_enabled = True
5.3 标注工具推荐
对于新增数据的标注,我们实测推荐:
- CVAT:适合团队协作,支持自动标注
- Label Studio:可定制化程度高
- Roboflow:云端一体化解决方案
对于织物瑕疵标注的特殊要求:
- 使用多边形标注(而非矩形框)精确覆盖不规则瑕疵
- 至少3人交叉验证标注结果
- 对模糊边界样本采用"probably_"前缀标记
6. 项目扩展方向
在实际落地后,我们又迭代了几个增强功能:
-
多光谱检测:
- 增加近红外相机(850nm波段)
- 训练多输入模型(RGB+IR)
- 对某些色差类瑕疵检出率提升17%
-
三维瑕疵检测:
- 配合线激光扫描仪获取深度信息
- 将高度差作为额外特征输入
- 特别适用于检测起毛球等立体瑕疵
-
时序分析:
- 对连续帧进行光流分析
- 检测瑕疵的扩展趋势
- 提前预警可能断裂的经线
这个项目让我深刻体会到,工业场景的AI落地不是简单跑通模型就完事了。从数据采集的规范性,到模型部署的实时性,每个环节都需要针对具体场景做深度优化。最近我们正在试验YOLOv9的新架构,初步结果显示在保持速度的同时,mAP还能再提升2-3个点。