简介:这是一套面向计算机视觉与人工智能领域的目标检测数据集,聚焦电池、纸团、一次性杯子、塑料瓶和积木五类常见垃圾目标,采用COCO格式进行标注,每张图像均包含边界框信息,可直接服务于YOLO、SSD、Faster R-CNN等主流检测模型的训练与效果评估。全套资源共1753个文件,包括1743张jpg图片、8张png图片和2个json标注文件,压缩包约20.19MB;图片素材来自多样场景,json文件则记录每个目标的类别与坐标,可方便地拆分训练集、验证集和测试集。该数据集聚类了实际环保应用中的典型对象,为垃圾分类、智能监控等场景提供标准化训练数据。目前已有2199人学习/下载,无论是正在学习目标检测算法的高校学生,还是需要基础数据开展实验的算法工程师,都能从中获得直接可用的数据支撑。
1. 垃圾目标检测数据集,难点不在“找图”而在“标得动”
如果我接手一个智慧环卫项目,第一周的结论会有些反直觉:垃圾目标检测的技术瓶颈不在模型,而在数据集。通用检测器对易拉罐、塑料瓶这类“物体”已经足够稳,可切到真实巡检画面,烟蒂、泡沫块、破渔网、半埋在土里的砖头,跑一遍通用模型会漏掉近八成。“垃圾”在物体目标检测里不是单一类别,而是几十类目标的并集,这使它同时踩中细颗粒度、小目标、长尾分布三个坑。
从零做一套自己的垃圾目标检测数据集,我一般会走这样一条链路:先定类别树和标注规范,再混入公开数据集和自采视频抽帧,然后用半自动预标注压减人工成本,最后用 YOLOv8 跑闭环训练,拿指标反推哪些样本标错了。下面每一步都落到命令和参数上。
2. 先拆清楚:垃圾目标检测数据集的类别体系与标注规范
2.1 垃圾检测不是“乱标一通”,先定类别树
越早定类别,数据加工越便宜。我基本不会直接用“垃圾”作为类别名,而是把垃圾降解成“可感知的弃置物”:塑料瓶、易拉罐、塑料袋、泡沫、玻璃瓶、烟蒂、纸箱、布料、砖块、轮胎。它们形态差异大,在画面里的颜色、纹理、边缘和光照表现各不相同;如果按垃圾的化学成分归类,同一类在图像上完全不可分,标注员会崩溃,模型也学不到稳定特征。
建议做两级类别树。第一级记录场景属性:岸线陆地、水面漂浮、道路市政、工地废料;第二级才是具体类别,数量控制在 8 到 15 类。类别数太多会让每个类别样本量不足,太少则模型无法区分“塑料袋”和“白色泡沫”。下面是一个可参考的初始清单:
| 一级场景 | 二级类别 | 常见形态 | 典型尺寸占比 | 标注难度 |
|---|---|---|---|---|
| 岸线/陆地 | 塑料瓶、易拉罐、玻璃瓶 | 多为完整或轻度压瘪容器 | 中 | 低 |
| 滩涂/水面 | 泡沫、塑料片、渔网 | 碎片多,半埋或浸水,边界不清 | 小 | 高 |
| 道路/市政 | 烟蒂、口罩、纸屑 | 目标极小,遮挡严重 | 小 | 高 |
| 工地/废料 | 砖块、混凝土块、钢筋 | 形状不规则,常堆叠 | 中 | 中 |
定完表不能急着标。先把每个类别的定义写成一份标注文档,附 3 到 5 张典型图和 1 到 2 张边界图,说明“什么算,什么不算”。例如“沾满泥土的塑料袋”算,“垃圾桶内已投放的瓶子”不算,因为开放场景只关心暴露在环境里的弃置物。没有这份规则,第二个人接手时标注一致性会立刻崩塌。
2.2 标注粒度与小目标:垃圾是“小”出来的
垃圾目标检测数据集与通用物体检测的本质区别,是小目标占比极高。按 MS COCO 的面积口径,小于 32×32 像素的框算小目标;垃圾场景里烟蒂、泡沫碎块常常连 16×16 像素都没有。标注时如果不在原图上放大 300% 再操作,很容易把一个烟蒂略过。
我建议直接标注边界框,不要走“先分割再转框”的弯路。垃圾边界模糊,逐像素分割争议大,标注成本高;而且多数公开数据集只提供 bbox,先做检测任务用 bbox 足够。COCO 格式里一个标注记录长这样:
{ "images": [ { "id": 1, "file_name": "frame_0001.jpg", "width": 1920, "height": 1080 } ], "annotations": [ { "id": 1, "image_id": 1, "category_id": 2, "bbox": [1240.5, 308.2, 18.3, 21.7], "area": 396.51, "iscrowd": 0 } ] }bbox依次是左上角 x、左上角 y、宽、高,area必须与 bbox 一致,iscrowd对垃圾检测建议全部置 0。垃圾目标经常堆叠,如果把一堆瓶罐标成iscrowd=1,模型永远学不到单目标边界。还需要注意保留浮点坐标,不要四舍五入成整数;小目标框宽可能只有十几像素,每个像素的偏移都会显著降低 IoU。
2.3 难例标注规则:遮挡、半埋与目标过小
垃圾数据集中最难的不是正常暴露目标,而是三种情况:被植物或泥沙遮挡、目标只有局部露在外面、光线很差。没有规则的标注员会把“露出的一条塑料袋角”也框出来,另一人却选择跳过,这两者在训练里互相打架。
一般做法是定三条硬规则:第一,可见面积小于目标的 30% 不标;第二,目标完全被泥土或水覆盖,只能凭颜色判断的不标;第三,目标在画面中短边小于 8 像素不标。这三条规则的目的不是减少信息,而是保证标注框的“语义确定性”。垃圾检测的难例学习应交给模型用更多样本来补足,而不是靠标注员猜测。
3. 从源头构建数据集:公开集勾兑、视频抽帧与预标注
3.1 公开垃圾目标检测数据集怎么取舍
公开数据集中可以用于垃圾检测的有 TACO、TrashCan 这类专门集,也有 COCO、VOC 中与瓶罐纸箱相关的类别。专门集的价值是类别命名贴近真实垃圾,COCO 的价值是数量大、迁移容易。但这些数据集之间有两个冲突:一是标签口径不一致,同是“瓶子”,有的集要求标饮料瓶,有的把所有容器都算;二是形态偏移,COCO 里的瓶子大多是完整立在桌上的,而垃圾场景里的瓶子是压扁、破损、半埋的。
我的做法是把公开集放进“预训练池”,而不是直接混入训练集。先用公开集让模型见足够多的“物体形态”,再用自采数据微调。如果图省事直接合并训练,需要统一改标签并重新抽检,否则某个类别在训练时同时看到两种对立标注,loss 会出现奇怪抖动。
3.2 自采视频抽帧,一个 ffmpeg 命令稳住源头
自采视频仍然是最可控的数据来源。我一般用手机或监控摄像头固定机位,在不同时段、天气和光照下绕场地巡检,单场景拍 5 到 10 分钟。抽帧用 ffmpeg 按时间间隔抽,而不是逐帧抽:
ffmpeg -i site_A.mp4 -vf fps=1/3 -q:v 1 -start_number 0 frames_site_A_%04d.jpg参数说明:fps=1/3表示每 3 秒输出一帧,适合目标基本静止的巡检画面;-q:v 1是图像质量,取值 2 到 31,值越小质量越高;-start_number 0让输出帧号从 0 开始连续,方便后续脚本对齐。逐帧抽帧会产生大量几乎相同的冗余帧,这些高相似度画面进到训练集后,会让模型过拟合到固定背景,验证集指标虚高。
抽帧后可以做一次感知哈希去重。对每帧计算 pHash,去除汉明距离小于 5 的相邻帧;这一步用 OpenCV 几十行就能完成,能显著降低标注成本。
3.3 用 YOLOv8 半自动预标注,把标注工作量压到 30%
完全人工框垃圾目标不现实。常见做法是先用预训练模型给整批图生成伪标签,再让人工在伪标签基础上修正。以下代码用 Ultralytics YOLOv8 对 frames 目录做批量推理:
from ultralytics import YOLO model = YOLO("yolov8m.pt") model.predict( source="frames/", imgsz=640, conf=0.30, max_det=100, save_txt=True, save_conf=True, classes=[39, 41, 44, 62] )这段代码的输出是每张图片同名的 txt,格式为class x_center y_center width height conf。conf=0.30控制伪标签的召回率,调低到 0.2 能多检一些小目标,代价是垃圾框增多;classes是 COCO 类别索引过滤,只保留瓶子、杯子、碗、椅子等可能与垃圾相关的类。预标注的价值不是一次到位,而是让标注员在已有框的基础上去增补漏检、调整错框,这个流程能把纯人工时间压缩到原来的三分之一左右。
生成的伪标签可以直接导入 Label Studio 或 CVAT。转换时注意把 YOLO 格式的中心点脚标换算成 COCO 的左上角坐标,导入后人工逐张修正。不要直接把伪标签当训练标签用,垃圾场景下烟蒂和泡沫的漏检率通常超过 60%。
3.4 人工修正后的抽检一致性检查
标注完成后要做一次双人一致性检查。抽 100 张已修正图片,让另一个人完全重新标,计算两组框之间的 IoU。合格线大致是:简单场景 IoU 大于等于 0.7 一致,复杂场景大于等于 0.5 一致,完全漏标率小于 2%。如果“完全漏标”超过 5%,说明标注规范没有落地,要在第 2 章的文档里补充典型图,而不是继续标下去。
分类一致性同样要查。垃圾场景中塑料袋与塑料膜、布料与渔网很容易互相串类,建议把验证集上互相误标比例高的类直接合并。串类问题靠模型再训练是压不掉的,根源在训练标签就已经错了。
4. 用 YOLOv8 把垃圾目标检测数据集训练成可用模型
4.1 train/val 划分必须在视频层级做
划分数据集时我见过最多的错误,是在帧层面随机切分。同一个视频前半段进 train、后半段进 val,两批画面背景高度重叠,最后验证 mAP 虚高到 0.85 以上,换新场景立刻掉回 0.5。正确做法是按视频文件分桶:每个视频的所有帧只能进单侧集合,公开集则按拍摄场景分组。
此时准备一份数据配置:
path: ./garbage_det train: images/train val: images/val names: 0: plastic_bottle 1: can 2: glass_bottle 3: foam 4: plastic_bag 5: cigarette_butt 6: fabric 7: brick 8: tirenames的值必须从 0 开始连续编号。如果抽帧脚本生成了类别的概率,不要把它当最终监督信号;有噪声的伪标签可以在预训练阶段用,进入正式训练前必须经过人工确认。
4.2 训练命令与必调参数
我用 YOLOv8 训练垃圾检测模型时,通常从 s 而不是 n 起步。n 对小目标漏检严重;m 对小目标更好,但需要更大 batch 和更长训练时间。基础命令如下:
yolo train \ data=garbage_data.yaml \ model=yolov8s.pt \ imgsz=640 \ batch=16 \ epochs=100 \ close_mosaic=10 \ patience=20 \ project=garbage_exp \ name=run1参数按垃圾场景的实际情况说明:
model=yolov8s.pt:加载 COCO 预训练权重,迁移效率远高于从零训练。如果你的垃圾类别与 COCO 重合度不高,仍然推荐用它初始化,因为低层特征可以迁移。imgsz=640:对烟蒂这种 16×16 像素的目标,640 输入下它只占图宽的 2.5%。显存足够时调到 960,小目标 AP 提升非常明显,代价是训练时间翻倍。close_mosaic=10:最后 10 个 epoch 关闭 mosaic。YOLOv8 的 mosaic 把 4 张图拼在一起,大量小目标在裁剪时被切碎,训练后期恢复真实分布有助于收敛。patience=20:连续 20 个 epoch 验证集无提升则早停,避免过拟合到重复帧。
显存不够时用batch=-1让 Ultralytics 自动探测最大 batch。我一般不推荐开rect=True,虽然它能省显存,但会让 batch 内做矩形 padding,导致尺度分布不稳定,与垃圾检测的小目标需求相冲突。
4.3 评估:小目标和大目标必须分开看
训练完成后第一件事不是看总 mAP,而是逐个类别看 AP:
yolo val model=garbage_exp/run1/weights/best.pt data=garbage_data.yaml imgsz=640输出结果中重点关注每类的mAP50和mAP50-95。垃圾检测最常见的失败模式是某个小目标类别 AP50 低于 0.5,而瓶子、砖块这类大目标 AP50 超过 0.85。出现这种两极分化,先不要调模型,回去看标注框的面积分布:如果烟蒂类超过 90% 的框面积小于 32×32,且样本量不足 100,补数据比调参更有效。
混淆矩阵也要打开。垃圾类别中最常互相串的是塑料袋和泡沫、布料和渔网。如果 val 集显示这两个类互相误判率超过 20%,优先怀疑标注边界不一致,而不是模型能力不够。此时重新抽看原始图,往往会发现当初类别树就没定清楚。
5. 部署前最后一步:给垃圾检测数据集做定向增强
5.1 Copy-Paste 增强长尾类
垃圾检测与其他场景不同:垃圾目标常孤立出现,遮挡少,适合把同一目标复制到多个背景中。这比从零采集更多“同目标不同环境”的照片便宜得多。常见做法是用 Python 读取已有标注框,把目标裁剪并旋转后粘贴到另一张无该目标的前景图上,同时把新框写入标签。贴小目标时注意做轻微的缩放和亮度扰动,否则模型会学习到“复制品”的固定纹理。
5.2 用光照和天气扰动提升泛化
垃圾素材大多来自晴天白天,雨天、逆光、黄昏场景严重量不足。可以在训练流程里加随机亮度和对比度扰动,也可以直接用 albumentations 的随机伽马变换模拟不同光照。水面漂浮垃圾还要加模糊和细小雨纹噪声,这类增强对岸线巡检视频尤其有效。我的经验是:增强幅度要克制,过强的 hue 扰动会让模型把“绿色树叶”和“绿色瓶子”混在一起。
5.3 验证增强是否有效,不看总 mAP 看三类指标
每次增学改动后,做一次差分验证:同一套 train/val 划分,只开或关某项增强,分别训练到收敛,对比三类指标——每类 AP、漏检率、误检框数。漏检率可以用模型在难例集上的召回替代,误检框数则直接数验证集里置信度大于 0.5 的错框。
如果 Copy-Paste 只提升了长尾类的 AP,却没有拉低其他类,说明增强方向正确;如果总 mAP 没变但烟蒂类 AP50 从 0.35 升到 0.42,这比总 mAP 上升 0.02 更有价值,因为你真正要服务的是真实巡检里那些小到几乎看不见的目标。
本文还有配套的精品资源,点击获取