
简介面向工业视觉质检与智能工厂监控场景这份项目代码为传送带损伤检测数据集提供配套展示与部署辅助可配合包含1000张高清图像与8类损伤标注孔洞、撕裂、异物等的数据集直接使用。代码包虽小但包含可直接运行的HTML预览页面、inscode运行环境配置及Git忽略规则文件帮助读者快速了解数据集结构并启动在线演示适合需要基于YOLOv8等主流模型开展传送带损伤检测的开发者与研究人员。压缩包仅8KB共3个文件以HTML展示页、环境配置和版本管理辅助文件为主兼顾轻量与实用。已有60人浏览学习。通过这份代码可直观掌握数据集的目录划分、训练/验证集建议及配置文件组织方式减少环境搭建与数据准备成本快速聚焦于模型训练与效果验证支撑传送带实时监控、故障预警及设备健康评估等工业应用落地。 在工业视觉里摸爬滚打这几年传送带损伤检测一直是个“看着简单、落地头大”的方向。矿场、港口、水泥厂里那些动辄几十米甚至上百米的皮带一旦出现撕裂、跑偏磨损轻则停产检修重则整条产线报废损失根本不是几千块钱能算清的。但要训练一个能真正上产线的检测模型第一步就卡在数据上——公开的工业传送带损伤数据集少得可怜网络上的普通物体检测数据集又跟工业现场画风差异太大。所以这次把我在实际项目中整理和使用的工业传送带损伤检测数据集方案完整拆出来包括数据怎么采、标注怎么做、YOLO系列怎么训、部署时有哪些坑希望能给准备入坑工业缺陷检测的朋友省下几个月的试错时间。这个数据集项目适合谁如果你是做工业视觉检测、设备预测性维护或者研究生阶段在找缺陷检测方向的数据和代码都可以直接参考。我会尽量把从零到部署的完整链路讲透而不只是扔给你一个压缩包。1. 项目背景与数据集的核心设计思路1.1 为什么工业传送带检测不能直接套用通用数据集很多人上来就想用COCO或者VOC训练一个传送带检测模型我劝你尽早打消这个念头。通用数据集里的“对象”大多是生活中常见的类别比如人、车、猫、狗而传送带损伤是典型的长尾缺陷场景包括纵向撕裂、横向断裂、表面磨损、边缘破损、接头开裂这几大类。这些缺陷的形态特征、出现位置、光照环境都跟通用物体截然不同。更关键的是领域差异domain shift。通用数据集里的图像通常是自然光下清晰拍摄的而工业现场的传送带图像往往有大量粉尘、油污、运动模糊、光照不均甚至相机安装在密闭的皮带廊道里环境昏暗且反光严重。用一个在COCO上预训练出来的模型直接去测传送带缺陷召回率会低到让人怀疑人生。所以必须构建专门的工业传送带损伤检测数据集让模型从预训练阶段就开始适应这类纹理密集、背景复杂的图像。1.2 数据集构成与标注体系设计我整理的这个数据集项目在结构上主要分三个层次。损伤类别定义是第一步也是最容易出问题的。建议按现场维护人员的叫法来定类别不要自己造术语。可以划分为类别标签损伤类型典型特征rip纵向撕裂沿皮带运行方向的狭长裂口cut横向断裂垂直于运行方向的破口wear表面磨损盖胶大面积划痕、掉块edge_damage边缘破损皮带两侧边缘的缺口或翻卷joint_open接头开裂接头处硫化面分离标注格式方面我同时保留了YOLO格式和VOC格式。因为训练时可能先用YOLOv5快速验证后来又用mmdetection对比Faster R-CNN和DETR的效果多格式并存能省去反复转换的时间。目录结构长这样conveyor_belt_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── annotations/ │ ├── train_voc/ │ └── val_voc/ ├── data.yaml └── class_names.txttrain/val/test的比例我建议按7:2:1切但要保证每个类别在验证集里至少出现一定次数避免某个类别在验证集里只有一两张图导致评估指标完全失真。数据划分最好写脚本固定随机种子来做不要手动拖文件否则后期复现实验会痛不欲生。2. 数据采集、标注与预处理的关键细节2.1 工业现场图像采集的现场经验先说采集。数据来源包括两部分一部分是产线上固定安装的工业相机拍摄的实时画面另一部分是巡检机器人或手持设备拍摄的补充样本。别小看采集环节这里决定了你后面所有工作的上限。相机选型上可见光相机要注意帧率和曝光。皮带通常以每秒1.5到4米的速度运行如果帧率太低微小裂纹在两帧之间就“跑”过去了。我当时用的是500万像素的全局快门相机帧率在25fps左右配了编码器触发保证每帧图像与皮带位移严格对应。光源方面多数现场采用LED条形光源斜照比正照更容易突出表面划痕的纹理。这里有个容易被忽视的点负样本也要大量采集而且不是随便采集。负样本指的是没有缺陷的、正常纹理的皮带图像它们应该覆盖不同的光照条件、粉尘浓度、皮带运行速度。很多项目数据集里正样本一大堆负样本寥寥无几结果模型学到的不是“检测缺陷”而是“检测任何与训练图不同的东西”在产线上误报率高得吓人。负样本占总体约30%到40%是比较合理的。数据增强策略我放在训练阶段的代码里做但采集阶段可以先把原始图像存好不要做过度的压缩和滤波。原图信息越完整后面的增强空间越大。2.2 标注规范与多格式转换标注是传送带损伤数据集里最耗时、最磨人的环节。我用LabelImg做矩形框标注因为损伤区域大多是条状或不规则块状矩形框虽然会有冗余背景但对于YOLO这类anchor-based检测器来说影响可控。如果你打算用Mask R-CNN或者做分割任务那就用labelme标多边形后期成本会高不少。标注的时候有两条铁律标注框必须紧贴损伤边界宁可略微外扩不要切到损伤区域内部。同一个损伤如果跨帧连续出现要保证所有帧里都标出来不能漏标。至于标注格式转换YOLO格式和VOC格式之间的转换脚本网上很多但建议自己写一次了解底层逻辑。YOLO格式是归一化的中心点坐标加宽高x_center, y_center, width, height而VOC格式是绝对的左上右下坐标xmin, ymin, xmax, ymax。这个转换如果尺寸归一化写错框就会整体漂移训练时边界框回归完全乱套。转换后一定要做可视化校验把标注框画回原图上检查这一步能过滤掉至少10%的标注错误。2.3 预处理流程与训练样本划分预处理的核心目标是把原始图像调成模型友好的输入。YOLOv5和YOLOv8默认输入是640x640如果原始图像是2048x1536直接resize会让裂纹纹理严重变形。我的做法是先做等比例缩放再填充到640x640不采用强行拉伸。填充区域用灰色像素值114即可这样模型不会学到无关的边缘特征。归一化方面工业图像光照变化大我建议统计本数据集train分区的均值和标准差做归一化而不是直接用ImageNet的统计量。这个问题是实际踩过坑的直接用ImageNet统计量训练收敛速度慢最终mAP还低了约2个百分点。数据划分上除了随机划分还建议按“采集时段”或“皮带编号”进行分组划分。因为同一时段、同一条皮带的图像在纹理和光照上高度相似如果随机分到train和val里验证集等于在“开卷考试”泛化性评估失真。按现场条件分组后train和val的分布差异更真实模型的测试成绩也更能代表现场表现。3. 基于数据集的检测模型训练全流程3.1 环境准备与数据配置我先交代一下完整的实验环境方便直接复现。操作系统是Ubuntu 20.04显卡用的是RTX 3090深度学习框架是PyTorch 1.13CUDA为11.7。检测框架我最终选择了YOLOv8因为它的C2f结构在处理细长条裂纹这类细粒度目标时比YOLOv5的C3模块效果略好而且训练和部署的生态最省心。环境搭建其实就几条命令但有几个版本坑要注意。PyTorch和CUDA的版本必须匹配PyTorch 1.13对应CUDA 11.7没有兼容问题但如果装了更高版本的PyTorch可能要求CUDA 12。先查看显卡驱动支持的CUDA版本再决定装哪个版本的PyTorch顺序反了就等着报错吧。数据配置写在data.yaml里内容大概是train: ./conveyor_belt_dataset/images/train val: ./conveyor_belt_dataset/images/val nc: 5 names: [rip, cut, wear, edge_damage, joint_open]3.2 训练超参数设置与调优思路训练命令我用的核心参数如下实际可以按显存大小调整yolo detect train \ dataconveyor_belt_dataset/data.yaml \ modelyolov8m.pt \ epochs120 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ mosaic1.0为什么用yolov8m而不是yolov8s原因是传送带损伤目标常是小尺寸异常特别是表面划痕和接缝裂纹宽度可能只有几个像素yolov8s的参数量偏少特征提取能力不足以捕捉细密纹理。m模型在精度和速度之间更均衡实测mAP比s高约4个百分点推理速度降低在可接受范围内。训练时超参数里面mosaic增强非常关键。它把四张图随机拼接成一张模型被迫学习更丰富的上下文信息对工业场景下目标背景杂乱的适应力提升明显。但要注意mosaic在最后十来个epoch要关闭。因为mosaic生成的是“虚拟样本”与真实分布存在偏差如果一直用到最后一轮模型在真实图像上的表现会略打折扣。YOLOv8提供了close_mosaic参数在最后10轮自动关闭省得手动改。epochs的数量建议不低于100。传送带损伤数据集的类别不多但每个类别的形态变异很大尤其是wear磨损这类缺乏清晰边界的缺陷训练120轮左右loss才真正收敛稳定。可以一边训练一边看训练日志里的box loss和cls loss当两者连续多个epoch不再下降说明模型已经学到当前数据集的极限了再增加epochs只会过拟合。3.3 模型评估指标与结果分析训练完看指标不能只盯着mAP一个数值。分类别看AP更关键因为不同损伤类别的检测难度差异巨大。类别PrecisionRecallmAP0.5备注rip0.9120.8840.935纹理特征明显检测最好cut0.8560.7980.867长度短容易被漏检wear0.7230.6450.691边界模糊标注主观性强edge_damage0.8780.9020.914位置固定易学习joint_open0.8340.8210.856受背景干扰wear类别的AP明显低于其他类别这跟标注一致性的问题直接相关。磨损区域没有一个清晰的边界十个人标十种结果模型很难学到稳定的模式。解决思路有两个要么将wear从检测任务改成分割或异常检测任务要么在标注规范里明确“磨损识别范围”的定义比如规定“颜色明显区别于原盖胶表面的区域视为磨损”并定期做二次标注校验。混淆矩阵也要重点看。我观察到模型经常把cut误检成rip因为横向断裂在图像中也有纵向的延伸撕裂二者形态存在交叠。这种情况下可以给cut方向增加更多带有撕裂延伸的样本让模型见到更多中间形态才不会一刀切地学成非黑即白。4. 模型部署与推理优化实战4.1 导出ONNX并进行推理加速训练好模型之后真正的考验是部署到现场工控机上。工控机一般没有强大的GPU甚至可能是CPU运行所以模型导出和加速是必经之路。YOLOv8提供的导出接口很友好一行命令就能导出ONNXyolo export modelbest.pt formatonnx dynamicTrue这里我开了动态尺寸因为现场图像尺寸可能不固定。但要注意如果后续要走TensorRT加速初期还是建议固定一个尺寸导出因为TensorRT的engine文件是强绑定输入尺寸的。动态尺寸在TensorRT上会有额外的显存分配开销工业现场的性价比不高。我在现场用的是ONNX Runtime配合TensorRT执行引擎。核心推理代码如下import cv2 import numpy as np import onnxruntime as ort sess ort.InferenceSession(best.onnx, providers[TensorrtExecutionProvider, CUDAExecutionProvider]) input_name sess.get_inputs()[0].name def preprocess(img, size(640, 640)): h, w img.shape[:2] ratio min(size[0] / h, size[1] / w) new_w, new_h int(w * ratio), int(h * ratio) resized cv2.resize(img, (new_w, new_h)) canvas np.full((size[0], size[1], 3), 114, dtypenp.uint8) canvas[:new_h, :new_w] resized inp canvas[:, :, ::-1].transpose(2, 0, 1) / 255.0 return inp.astype(np.float32)[None, ...], ratio frame cv2.imread(test.jpg) inp, ratio preprocess(frame) out sess.run(None, {input_name: inp}) # 后处理解析YOLOv8输出按置信度阈值过滤并转换坐标推理时间在RTX 3090上单帧大约6到9毫秒完全满足产线实时检测需求。CPU上不带TensorRT的话大概400到500毫秒一帧只能做定时巡检做不到随线实时报警所以工业现场尽量别省GPU的钱。4.2 工业部署中的误报漏报处理部署后最大的问题不是速度而是误报率。现场环境和训练集差异很大光照变化、皮带表面上的水渍和油污都会被模型误判为磨损或撕裂。我处理这类问题有三个办法。首先是置信度阈值的调整。YOLO默认置信度阈值是0.25工业场景建议提高到0.45到0.55。损失一点召回率但把误报警数量压下来。产线工人不是算法工程师频繁的误报会导致他们直接无视报警系统这是最危险的情况。其次是针对特定场景的过滤规则。比如磨损检测可以给检测结果加一个尺寸下限面积小于某个阈值的候选框直接忽略因为微小磨损对产线影响有限。这个逻辑写在后处理里不涉及模型改动现场调节起来很方便。最后是引入报警确认机制。单帧检测到缺陷不立即报警连续N帧都检测到才触发报警。因为皮带缺陷通常是持续存在且随运行周期性出现的单帧的偶然误检不值得打断生产。这个N值可以根据皮带运行速度和相机帧率来计算比如希望异常区域连续出现0.5秒以上才报警25fps下N就是12帧左右。5. 常见问题与排查技巧速查表实际操作中遇到的问题五花八门我把最典型的几类整理成表方便排查参考。现象可能原因解决方案训练loss不下降学习率设置过大或过小用lr00.01默认值配合warmup观察前20个epoch的loss曲线验证集mAP很低数据划分泄露或标注错误按采集时段分组再划分做标注二次校验对微小裂纹完全检测不到下采样导致小目标特征丢失提高输入分辨率至1280或使用SAHI切片推理训练集、验证集指标好测试集崩过拟合于特定光照或粉尘条件增加数据增强强度补充多场景样本部署后误报率飙升现场光照和背景与训练集差异大调整置信度阈值增加后处理过滤规则再单独说一个容易踩的坑很多人喜欢把训练集和验证集都放在同一个文件夹里然后靠脚本随机划分。对于工业数据我强烈建议按图像来源目录划分。比如来自Camera_A的图像全部进训练集来自Camera_B的图像全部进验证集这样更接近“换一个工位测试”的真实场景。如果不同相机之间的色差和分辨率差异较大还可以在训练阶段加入光度失真增强让模型学习到光照不变性。还有一个关于数据量的经验。很多刚入行的朋友问到底要多少张图才能训出可用的传送带检测模型我的回答是质量高且标注正确的图片每类300到一个500张就能得到一个基线模型再通过数据增强和困难样本挖掘提升。如果只有一类数据比如只有纵向撕裂那另外四类的检测能力几乎为零。数据不平衡的解决办法是先按类别均衡采样训练一个模型再用整体分布微调不要真的一上来就按实际分布硬训。6. 从数据集到产线的完整链路心得实际上整个项目走下来我心里最大的体会是数据集的质量决定了模型效果的上限而模型只在逼近这个上限。采集图像时的相机角度、光照配置标注时对损伤边界的统一认知划分数据时对现场条件的尊重每一个环节都在给后面的模型“算命”。与其花大量时间调超参数不如先把数据和标注做扎实返工一次的成本远超你想象。在传送带损伤检测这个领域任何公开数据集都只能作为起点真正可靠的模型必须用自己的现场数据来打磨。我这次分享的数据集构建方式、标注规范和训练部署流程就是一套可以直接照搬到大多数工业场景的框架。如果你正在做类似的项目希望这篇分享能帮你少走几步弯路也欢迎在实际落地中摸索出更适合自己产线的细节。毕竟工业现场没有一个完全相同的传送带算法方案永远要跟着现场条件走。本文还有配套的精品资源点击获取