尧图精选

传送带异物检测数据集:铁棍与垃圾的COCO JSON标注与YOLOv8训练实战

🕒 发布时间:2026/10/1 10:35:24 📁 来源:尧图网络
简介面向工业质检与智能安防场景的传送带异物检测数据集可识别铁棍、垃圾等常见异物适合从事目标检测算法训练、产线异常监控或相关课程实践的中初级开发者使用。资源包共108个文件其中105张jpg现场图像与3个json标注文件压缩包约4.65MB图像取自真实监控视频帧json采用COCO格式组织可直接对接主流检测框架完成类别与边界框的读取。目前已有413人学习下载具备一定参考热度。借助该数据集读者可快速搭建传送带异物识别实验验证模型对铁棍、垃圾等小目标的检出效果并基于COCO标注完成类别统计、数据增强与训练评估为产线异物预警或安全巡检方案提供数据基础。1. 传送带异物检测数据集铁棍和垃圾怎么标进 COCO JSON传送带跑起来之后最怕的不是停机是铁棍、编织袋、塑料片这类异物混进料流。轻则卡住托辊划伤皮带重则进破碎机打坏转子一次非计划停机就是几万块。很多厂里现在还是靠人盯监控但人盯久了必然走神所以用视觉方案做传送带异物检测是刚需。真正卡住大多数团队的不是模型选型而是数据集铁棍和垃圾这两类目标形态差异极大铁棍细长、反光、方向任意垃圾则是软性、边界模糊、类内差异大。再加上标注格式如果一开始没统一成 COCO JSON后面换框架、做多模态融合、接标注平台都要返工。这篇就把传送带异物检测数据集从采集、标注到 COCO JSON 落地讲清楚适合正在做工业视觉检测、准备自己攒数据集的工程师。2. 传送带异物检测数据集铁棍与垃圾的标注边界怎么定2.1 为什么铁棍和垃圾不能合成一个“异物”类很多团队图省事把所有非煤非矿的东西统一标成“异物”。这在 demo 阶段能跑但一上产线就翻车。铁棍是刚性目标长宽比经常超过 8:1检测框要么框不全要么把旁边皮带纹理框进去垃圾是柔性目标塑料袋、编织袋、纸板、胶皮边界靠语义判断同一个物体不同标注员能画出差 30% 面积的框。如果合成一类模型学到的特征空间会互相干扰铁棍的细长特征被垃圾的块状特征稀释最后两类都检不好。我一般建议至少分两类iron_rod和garbage。如果产线对铁器特别敏感还可以把铁棍再拆成iron_rod_long和iron_rod_short因为短铁棍在低分辨率下容易和螺栓混淆。垃圾类如果种类多可以先用garbage一个大类等数据量上到 5000 张以上再考虑细分。COCO JSON 的categories字段天然支持这种层级后面要合并或拆分只改标注文件不用动图片。提示类别定义一旦定下来至少 2000 张图内不要改。中途改类别名会导致已标注数据全部作废这是血泪经验。2.2 采集时就要想好 COCO JSON 的字段怎么填采集阶段最容易忽略的是图像元信息。COCO JSON 里images数组每条记录包含id、file_name、width、height看起来简单但如果采集时文件名带中文、带空格、带时间戳格式不统一后面写file_name就要写转换脚本。我一般要求现场采集直接按line01_20240612_143022_001.jpg这种格式命名产线号、日期、时间、序号全在文件名里后面做时序分析、按天划分训练集都方便。另外annotations里的iscrowd字段传送带场景下基本用不到但area和bbox必须一致。bbox是[x, y, width, height]area是width * height如果标注工具导出的area是分割面积而不是框面积训练时做小目标过滤会出错。采集时还要注意光照传送带上方光源如果是频闪的同一根铁棍在不同帧里反光位置不同标注时框的边界会飘。常见做法是加装漫射板或者采集时固定曝光别让自动曝光来回跳。2.3 用标注工具导出 COCO JSON 的实操步骤标注工具选 LabelImg、CVAT、Labelme 都行但导出格式要选 COCO JSON。以 CVAT 为例创建任务时选“目标检测”而不是“实例分割”因为传送带异物检测大多数场景只需要框。标注时铁棍的框要贴紧两端垃圾的框可以稍微松一点把可能被风吹动的边缘包进去。导出时选COCO 1.0得到的 JSON 结构如下{ info: {description: conveyor foreign object dataset, version: 1.0}, images: [ {id: 1, file_name: line01_20240612_143022_001.jpg, width: 1920, height: 1080} ], annotations: [ {id: 1, image_id: 1, category_id: 1, bbox: [820, 340, 260, 32], area: 8320, iscrowd: 0} ], categories: [ {id: 1, name: iron_rod, supercategory: foreign_object}, {id: 2, name: garbage, supercategory: foreign_object} ] }导出后第一件事是检查category_id是否从 1 开始。有些工具从 0 开始而 YOLOv8 训练时如果直接读 COCO JSON类别索引会整体偏移一位导致铁棍被标成垃圾。第二件事是检查bbox有没有负值或超出图像宽高传送带边缘的目标容易被标出界。第三件事是统计每类实例数如果iron_rod少于 800 个实例先别急着训练继续补数据。3. 把 COCO JSON 喂给 YOLOv8转换、划分与训练参数3.1 COCO JSON 转 YOLO txt 的脚本与四个边界坑YOLOv8 原生支持 COCO JSON 格式的数据集配置但实际训练时我更喜欢转成 YOLO txt因为排查标注错误更直观。转换脚本核心逻辑是读images和annotations按image_id分组再把bbox从[x, y, w, h]转成[class_id, x_center, y_center, w, h]并归一化。下面是我常用的转换脚本import json import os from pathlib import Path def coco_to_yolo(coco_json, output_dir, img_width1920, img_height1080): with open(coco_json, r, encodingutf-8) as f: data json.load(f) # 建立 image_id 到文件名的映射 img_map {img[id]: img[file_name] for img in data[images]} # 建立 category_id 到 0-based 索引的映射 cat_map {cat[id]: idx for idx, cat in enumerate(data[categories])} os.makedirs(output_dir, exist_okTrue) grouped {} for ann in data[annotations]: img_id ann[image_id] grouped.setdefault(img_id, []).append(ann) for img_id, anns in grouped.items(): file_name img_map[img_id] txt_name Path(file_name).stem .txt lines [] for ann in anns: x, y, w, h ann[bbox] # 过滤掉宽高为 0 的脏标注 if w 0 or h 0: continue x_center (x w / 2) / img_width y_center (y h / 2) / img_height norm_w w / img_width norm_h h / img_height # 裁剪到 [0, 1] 防止越界 x_center min(max(x_center, 0), 1) y_center min(max(y_center, 0), 1) norm_w min(max(norm_w, 0), 1) norm_h min(max(norm_h, 0), 1) cls_id cat_map[ann[category_id]] lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {norm_w:.6f} {norm_h:.6f}) with open(os.path.join(output_dir, txt_name), w) as f: f.write(\n.join(lines)) coco_to_yolo(annotations.json, labels/train)这段脚本里四个坑要特别注意。第一img_width和img_height不能写死如果数据集里图片尺寸不统一要从images数组里逐张读。第二cat_map必须用enumerate生成 0-based 索引因为 YOLO 的类别索引从 0 开始。第三x_center和y_center要裁剪到[0,1]否则越界标注会让训练 loss 直接 NaN。第四空标注图片也要生成空 txt 文件否则 YOLO 会报找不到标签。3.2 训练集、验证集、测试集怎么切才不泄漏传送带异物检测数据集切分不能随机切。同一根铁棍在连续帧里出现如果随机切训练集和验证集会包含同一目标的相邻帧验证指标虚高。正确做法是按时间段切比如前 7 天数据做训练第 8 天做验证第 9 天做测试。如果数据量不够至少按“采集批次”切同一批次全部进训练或全部进验证。切分比例我一般用 7:2:1。铁棍类如果实例数少可以过采样但过采样只能在训练集里做验证集和测试集必须保持真实分布。切分完要检查三个集合的类别分布如果验证集里garbage占比和训练集差超过 10%说明切分有偏要重新调。# 目录结构 dataset/ images/ train/ val/ test/ labels/ train/ val/ test/对应的data.yamlpath: ./dataset train: images/train val: images/val test: images/test nc: 2 names: 0: iron_rod 1: garbage3.3 YOLOv8 训练参数铁棍小目标要调哪几个铁棍在 1920x1080 图里可能只占 200x20 像素属于小目标。YOLOv8 默认imgsz640下采样后铁棍只剩几个像素召回率会很低。我一般把imgsz提到 960 或 1280但显存不够时可以用imgsz960加batch8。另外anchor虽然 YOLOv8 是无锚框的但reg_max参数影响框回归范围小目标多的时候可以把reg_max从 16 降到 12让回归更聚焦。训练命令yolo detect train \ datadata.yaml \ modelyolov8s.pt \ imgsz960 \ epochs150 \ batch8 \ lr00.01 \ lrf0.01 \ warmup_epochs5 \ box7.5 \ cls0.5 \ dfl1.5 \ patience30 \ device0box从默认 7.5 提到 7.5 是保持但如果铁棍漏检多可以提到 8.5让框回归 loss 权重更大。cls从 0.5 降到 0.3因为垃圾类边界模糊分类 loss 太高会让模型过拟合标注噪声。patience30是早停传送带数据集如果只有几千张150 epoch 足够再训就过拟合了。4. 传送带异物检测数据集避坑标注、格式与训练的 5 个翻车现场4.1 铁棍反光导致框飘模型学成“反光检测器”现象训练 loss 正常下降但验证集上铁棍召回率只有 60%可视化发现模型只框反光点不框铁棍本体。原因是标注时标注员被反光吸引框只框了高亮区域。解决标注规范里明确写“框铁棍两端物理边界不框反光”并且采集时加偏振镜或漫射光源减少镜面反射。已经标完的数据用脚本检查bbox宽高比铁棍宽高比小于 3 的重新标。4.2 COCO JSON 里 category_id 不连续训练时类别错位现象训练完发现iron_rod的检测框全跑到garbage类上。原因是标注工具导出的category_id是 1 和 3中间缺了 2而转换脚本用enumerate生成 0-based 索引时cat_map是{1:0, 3:1}但 YOLO 读data.yaml时按names顺序索引如果names写的是0: iron_rod, 1: garbage而实际cat_map把 3 映射成 1就错位了。解决转换前先检查categories的id是否连续不连续就重映射成 1,2,3...再生成 0-based 索引。4.3 验证集里混入训练集相邻帧指标虚高 15%现象验证集 mAP 0.85上线后实际召回只有 0.6。原因是随机切分导致同一根铁棍的相邻帧同时出现在训练集和验证集。解决按采集时间段切分同一段视频只进一个集合。如果已经切完用感知哈希或简单的帧差法检测相邻帧把验证集里和训练集相似度超过阈值的图移到训练集。4.4 垃圾类标注框太大模型把整条皮带判成垃圾现象模型在空皮带图上输出大量garbage框。原因是标注时垃圾框画得太大把周围皮带纹理也框进去了模型学到“皮带纹理垃圾”。解决标注规范要求垃圾框贴紧物体边缘并且加入负样本——空皮带图不标任何框但要在训练集里占 10% 到 20%。YOLOv8 对空标注图会计算背景 loss能有效抑制误检。4.5 图片尺寸不统一转换脚本写死宽高导致框全偏现象转换后的 YOLO txt 里框位置整体偏移。原因是数据集里混了 1920x1080 和 1280x720 两种尺寸转换脚本写死img_width1920。解决从 COCO JSON 的images数组里逐张读width和height不要写死。如果图片尺寸种类多训练前统一 resize 到同一尺寸但 resize 后要重新计算框坐标。5. 用 COCO JSON 做多模态扩展与数据增强的进阶技巧COCO JSON 的好处不只是给 YOLO 用。传送带异物检测如果后面要加红外或高光谱通道COCO JSON 的images数组可以扩展extra_channels字段把红外图的路径写进去标注框直接复用。我一般会在images里加thermal_file_name: line01_20240612_143022_001_thermal.jpg这样多模态数据集 bird1445 那种融合思路也能套过来不用重新标。数据增强方面铁棍的旋转增强要小心。普通随机旋转会让铁棍角度分布失真而传送带上铁棍方向其实有先验——大多数横跨或斜跨皮带。我一般用degrees15限制旋转范围再加flipud0.0禁止上下翻转因为传送带视角固定上下翻转会产生不存在的视角。垃圾类可以用mosaic1.0和mixup0.1增加类内多样性。验证集评估时除了 mAP我还会单独看铁棍的召回率。因为铁棍漏检的代价远大于垃圾误检。如果铁棍召回低于 0.9优先调imgsz和box参数而不是加数据。最后分享一个习惯每次改完标注或转换脚本先拿 50 张图做可视化检查把预测框和标注框画在同一张图上肉眼过一遍。这个习惯帮我省了至少三次返工。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →