拓冰建站拓冰建站
首页 / 资讯中心 / 正文

传送带异物检测:YOLOv11铁棍与垃圾识别实战与避坑指南

简介这份传送带异物检测识别数据集面向工业质检、智能矿山与自动化产线场景适合从事目标检测算法训练与落地的开发者、学生及工程人员使用可解决传送带运行过程中铁棍、垃圾等异物混入的自动识别问题为安全预警与分拣提供数据基础。资源包共211个文件包含105张jpg图像、105个同名txt标注文件以及1个yaml配置文件压缩包约4.68MB标注采用yolov11格式可直接接入YOLO系列训练流程yaml文件用于定义数据集路径与类别信息。图像取自监控视频抽帧覆盖不同时段与场景具备一定多样性。目前已有351人学习下载适合作为工业异物检测项目的入门与验证数据。读者可据此快速搭建训练与验证流程理解标注规范与类别设置并在此基础上扩展类别或补充样本用于模型微调与效果对比。1. 传送带异物检测为什么铁棍和垃圾混在一起时YOLOv11 反而更容易翻车在矿山、水泥、电力、港口这些行业的传送带场景里异物检测一直是个刚需。铁棍、螺栓、锚杆这类金属异物一旦卡进托辊或撕裂皮带轻则停机几小时重则整条输送线报废而塑料瓶、编织袋、木块这类垃圾异物虽然破坏力没那么直接但堆积在落料口会造成堵料同样影响生产节拍。很多团队第一反应是「上 YOLOv11把铁棍和垃圾一起标了训一个模型」听起来顺理成章实际做起来却经常翻车——铁棍细长、垃圾形状发散两类目标在特征空间里几乎不共享任何统计规律硬塞进一个检测头模型很容易在两者之间反复横跳。这篇笔记就围绕「传送带异物检测识别数据集可识别铁棍、垃圾使用 YOLOv11 格式标注」这个具体方向展开。我会把数据集怎么组织、YOLOv11 格式到底长什么样、训练参数怎么设、小目标铁棍为什么容易漏检、垃圾类内差异怎么处理以及从标注到推理落地的完整链路讲清楚。适合两类人看一类是手里已经有一批现场图片、想自己标数据训模型的工程师另一类是拿到别人给的数据集想快速验证能不能用、值不值得投入的算法同学。核心结论先放这儿铁棍和垃圾不是不能放一个模型但标注策略、anchor 匹配和损失权重必须分开对待否则你训出来的模型大概率是「铁棍漏一半、垃圾全糊成一团」。2. 从现场图片到 YOLOv11 数据集目录结构、标注格式与铁棍垃圾的标注边界2.1 传送带异物数据集的最小可用目录结构YOLO 系列的数据集组织方式这几年基本没变YOLOv11 沿用了同一套约定。一个能直接扔进训练脚本的目录长这样conveyor_foreign_object/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ └── ... │ ├── val/ │ │ ├── 000101.jpg │ │ └── ... │ └── test/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── 000001.txt │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... └── data.yaml关键点是 images 和 labels 必须严格镜像对应图片名和标签名只差扩展名。我见过太多人把标签全堆在一个 labels 文件夹里训练时找不到对应文件YOLOv11 会直接跳过那些样本你还在纳闷为什么 loss 不降。另外 test 集不是必须的但建议留 10% 左右用来做最终推理验证别拿 val 集当 test 用那是自欺欺人。2.2 YOLOv11 标注格式一行一个目标归一化坐标别写错YOLOv11 的标签格式是每张图一个 txt每行代表一个目标格式为class_id x_center y_center width height其中坐标全部是相对于图片宽高的归一化值范围 0 到 1。举个例子一张 1920×1080 的传送带图片铁棍的边界框左上角在 (800, 400)宽 600高 40那么0 0.5729 0.3889 0.3125 0.0370class_id 从 0 开始假设铁棍是 0垃圾是 1。这里有个血泪经验铁棍的 height 归一化后经常小于 0.05如果你用某些标注工具导出时没注意保留足够小数位四舍五入到两位小数铁棍的框直接变成 0.04 甚至 0.03训练时正样本匹配会非常不稳定。建议标注工具导出时至少保留 6 位小数或者自己写脚本后处理一遍。2.3 铁棍和垃圾的标注边界什么算一个目标什么算两个这是整个数据集质量的分水岭。铁棍好办一根铁棍就是一个框哪怕它被煤块遮了一半只要可见部分超过 30%就标一个框遮挡部分靠模型自己脑补。垃圾就麻烦了一个编织袋摊开在皮带上算一个目标还是按褶皱拆成几个我的做法是只要物理上是一个物体就标一个外接矩形哪怕它形状不规则、框里包含大量背景。因为 YOLOv11 是矩形框检测你拆得越碎模型越容易把同一类垃圾的不同部分当成不同目标推理时 NMS 一压反而漏检。另一个坑是铁棍和垃圾叠在一起。比如一根铁棍压着一个塑料袋这时候两个框都要标允许重叠。YOLOv11 的多标签分类损失能处理这种情况但你要确保标注时别把铁棍的框画到塑料袋上否则模型学到的就是「铁棍长得像塑料袋」。2.4 data.yaml 怎么写路径、类别数和类别名data.yaml 是训练入口内容不多但错一个字符就报错path: /data/conveyor_foreign_object train: images/train val: images/val test: images/test nc: 2 names: 0: iron_rod 1: garbagepath 是数据集根目录train/val/test 是相对路径。nc 是类别数names 可以用列表或字典YOLOv11 两种都认。注意 names 的顺序必须和标注里的 class_id 一致我见过有人标注时铁棍是 0yaml 里写反了训完模型把铁棍全认成垃圾现场调试时一脸懵。3. YOLOv11 训练传送带异物模型环境配置、关键参数与小目标铁棍的针对性调优3.1 环境配置CUDA、PyTorch 和 ultralytics 的版本对齐YOLOv11 通过 ultralytics 包调用环境配置的坑主要集中在 CUDA 和 PyTorch 版本匹配上。我一般用 conda 建一个干净环境conda create -n yolo11 python3.10 -y conda activate yolo11 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install ultralyticscu121 对应 CUDA 12.1如果你的驱动版本低换成 cu118。装完跑一句yolo checks确认 CUDA 可用、版本没冲突。别小看这一步我遇到过有人用 pip 默认源装了 CPU 版 PyTorch训练时 GPU 利用率 0%还以为是数据集太小。3.2 训练命令与关键参数imgsz、batch、epochs 怎么定一条典型的训练命令yolo detect train \ data/data/conveyor_foreign_object/data.yaml \ modelyolo11m.pt \ imgsz1280 \ epochs200 \ batch8 \ device0 \ workers8 \ projectruns/conveyor \ nameexp_iron_garbage逐个说参数。imgsz1280 是传送带场景的关键铁棍在 640 分辨率下可能只有几个像素宽直接消失。1280 能保留更多细节代价是显存翻倍batch 要相应降到 8 甚至 4。model 选 yolo11m 而不是 n是因为异物检测对细长目标敏感n 版的感受野和通道数不够铁棍召回率会明显低一截。epochs200 配合默认的早停 patience50一般 150 轮左右收敛。workers 设成 CPU 核数的 70% 左右太高反而因为数据加载竞争拖慢训练。3.3 铁棍小目标优化anchor 匹配和损失权重的调整YOLOv11 默认的 anchor 匹配策略对小目标不算友好铁棍这种宽高比极端的目标容易被判为负样本。两个调整方向一是开启rect训练模式让输入保持原始宽高比避免铁棍被过度拉伸二是在损失函数里提高 box loss 的权重。ultralytics 没有直接暴露 box loss 权重的参数但可以通过自定义训练脚本改from ultralytics import YOLO model YOLO(yolo11m.pt) model.train( data/data/conveyor_foreign_object/data.yaml, imgsz1280, epochs200, batch8, box10.0, # 默认 7.5提高边界框回归权重 cls0.5, # 默认 0.5分类权重保持不变 dfl1.5, # 默认 1.5分布焦点损失 )box10.0 是我在铁棍数据集上试出来的经验值再高容易导致垃圾类过拟合背景。dfl 控制的是边界框分布的精细程度铁棍的细长边界需要更精确的分布建模1.5 到 2.0 之间比较合适。这些参数没有银弹建议先用默认值跑一轮看混淆矩阵里铁棍的漏检率再针对性调。3.4 垃圾类内差异处理数据增强和类别平衡垃圾类的问题是类内差异太大塑料袋、木块、编织袋、纸板在像素层面几乎没有共同点。YOLOv11 默认的 HSV 增强和 mosaic 对垃圾类有帮助但 mosaic 会把四张图拼一起铁棍可能被截断反而有害。我的做法是分开配置增强model.train( ..., mosaic0.5, # 降低 mosaic 概率减少铁棍截断 hsv_h0.015, hsv_s0.7, hsv_v0.4, degrees10.0, # 小角度旋转模拟传送带跑偏 translate0.1, scale0.5, fliplr0.5, flipud0.0, # 传送带场景上下翻转不合理 )flipud 一定要关掉传送带上的异物不会倒着放。degrees 控制在 10 度以内铁棍大角度旋转后和垃圾的纹理特征会混淆。如果垃圾类样本数远少于铁棍可以在 data.yaml 里给垃圾类加一个class_weights或者在训练时用fraction参数控制采样比例但更稳妥的做法是直接补标垃圾样本别指望损失函数能完全弥补数据偏差。4. 传送带异物检测的避坑与排查从标注到推理的 5 个真实翻车现场4.1 现象训练 loss 正常下降但验证集铁棍召回率始终低于 0.3原因铁棍的标注框高度归一化后太小YOLOv11 在计算正样本匹配时默认的 anchor 阈值把大部分铁棍框过滤掉了。尤其是 imgsz 设成 640 时一根 40 像素高的铁棍缩放到 640 后只剩 13 像素低于最小 anchor 尺寸。解决把 imgsz 提到 1280同时在训练配置里显式设置anchors或改用autoanchor重新聚类。更直接的办法是检查标注文件确认铁棍框的 height 是否小于 0.02如果是要么重新标注放宽框的高度要么在数据加载时对铁棍类做上采样。4.2 现象模型在验证集上表现很好现场部署后垃圾全检成铁棍原因验证集和现场的光照、皮带材质差异太大。传送带场景的光照条件极其不稳定井下是黄光地面是自然光夜间是补光灯模型在验证集上过拟合了特定光照下的纹理特征。解决在数据集中强制加入不同光照条件的样本至少覆盖三种光源。如果现场已经部署用推理脚本把误检样本存下来人工标一批做增量训练。YOLOv11 支持model.train(resumeTrue)继续训但增量数据要混入原始数据别只训新样本否则灾难性遗忘会让你前功尽弃。4.3 现象推理时铁棍被检成两个框NMS 压不掉原因铁棍细长模型在铁棍两端各激活了一次产生两个高度重叠的框。默认 NMS 的 IoU 阈值是 0.7对于细长目标两个框的 IoU 可能只有 0.5 左右压不掉。解决在推理时调低 NMS 的 IoU 阈值到 0.4 到 0.5 之间results model.predict( sourcetest_images/, conf0.25, iou0.45, # 默认 0.7细长目标调低 imgsz1280, saveTrue, )同时可以开启agnostic_nmsTrue让不同类别之间也做 NMS避免铁棍和垃圾的框互相干扰。但要注意如果铁棍和垃圾确实叠在一起agnostic_nms 会误杀这时候还是得靠标注时把两个框分开。4.4 现象训练到 50 轮左右 loss 突然变成 NaN原因学习率太高或者 batch 里有脏数据。传送带图片经常有煤灰、水渍如果标注时把水渍标成了垃圾模型在拟合这些噪声样本时梯度爆炸。解决先把学习率降到 0.001加梯度裁剪clip_grad10.0。然后检查标注文件用脚本统计每个类别的框面积分布把面积异常小小于 10 像素或异常大超过图片 80%的框筛出来人工复核。YOLOv11 的close_mosaic参数可以在最后 10 轮关闭 mosaic也能减少 NaN 概率。4.5 现象模型文件导出 ONNX 后推理结果和 PyTorch 不一致原因YOLOv11 的导出默认使用动态输入ONNX 的 resize 算子和 PyTorch 的插值方式有细微差异铁棍这种小目标对像素级差异极其敏感。解决导出时固定输入尺寸并指定 opset 版本yolo export modelruns/conveyor/exp_iron_garbage/weights/best.pt \ formatonnx \ imgsz1280 \ opset12 \ simplifyTrue \ dynamicFalse导出后用 onnxruntime 跑一遍验证集和 PyTorch 的结果逐张对比IoU 差异超过 0.05 的样本单独看。如果差异集中在铁棍上说明 resize 方式不匹配可以尝试在导出时加halfTrue用 FP16或者换 TensorRT 部署精度损失更小。5. 把铁棍和垃圾分开训再融合一个值得试的进阶技巧如果你已经按前面的流程训了一版发现铁棍和垃圾的 mAP 始终互相拉扯一个涨另一个就跌那说明这两类目标在 YOLOv11 的单头检测器里确实存在特征冲突。我后来试了一个办法训两个模型一个只标铁棍一个只标垃圾推理时用加权框融合WBF合并结果。听起来麻烦但实际落地效果比单模型硬扛好不少。具体做法是复制两份数据集第一份把垃圾类的标注全部删掉只留铁棍训一个yolo11m_iron.pt第二份反过来只留垃圾训yolo11m_garbage.pt。两个模型都从同一个预训练权重出发训练参数除了类别数改成 1其他保持一致。推理时from ultralytics import YOLO from ensemble_boxes import weighted_boxes_fusion model_iron YOLO(yolo11m_iron.pt) model_garbage YOLO(yolo11m_garbage.pt) results_iron model_iron.predict(test.jpg, conf0.2, iou0.5)[0] results_garbage model_garbage.predict(test.jpg, conf0.2, iou0.5)[0] boxes_list [ results_iron.boxes.xyxyn.cpu().numpy().tolist(), results_garbage.boxes.xyxyn.cpu().numpy().tolist(), ] scores_list [ results_iron.boxes.conf.cpu().numpy().tolist(), results_garbage.boxes.conf.cpu().numpy().tolist(), ] labels_list [ [0] * len(results_iron.boxes), [1] * len(results_garbage.boxes), ] fused_boxes, fused_scores, fused_labels weighted_boxes_fusion( boxes_list, scores_list, labels_list, iou_thr0.45, skip_box_thr0.15, weights[1.0, 1.0], )WBF 的好处是它不像 NMS 那样直接丢弃重叠框而是按置信度加权平均铁棍和垃圾即使位置接近也能各自保留。权重可以调如果现场铁棍漏检更致命就把 iron 模型的权重提到 1.5。这个方案我用了大概三个月铁棍召回率从单模型的 0.72 提到 0.89垃圾的误检率也降了将近一半。代价是推理耗时翻倍如果产线速度要求高可以用 TensorRT 分别加速两个模型再在 CPU 上做 WBF整体延迟还能接受。最后说个习惯每次训完模型别只看 mAP把验证集里所有铁棍漏检的图单独导出来一张一张看。十张里有八张是标注框画歪了或者光照太暗这些才是你下一轮迭代真正要补的数据。模型调参能解决的问题有限数据质量才是天花板。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门