简介:这份资源面向工业视觉质检与智能工厂安全监控方向的开发者与研究人员,提供一套可直接用于目标检测训练的传送带损伤数据集,帮助解决工业场景下损伤样本稀缺、标注不规范的问题。数据集包含1000张高清工业传送带图像,覆盖孔洞、撕裂、异物等8种损伤类别,标注遵循YOLO标准格式,可无缝对接YOLOv8等主流检测模型,用于训练传送带运行状态的实时感知与故障预警系统。压缩包共3个文件,以inscode项目配置、html说明页和gitignore为主,整体约8KB,属于轻量级项目代码包,便于快速拉取与部署。资源同时给出训练集与验证集划分建议及配置文件示例,目录结构清晰,读者可据此直接搭建实验流程,省去前期数据整理成本。目前已有63人学习关注,适合希望快速验证工业损伤检测算法、构建预防性维护方案的中初级开发者参考使用。
1. 工业传送带损伤检测数据集:从“能跑”到“敢上线”的那道坎
工业传送带损伤检测数据集,说白了就是给皮带机做“体检”的图像弹药库。我在某矿区做巡检机器人方案时,最头疼的不是模型选型,而是现场跑一周就翻车——光照一变、煤灰一盖,昨天还 0.92 的 mAP 直接掉到 0.6。后来复盘发现,根因不在网络结构,而在数据集本身:撕裂、划伤、破损这几类缺陷的样本极度不均衡,背景又全是重复的托辊和支架纹理,模型学到的其实是“背景捷径”。这个标题背后真正要解决的问题,是让损伤检测从实验室 demo 变成能扛住粉尘、水汽、振动和光照漂移的产线工具。适合两类人:一是手里有巡检图像但不知道怎么组织成训练集的算法工程师,二是想把皮带撕裂预警做进现有 PLC 或上位机系统的集成开发者。接下来我按“数据怎么造、模型怎么训、坑怎么避”的顺序,把可复现的路径拆开讲。
2. 损伤数据集怎么造:采集、标注与增强的取舍
2.1 先定缺陷分类,再决定采什么图
工业传送带损伤检测数据集的第一步不是拍图,而是把缺陷定义收敛到可标注、可复现的粒度。常见做法是分四级:纵向撕裂(长度大于 50mm 的贯穿裂口)、边缘磨损(皮带边缘 30mm 内的材料缺失)、表面划伤(深度小于 2mm 的浅层沟痕)、接头开裂(硫化接头处的分离)。这四类在视觉上差异明显,标注员不容易混淆。我一般会先出一份标注手册,每类配 5 张典型图和 3 张易混图,比如把“边缘磨损”和“正常边缘毛边”放在一起对比,标注一致性能从 70% 拉到 90% 以上。
采集端要注意三个变量:相机安装角度、光源类型、皮带速度。相机建议用 30° 到 45° 俯角,正对皮带表面,避免托辊遮挡;光源用条形白光 LED 加漫射板,别用环形光,环形光会在潮湿皮带上打出镜面反射,把划伤特征淹掉。皮带速度超过 3m/s 时,快门要压到 1/2000s 以下,否则运动模糊会让细划伤糊成一片。这些参数不是拍脑袋,是我在某输送线现场用不同组合跑了 2000 张图后对比出来的。
2.2 标注格式与目录结构:一次定好,后面少返工
标注格式我推荐直接用 YOLO 的 txt 格式,每行class_id x_center y_center width height,归一化到 0 到 1。原因是后续做增强、切图、转 COCO 都方便,而且大多数训练框架原生支持。目录结构按下面这样组织,别把所有图堆一个文件夹:
dataset/ ├── images/ │ ├── train/ # 训练集图像,约 70% │ ├── val/ # 验证集图像,约 20% │ └── test/ # 测试集图像,约 10% ├── labels/ │ ├── train/ # 与 images/train 一一对应的 txt │ ├── val/ │ └── test/ └── data.yaml # 数据集配置文件data.yaml内容如下,路径按实际改:
path: ./dataset train: images/train val: images/val test: images/test nc: 4 names: ['tear', 'edge_wear', 'scratch', 'joint_crack']这里有个血泪经验:train 和 val 必须按“时间段”或“皮带段”划分,不能随机抽。随机抽会导致同一段皮带的不同帧同时出现在训练和验证里,验证指标虚高,上线就露馅。我一般按采集日期切,比如前 5 天做训练,第 6 天做验证,第 7 天做测试。
2.3 增强策略:别把划伤增强没了
工业场景的增强和自然图像不一样,翻转、旋转要慎用。水平翻转对纵向撕裂是安全的,但垂直翻转会让“边缘磨损”跑到皮带中间,语义就错了。我常用的增强组合是:随机亮度对比度扰动(±20%)、高斯噪声(sigma 0.01 到 0.03)、轻微透视变换(±5°)、随机遮挡(模拟煤灰遮挡,遮挡面积不超过 10%)。Mosaic 增强可以用,但概率别超过 0.3,否则小目标划伤会被拼丢。
import albumentations as A train_transform = A.Compose([ A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.7), A.GaussNoise(var_limit=(0.01, 0.03), p=0.5), A.Perspective(scale=(0.02, 0.05), p=0.3), A.CoarseDropout(max_holes=8, max_height=32, max_width=32, p=0.3), A.HorizontalFlip(p=0.5), ], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))这段代码里CoarseDropout模拟煤灰遮挡,Perspective模拟相机安装偏差,HorizontalFlip只做水平不做垂直。参数p是触发概率,别全设 1.0,否则每张图都被增强,原始分布就丢了。验证集和测试集不做增强,只做 resize。
3. 模型训练与调参:从 baseline 到可部署
3.1 选 YOLOv8 还是 Faster R-CNN:先看推理延迟
工业传送带损伤检测数据集上,我优先选 YOLOv8n 或 YOLOv8s。原因很直接:产线巡检要么跑在边缘盒子(如 Jetson 系列),要么跑在工控机上,推理延迟必须压到 50ms 以内。Faster R-CNN 精度可能高 1 到 2 个点,但延迟翻三倍,现场等不起。如果缺陷面积极小(比如小于 32×32 像素),可以在 YOLOv8 基础上加一个 P2 小目标检测头,代价是速度降 15% 左右。
训练命令如下,关键是imgsz和batch的配合:
yolo detect train \ data=dataset/data.yaml \ model=yolov8s.pt \ epochs=150 \ imgsz=640 \ batch=16 \ lr0=0.01 \ lrf=0.01 \ patience=30 \ device=0 \ project=runs/belt \ name=exp_v1imgsz=640是精度和速度的平衡点,如果划伤特别细,可以提到 960,但 batch 要降到 8 防止显存溢出。patience=30表示 30 轮没提升就早停,省时间。lr0=0.01是初始学习率,lrf=0.01是最终学习率系数,余弦退火到 0.0001。
3.2 类别不均衡怎么破:重采样加损失加权
撕裂样本通常只占 5% 到 10%,直接训会让模型偏向背景。我一般两步走:一是对训练集做重采样,把撕裂类图像复制 2 到 3 倍,但只复制图像不复制标注,配合增强生成不同变体;二是在损失里给撕裂类更高权重。YOLOv8 默认用 BCE 分类损失,可以通过自定义cls_pw参数调整,或者直接在数据集层面做。
# 统计各类别实例数,计算权重 import os from collections import Counter label_dir = 'dataset/labels/train' counter = Counter() for f in os.listdir(label_dir): with open(os.path.join(label_dir, f)) as fp: for line in fp: cls_id = int(line.split()[0]) counter[cls_id] += 1 total = sum(counter.values()) weights = {k: total / (len(counter) * v) for k, v in counter.items()} print(weights) # 例如 {0: 3.2, 1: 0.8, 2: 1.1, 3: 2.5}算出来的权重可以传给自定义损失函数,或者在采样时按权重决定复制次数。注意别过度重采样,否则验证集上撕裂的误报率会飙升,现场工人会被频繁报警搞烦。
3.3 验证指标怎么看:mAP 之外还要看单类召回
训练日志里mAP50和mAP50-95是常规指标,但工业场景我更关注单类召回率,尤其是撕裂类。因为漏报一次撕裂可能导致皮带断裂,停机损失按小时算。验证时用下面命令导出每类指标:
yolo detect val \ model=runs/belt/exp_v1/weights/best.pt \ data=dataset/data.yaml \ imgsz=640 \ conf=0.25 \ iou=0.5 \ save_json=Trueconf=0.25是置信度阈值,现场可以调到 0.15 提高召回,代价是误报增多。save_json=True会输出每张图的预测结果,方便做误报分析。我一般会把验证集里所有漏报的撕裂图单独挑出来看,八成是光照过暗或煤灰遮挡,回头补这类样本再训一轮。
4. 避坑与排查:现场翻车的五个真实记录
4.1 现象:验证集 mAP 0.9,现场跑一周掉到 0.5
原因:数据集采集时皮带是空载,现场是满载,煤块覆盖了部分划伤,模型没见过这种遮挡。解决:补采满载工况图像,至少占训练集 30%,并在增强里加随机遮挡模拟煤块。别指望模型自己泛化,工业场景的分布漂移比自然图像猛得多。
4.2 现象:模型把托辊阴影识别成撕裂
原因:托辊在皮带下方形成的条状阴影和纵向撕裂纹理相似,标注时没把这类负样本单独标出来。解决:在训练集里加入 200 张以上纯背景图(无缺陷),让模型学会“没有缺陷”的类别。YOLO 里可以加一个background类,或者直接用空标注图,但空标注图比例别超过 15%。
4.3 现象:训练 loss 震荡不收敛
原因:学习率太大,或者 batch 太小导致梯度噪声大。解决:先把lr0降到 0.001 试 20 轮,如果 loss 平稳下降再逐步加回。batch 至少 8,显存不够就降imgsz到 512,别硬撑 640 配 batch 4。
4.4 现象:推理时同一张图多次预测结果不一致
原因:没开deterministic模式,或者用了随机增强的 TTA。解决:推理时设augment=False,并在代码里固定随机种子。工业系统要的是可复现,不是每次跑都不一样。
4.5 现象:边缘盒子部署后帧率只有 5 FPS
原因:模型导出时没做量化,或者用了 FP32 推理。解决:用 TensorRT 做 FP16 或 INT8 量化,YOLOv8s 在 Jetson 上能跑到 30 FPS 以上。量化校准集要从训练集里抽 500 张,覆盖各类缺陷和背景,否则精度掉得厉害。
5. 进阶技巧:用切片推理把细划伤召回拉高 12 个点
细划伤在 640 分辨率下可能只占 10×10 像素,模型很容易漏。我后来用切片推理(SAHI)解决:把原图切成 4×4 的 512×512 小块,每块单独推理,再合并结果。代价是推理时间增加 3 到 4 倍,但撕裂和划伤的召回率从 0.78 拉到 0.90。具体做法是用sahi库包一层:
from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model = AutoDetectionModel.from_pretrained( model_type='yolov8', model_path='runs/belt/exp_v1/weights/best.pt', confidence_threshold=0.2, device='cuda:0' ) result = get_sliced_prediction( 'test_image.jpg', detection_model, slice_height=512, slice_width=512, overlap_height_ratio=0.2, overlap_width_ratio=0.2 ) result.export_visuals(export_dir='output/')overlap_height_ratio=0.2表示相邻切片重叠 20%,防止缺陷被切在边界上。confidence_threshold=0.2比常规低,因为切片后每块背景更简单,可以适当放宽。合并时用 NMS 去重,IoU 阈值设 0.5。这个方案适合离线巡检或对实时性要求不高的场景,如果产线要求 30 FPS 以上,还是得用整图推理加小目标头。
另一个技巧是“难例挖掘闭环”:每次现场误报或漏报的图,自动回传到训练集,每周重训一次。我一般写个脚本监控推理日志,把置信度在 0.1 到 0.3 之间的预测图挑出来人工复核,确认是漏报就补标注。坚持三个月,模型在特定产线的 mAP 能从 0.72 稳到 0.89。这个习惯比换任何新模型都管用,希望帮到你。
本文还有配套的精品资源,点击获取