新闻详情

新闻详情

首页 / 资讯中心 / 详情

流水线皮带异物检测:110张VOC+YOLO数据集从流程验证到上线实操

发布时间:2026/9/28 12:58:20来源:尧图网络
流水线皮带异物检测:110张VOC+YOLO数据集从流程验证到上线实操
简介本资源为流水线皮带传送带异物检测数据集面向从事工业视觉检测、智能制造与深度学习目标检测的开发者及学生可用于训练和验证传送带异常目标识别模型。数据集同时提供Pascal VOC与YOLO两种标注格式包含jpg图片、对应的VOC格式xml文件以及YOLO格式txt文件方便直接接入主流检测框架。压缩包共332个文件其中110张jpg图像、110个xml标注、112个txt文件整体约17.76MB标注类别为anomaly共191个矩形框均使用labelImg完成标注。目前已有391人学习下载适合作为小样本异物检测任务的练手数据帮助读者快速搭建数据加载、模型训练与评估流程理解工业场景下异常目标的标注规范与数据组织方式。1. 流水线皮带异物检测110 张 VOCYOLO 数据集到底能干什么流水线皮带传送带上跑的东西最怕的不是跑偏是混进不该有的东西。锚杆、铁片、大块矸石、木条、编织袋碎片一旦卡进滚筒或者划穿皮带轻则停机两小时重则整条线停产检修。很多厂里现在还是靠人盯着监控屏幕但人盯久了必然走神尤其是夜班。所以用视觉方案做皮带异物检测是这两年工矿场景里落地比较快的一个方向。这个标题里的数据集规模是 110 张图、1 个类别同时提供 VOC 和 YOLO 两种标注格式。先说清楚它的定位这不是一个能直接拿去上线跑生产的成品数据集110 张图训练出来的模型泛化能力有限它更像是一个验证流程、跑通 pipeline、做 demo 的起点。适合两类人一是想快速验证「YOLO 能不能识别我这条皮带上的异物」的算法同学二是手上已经有现场数据、想先拿个小数据集把标注格式转换、训练、推理整条链路走通再批量处理的工程同学。我自己的经验是皮带异物检测真正的难点从来不在模型结构而在数据。异物形态千奇百怪、和背景对比度低、皮带本身还在运动带模糊这些才是让模型翻车的地方。所以拿到一个 110 张的小数据集正确的用法是先把它当成「流程验证集」把 VOC 转 YOLO、训练、评估、推理这几步全部跑顺再决定要不要投入人力去标几千张现场图。下面我就按这个思路把整条链路拆开讲。2. VOC 与 YOLO 双格式先搞懂标注差异再动手2.1 两种格式到底差在哪VOC 格式的标注是 XML 文件一张图对应一个 XML里面用object节点描述每个目标坐标是绝对像素值记的是左上角和右下角annotation filenamebelt_001.jpg/filename size width1920/width height1080/height /size object nameforeign_object/name bndbox xmin820/xmin ymin430/ymin xmax1010/xmax ymax560/ymax /bndbox /object /annotationYOLO 格式则是每张图对应一个 txt每行一个目标格式是类别索引 中心x 中心y 宽 高而且这四个值全部是归一化到 0~1 的相对值0 0.4765 0.4583 0.0989 0.1204差异的核心就三点一是坐标表达VOC 用绝对像素、YOLO 用归一化相对值二是文件组织VOC 一图一 XML、YOLO 一图一 txt三是类别表达VOC 直接写类别名YOLO 写类别索引索引和类别名的映射要单独维护一个classes.txt或data.yaml。搞混这三点是新手最容易翻车的地方——比如把绝对坐标直接塞进 YOLO 的 txt训练时 loss 会一直降不下去模型学出来全是乱框。2.2 目录结构怎么摆拿到数据集后先按标准结构整理。VOC 部分常见长这样VOCdevkit/ └── VOC2007/ ├── Annotations/ # 所有 xml ├── JPEGImages/ # 所有 jpg └── ImageSets/ └── Main/ # train.txt / val.txtYOLO 部分常见长这样dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamldata.yaml是 YOLO 训练时的入口配置内容大致是path: ./dataset train: images/train val: images/val nc: 1 names: [foreign_object]这里nc是类别数本数据集只有 1 类所以填 1names里的顺序必须和 txt 里的类别索引严格对应索引 0 对应foreign_object。如果后面你扩到多类比如把「铁器」和「木条」分开那nc改成 2names按索引顺序写同时所有 txt 里的索引也要跟着改这一步漏改就会出现「模型把铁器识别成木条」的玄学问题。2.3 110 张图怎么划分才合理110 张图如果按 8:2 划分训练集 88 张、验证集 22 张。这个量级下我一般会做两件事一是固定随机种子保证每次划分一致方便复现二是尽量让训练集和验证集的场景分布接近比如白天和夜班画面都要在两边出现否则验证集指标会虚高或虚低。提示110 张图做验证集只有 22 张指标波动会很大mAP 上下浮动几个点是正常的不要因为一次评估结果就下结论说模型不行。划分脚本可以这样写用固定种子打乱后切分import os import random random.seed(42) # 固定种子保证可复现 img_dir VOCdevkit/VOC2007/JPEGImages imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(imgs) split int(len(imgs) * 0.8) train_list, val_list imgs[:split], imgs[split:] with open(train.txt, w) as f: f.write(\n.join(train_list)) with open(val.txt, w) as f: f.write(\n.join(val_list)) print(ftrain: {len(train_list)}, val: {len(val_list)})random.seed(42)是复现的关键换机器、换时间跑结果都一样。split取 0.8 是经验值小数据集上 7:3 也可以但验证集太小评估就没意义所以我一般不低于 20%。输出的是纯文件名列表后面转 YOLO 格式时直接读这个列表保证训练验证不交叉。3. 从 VOC 转 YOLO转换脚本与四个边界坑3.1 转换的核心逻辑转换的本质就是把 XML 里的绝对坐标按图片宽高归一化再算成中心点加宽高的形式。公式很直接中心 x (xmin xmax) / 2 / width中心 y (ymin ymax) / 2 / height宽 (xmax - xmin) / width高 (ymax - ymin) / height写脚本时最容易忽略的是图片实际尺寸和 XML 里记录的 size 不一致。有些数据集在裁剪或缩放后忘了更新 XML这时候如果直接用 XML 里的 width/height 去归一化坐标就全错了。稳妥做法是转换时用 PIL 重新读一遍图片真实尺寸。3.2 完整转换脚本import os import xml.etree.ElementTree as ET from PIL import Image classes [foreign_object] # 类别顺序决定索引 xml_dir VOCdevkit/VOC2007/Annotations img_dir VOCdevkit/VOC2007/JPEGImages out_label_dir dataset/labels/train os.makedirs(out_label_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() # 用真实图片尺寸避免 XML 里的 size 过期 img_name root.find(filename).text img_path os.path.join(img_dir, img_name) with Image.open(img_path) as im: w, h im.size lines [] for obj in root.findall(object): name obj.find(name).text if name not in classes: continue # 跳过不在类别表里的目标 cls_id classes.index(name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 边界裁剪防止坐标越界 xmin, xmax max(0, xmin), min(w, xmax) ymin, ymax max(0, ymin), min(h, ymax) cx (xmin xmax) / 2 / w cy (ymin ymax) / 2 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_name os.path.splitext(xml_file)[0] .txt with open(os.path.join(out_label_dir, out_name), w) as f: f.write(\n.join(lines)) print(转换完成)classes.index(name)保证类别索引和data.yaml里的names顺序一致这是训练不报错的前提。max(0, xmin)和min(w, xmax)是边界裁剪因为标注时手抖把框拖出图片边界很常见不裁剪的话归一化后会出现负数或大于 1 的值YOLO 训练时这些框会被当成异常样本。:.6f保留六位小数是 YOLO 官方推荐的精度太少会丢精度太多没必要。3.3 四个必踩的边界坑坑一坐标越界。现象是训练时 loss 出现 NaN 或者一直不收敛。原因是标注框超出图片边界归一化后出现负值或大于 1。解决就是上面脚本里的边界裁剪转换后可以再写个校验脚本扫一遍所有 txt发现越界值直接报错。坑二空标注文件。有些图里没有异物XML 里没有object节点转换出来就是空 txt。YOLO 对空 txt 是允许的表示这张图是负样本但如果你的数据集里负样本太多模型会偏向于「什么都不预测」。110 张图里如果负样本超过三成建议单独抽出来做难例挖掘而不是直接混进训练集。坑三类别名大小写不一致。有的 XML 写Foreign_Object有的写foreign_objectclasses.index()直接找不到就跳过了结果某些图转换后是空的。转换前先统计一遍所有 XML 里的name取值统一成小写再处理。坑四图片和 XML 对不上。文件名大小写、扩展名不一致.jpgvs.JPG导致Image.open直接抛异常。转换脚本里加个 try-except把对不上的文件单独记到一个 log 里人工核对别让整个转换中断。4. 用 YOLOv8 训练 110 张图参数怎么设才不白跑4.1 环境与最小训练命令环境用 ultralytics 官方包最省事一条命令装好pip install ultralytics训练命令yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch8 \ seed42 \ projectruns/belt \ nameexp1modelyolov8n.pt选的是 nano 版本110 张图这个量级用大模型必然过拟合nano 足够。imgsz640是默认输入尺寸如果你的原图是 1920×1080YOLO 会自动缩放但小目标缩完可能只剩几个像素这时候要考虑切图训练。batch8是显存和稳定性的折中显存够可以往上加但小数据集上大 batch 反而容易过拟合。seed42和前面划分数据的种子一致保证实验可复现。4.2 关键参数逐个说参数建议值说明epochs100~300小数据集收敛快但太少欠拟合太多过拟合imgsz640小目标多就上 1280但显存翻倍batch8~16显存允许下取大但小数据集别超过 16lr00.01默认值小数据集可降到 0.001 更稳patience3030 轮没提升就早停省时间augmentTrue默认开小数据集靠增强撑泛化patience30是早停110 张图训练时经常几十轮就收敛了没必要跑满。lr0初始学习率小数据集上默认 0.01 有时候会震荡降到 0.001 收敛更平滑代价是训练慢一点。数据增强默认是开的包括随机翻转、缩放、色彩抖动小数据集上这是撑泛化的主要手段别关。4.3 训练过程看什么训练时终端会打印每一轮的 box_loss、cls_loss 和 mAP。重点看两个信号一是box_loss 是否稳定下降如果一直震荡或者上升多半是学习率太大或者标注有问题二是mAP50 是否在验证集上跟着涨如果训练 loss 降但验证 mAP 不涨就是过拟合了这时候要么加数据要么加增强要么减模型容量。训练完在runs/belt/exp1/下会生成weights/best.pt和weights/last.pt还有混淆矩阵、PR 曲线这些图。110 张图的混淆矩阵只有 1 类看起来就是 2×2 的格子别指望它能告诉你太多重点还是看 PR 曲线和实际推理效果。注意小数据集上 mAP 数值本身参考价值有限更重要的是拿几张没参与训练的现场图做推理肉眼看框得准不准。5. 推理、评估与踩坑排查110 张图跑完别急着上线5.1 推理与可视化训练完先用命令行跑几张图看看效果yolo detect predict \ modelruns/belt/exp1/weights/best.pt \ sourcetest_images/ \ conf0.25 \ saveTrueconf0.25是置信度阈值低于这个值的框不显示。皮带异物检测里我一般会把阈值调低到 0.15~0.2宁可多报几个误检也别漏掉真正的异物——漏检的代价是停机误检的代价只是人工复核一下。saveTrue会把带框的图存到runs/detect/predict/下方便肉眼核对。如果要批量评估用 val 模式yolo detect val \ modelruns/belt/exp1/weights/best.pt \ datadataset/data.yaml \ imgsz640输出里会给出 mAP50、mAP50-95、precision、recall。110 张图、22 张验证集这些指标的置信区间很宽别拿单次结果当定论。5.2 常见问题排查现象训练 loss 正常但推理全是乱框。原因八成是类别索引和data.yaml对不上或者 txt 里坐标没归一化。解决随便挑一个 txt手动算一遍中心点和宽高看是否在 0~1 之间再核对names顺序。现象模型只识别大目标小异物全漏。原因是imgsz640下小目标缩得只剩几像素。解决把原图切块训练比如 1920×1080 切成 640×640 的块每块单独标注和训练推理时再拼回去。这是皮带异物检测里最常用的一招。现象验证集 mAP 很高但现场图一塌糊涂。原因是训练集和现场场景分布不一致比如训练集全是白天现场是夜班红外画面。解决要么补现场数据要么做域适应别指望模型自己泛化。现象训练到一半 loss 突然变 NaN。常见原因是标注里有宽或高为 0 的框归一化后除零。解决转换脚本里加一句if bw 0 or bh 0: continue把退化框过滤掉。现象显存不够batch 降到 1 还是 OOM。原因是imgsz太大或者模型选大了。解决先把imgsz降到 416或者换yolov8n再不行就上梯度累积。6. 把 110 张扩到能上线的规模几个我踩过的实操技巧110 张图跑通流程只是第一步真要上线数据量至少得往 1000 张以上走。这里说几个我实际做过的扩数据技巧都是血泪经验换来的。第一主动学习比盲目标注省一半人力。先用 110 张训一个初版模型拿它去跑现场未标注的视频抽帧把置信度在 0.3~0.6 之间的「模型拿不准」的图挑出来人工标注。这些图信息量最大标 200 张的效果往往顶得上随机标 500 张。具体做法是用 predict 模式跑一批图输出里带conf字段按置信度排序取中间段。第二切图训练是皮带场景的标配。皮带画面通常是长条形异物相对整幅图很小。直接把 1920×1080 缩到 640小目标就没了。我一般用滑窗把原图切成 640×640 的块重叠 128 像素每块单独标注。推理时对每块预测再用 NMS 把重叠区域的框合并。这样小目标的召回率能提升一大截代价是推理耗时增加但皮带场景对实时性要求没那么苛刻几秒的延迟可以接受。第三负样本要专门挖。皮带上的正常物料、水渍、反光、阴影这些容易被误检成异物。我一般会专门收集几百张「没有异物但模型容易误报」的图作为负样本混进训练集。负样本不用标注空 txt 就行但比例别超过三成否则模型会变得过于保守。第四验证别只看 mAP要看业务指标。皮带异物检测真正关心的是「漏检率」和「误报率」。漏检率就是有多少真异物没被检出误报率就是有多少正常画面被报了警。这两个指标比 mAP 更贴近现场。我一般会拿一段现场视频跑推理人工数一遍漏检和误报算出来的数字才是能拿去跟生产部门汇报的。第五模型导出和部署要提前想。训练完的.pt是 PyTorch 格式现场部署一般要转成 ONNX 或者 TensorRT。导出命令yolo export modelruns/belt/exp1/weights/best.pt formatonnx opset12opset12是兼容性比较好的版本转完用 onnxruntime 跑一遍确认输出和 PyTorch 一致再上线。这一步经常出问题比如动态轴没设对、后处理没对齐导致部署后框的位置偏了。我的习惯是导出后一定拿同一张图分别用 PyTorch 和 ONNX 跑一遍把框的坐标打印出来对比差超过几个像素就得查。最后说个我自己的教训早期做皮带异物检测我拿到一个小数据集就急着调模型结构换 backbone、加注意力折腾了两周 mAP 涨了不到两个点。后来老老实实去现场补了 800 张图重新标了一遍同样的 YOLOv8nmAP 直接涨了二十多个点。数据量不够的时候任何模型改进都是玄学把精力花在数据和标注质量上回报率高得多。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

IsaacLab Basic Robot Tutorial 2026/9/28 20:33:33

IsaacLab Basic Robot Tutorial

本教程介绍如何将机器人加入stage、移动机器人并检查机器人1、启动 Isaac Sim Applicationcd ~/IsaacLab ./isaaclab.sh -s2、Add a robot to StageFile → Open → unitree_g1_29dof.usd3、Use the Physics Inspector to examine the robot’s joint propertiesTools > Phy…

阅读更多 →
Python3函数参数详解 2026/9/28 20:33:21

Python3函数参数详解

在 Python 中,函数参数是函数的重要组成部分,它们允许函数接收外部传入的数据,从而使函数具有更强的通用性和灵活性。理解和掌握 Python 函数参数的各种类型和使用方法,对于编写高效、可维护的代码至关重要。本文将详细介绍 Pytho…

阅读更多 →
投资框架怎么建?周期、耐心与仓位管理,一份写给新手的完整指南 2026/9/28 20:33:21

投资框架怎么建?周期、耐心与仓位管理,一份写给新手的完整指南

投资框架怎么建?周期、耐心与仓位管理,一份写给新手的完整指南 【免费下载链接】investing-for-beginners 美股、期权与加密货币知识框架 项目地址: https://gitcode.com/gh_mirrors/in/investing-for-beginners 这是《投资入门指南》中最核心的一…

阅读更多 →
JEV编码代理深度实战:长上下文重构、Codex接入与避坑指南 2026/9/28 20:33:21

JEV编码代理深度实战:长上下文重构、Codex接入与避坑指南

1. 从一次代码评审说起:我为什么突然被 JEV 吸引大概两周前,我在整理一个老项目的依赖升级清单,同事随口提了一句“你试过 JEV 没有,那个模型写代码的风格很对我胃口”。我当时没太当回事,毕竟现在每天冒出来的模型代号…

阅读更多 →
NanoVNA实用指南:矢量网络分析、校准与天线测量要点 2026/9/28 20:33:21

NanoVNA实用指南:矢量网络分析、校准与天线测量要点

如果你平时喜欢捣腾天线、滤波器、对讲机手台,或者在做射频小板的阻抗匹配,NanoVNA这个名字应该早就躺在你的购物车和收藏夹里了。作为一台能把“矢量网络分析”这件事做到几百块价位的掌上仪器,它几乎成了DIY射频圈子的标配工具:…

阅读更多 →
Hypit实战:一行命令复刻爆款视频的完整流程与避坑指南 2026/9/28 20:33:21

Hypit实战:一行命令复刻爆款视频的完整流程与避坑指南

说实话,看到 Hypit 的 README 上写着"一行命令复刻爆款视频"的时候,我第一反应是"又一个把复杂事说简单了的项目"。但最近我在整理一批短视频素材时,确实被这种需求折磨得够呛——想复刻一支爆款视频的镜头节奏&#xff…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉