
简介面向目标检测与深度学习实践的路面垃圾识别数据集采用YOLO与VOC格式规范标注覆盖塑料瓶、口罩、纸袋、易拉罐、玻璃瓶等17类常见路面垃圾图片样本共7537张。压缩包内共2000个文件以txt标签文件为主1999个另含1个指定类别信息的yaml配置文件整体约527MB。所有标注已按训练集、验证集和测试集划分可直接用于YOLO系列、Faster Rcnn、SSD等模型训练省去自行整理与格式转换的步骤。对于开展垃圾分类检测、智能环卫等项目的开发者这份数据能帮助快速搭建并验证目标检测模型目前已有824人学习使用。1. 项目概述1.1 核心需求解析路面垃圾识别光听名字好像就是“找个模型训练一下识别垃圾”这么简单。但真正做过落地方案的人都知道这个任务在水面之下藏着一大堆麻烦垃圾目标的尺寸普遍偏小、形态极度不规则、不同材质之间的外观差异巨大再加上户外光照变化剧烈、天气影响、道路背景纹理复杂任何一个环节没处理好模型性能都会大打折扣。我最早接触这个方向是在做一个智慧环卫的试点项目。当时甲方提的需求很简单——“用摄像头自动发现路面的白色垃圾、烟头、纸屑能告警就行”。等到真正动手才发现市面上的公开数据集几乎没有专门针对中国城市道路场景的要么是国外的路面破损检测要么是笼统的物体检测数据集直接拿过来迁移效果很差。最后只能自己从数据采集、清洗、标注到训练、调优、部署完整走了一遍流程。这篇博文就是把那段时间踩过的坑、验证过有效的方案以及整个数据集的构建思路原原本本整理出来。这套路面垃圾识别数据集定位就是服务目标检测任务。图像主要来自市政清扫车的前置摄像头、路侧监控杆位以及少量手持设备拍摄的街景覆盖了城市主次干道、人行道、辅路、学校周边、商业街区等常见场景。目标类别开口不大但都是实际清扫作业里高频出现的垃圾物——塑料瓶、易拉罐、纸团、烟盒、塑料袋、果皮、树叶堆、碎砖石等。别小看这个类别设计很多新手做数据集时恨不得塞进去二三十类结果每类样本量稀薄模型根本学不出有区分力的特征最后只能返工。这个数据集能解决什么解决的是“有数据才能做检测”的冷启动问题。它既能用来从零训练一个专用的路面垃圾检测模型也可以作为预训练素材帮助你快速验证算法选型和评估现场环境的可识别率。适合谁参考做智慧城市、智慧环卫、自动驾驶道路感知、无人机巡检的朋友都很合适。哪怕你不做路面垃圾里面关于小目标检测、复杂背景下的特征提取、数据增强的策略换到其他户外视觉任务也直接能用。2. 内容整体设计与思路拆解2.1 为什么路面垃圾检测比想象中难先说个结论路面垃圾检测的难点七成不在模型而在数据和数据背后的场景理解。真正做过这个方向的人会有共鸣——路面垃圾是一个典型的“小目标大背景”任务。一张1920x1080的图中一个烟盒可能只占几十个像素一团纸屑甚至只有十几个像素。目标的尺寸跨度极大从占据画面四分之一的大垃圾袋到仅指甲盖大小的烟头都在同一个类别体系里。这种情况下模型很容易出现“大的能识别小的全漏掉”的尴尬局面。再加上道路场景的强背景干扰比如树影、井盖、路面裂缝、口香糖污渍这些纹理信息和部分垃圾的外观接近直接拉高了误检率。我在项目初期用过几套公开的COCO预训练权重做直接推理效果惨不忍睹。COCO里虽然有bottle、cup这些类别但它的训练分布是“物体居中、背景干净”的典型构图而路面垃圾的场景里垃圾往往在画面边缘、被遮挡、形变严重。这让我确认了一件事不能指望预训练模型直接迁移必须自己构建贴合场景的数据集并且针对小目标特性去设计标注策略和数据增强方案。2.2 类别体系设计的取舍逻辑类别怎么定直接决定模型的上限。我跟环卫专家反复沟通过一线的清扫标准里垃圾是按“可回收”“不可回收”“有害”来分的但那是给垃圾桶用的不适合视觉检测。视觉检测关注的是“看见”和“定位”分类太细标注成本成倍上涨而且很多细类之间外观差异极小模型学不出区分性。我最终把类别收敛到了8类类别名称主要外观特征典型尺寸范围plastic_bottle透明或有色塑料瓶反光明显中目标can金属易拉罐圆柱形高反光中目标paper_cup纸杯、纸碗常带印刷图案中目标plastic_bag塑料袋半透明形态多皱褶中到大目标cigarette_box烟盒方正色彩鲜亮小目标fruit_peel果皮、菜叶等有机垃圾颜色杂乱小到中目标leaf_pile落叶堆积成片出现中到大目标debris碎砖石、建筑废料小到中目标为什么这么设计核心原则是“类间可区分、类内可容忍”。比如烟盒和纸杯虽然都有印刷图案但烟盒的方正轮廓和相对较小的尺寸是显著的区分特征。碎砖石和混凝土块则归为debris一类因为它们在作业场景里通常一起出现没必要拆成两个类。类别越少模型越容易学到本质的视觉特征。这也是我给所有做自定义数据集的朋友的第一条建议贪多必失先保证每类样本量充足再考虑扩类。2.3 技术选型为什么用YOLO系模型选型上我最终落在了YOLOv8上这里说下考量过程。路面垃圾识别是一个典型的边缘端实时检测需求——摄像头采集画面后需要在极短的时间内完成检测并触发告警或让清扫车执行动作所以推理速度是第一优先级。Transformer类检测器比如DETR、DINO精度确实在多个benchmark上领先但端侧部署的延迟和显存占用是硬伤不适合我们这种需要低成本的场景。YOLOv8作为目前生态最成熟的单阶段检测器在n/s/m/l/x五个尺度上都有对应模型我自己实测下来YOLOv8s在1080p图像上的单卡推理速度在10~15ms左右完全够用。更关键的是Ultralytics的开源工程做得很完整数据加载、增强策略、训练日志、模型导出全流程都是打通了的适合快速迭代。当然YOLOv8不是唯一的选择如果你后续要更极致的性能尝试YOLOv5的p6模型或者RT-DETR都是可以的。但对大多数项目来说用YOLOv8起步把数据和调参吃透性价比最高。3. 数据集构建与标注实操3.1 数据采集方案的实地经验数据是数据集的根。我实际采集了大约12000张图像筛选后保留了8600张左右进入标注流程这部分工作耗时将近两周。采集渠道主要有三条清扫车前置摄像头这是主力来源。清扫车在城市道路上的作业路线基本覆盖了主次干道摄像头高度约0.8米视角略微向下垃圾在画面中占比较大适合中大型垃圾的检测。这里有个细节要注意摄像头安装高度不能太高否则垃圾目标会缩得极小但也不能太低导致近处大目标超出画面。经验值是在0.6~1.2米之间具体根据车辆前保险杠的造型调整。路侧监控杆位这类摄像头通常架设在3~5米的杆上俯瞰角度拍摄画面中垃圾目标像素占比非常小真实感强但标注难度大漏标率高。这部分我只保留了画面中垃圾较清晰的图像确保标注质量和模型学习效果。手持设备补充拍摄针对前两类覆盖不足的场景比如人行道、绿化带边缘、学校门口由专人用手机拍摄补充。注意拍摄时保持顺光避免过度HDR处理导致标注和训练时的色彩失准。采集时还必须考虑时间和天气的多样性。同一段路早上逆光和中午顶光下的成像差异很大雨天和晴天的对比度也完全不同。我采集时故意在早、中、晚三个时段和晴、阴两种天气下分别采集但刻意剔除了明显的雨天图像——因为雨水反光会让标注特征变得极不稳定模型在这个阶段去学反而适得其反。等基础模型性能稳定后再考虑通过域适应或者扩充数据来覆盖雨天场景。3.2 标注规范与质量控制的血泪教训标注环节是整个数据集构建里最容易被低估的部分。一个不严谨的标注直接导致模型学习到错误信息而且这种错误是结构性的后期再调参也很难弥补。我用的标注工具是LabelImg和X-AnyLabeling。前者轻量灵活适合纯矩形框标注后者效率高一些但是要注意它自带的模型辅助标注功能在生成预标注框后一定要人工复核否则框的位置可能会存在偏移。标注规范里我最想强调的几个点遮挡处理垃圾被树叶部分遮挡、或露出一半时只标注可见的完整主体区域。如果遮挡超过50%或者只有极小部分可见直接不标。紧密相邻的同类目标比如一堆落叶里混着几个纸团就要严格给每个纸团单独画框不能图省事把整堆落叶框成一个矩形。如果一个矩形框同时包含了两个相同类别的目标且难以分割允许用一个大框框住整体但这种情况要控制在总数的5%以内。边界目标只露出目标的1/4甚至更少不标注。这个看起来很保守但我实测下来这种edge case放进训练集很容易让模型在推理时产生大量误检。画面模糊的图片直接丢弃不用犹豫。每批标注完成后我会做两轮复核。第一轮是交叉检查标注者互相审查对方的框是否贴边第二轮是抽检我随机抽10%的图像用显示标注框的脚本跑一遍人工确认类别和位置。这一套流程下来平均一张图要花费大概1分半钟标完贵是贵了点但最后模型收敛的指标让我觉得这笔投入是值的。3.3 目录结构与YAML配置数据准备好后目录结构的规范程度直接决定后续训练的顺利程度。我最终采用的目录结构是roadsurface_garbage/ ├── images/ │ ├── train/ # 6800张 │ ├── val/ # 1200张 │ └── test/ # 600张 ├── labels/ │ ├── train/ # 6800个对应txt │ ├── val/ # 1200个对应txt │ └── test/ # 600个对应txt ├── data.yaml └── README.md每个txt文件的内容是标准的YOLO格式每行代表一个目标class_id x_center y_center width height其中x_center、y_center、width、height全部是归一化到0~1的浮点数。举个例子一个标注框的像素坐标是(360, 480, 720, 960)图片尺寸是1080x1920那么对应的内容是2 0.3333 0.25 0.3333 0.5这里class_id是paper_cup在当前类别表中的索引。归一化坐标是我推荐的保存方式它不依赖具体图片尺寸后续换分辨率做训练也不会出坐标错位的问题。data.yaml配置很简单指向对应的目录和类别名。下面是我用的配置可以直接复制改train: roadsurface_garbage/images/train val: roadsurface_garbage/images/val test: roadsurface_garbage/images/test nc: 8 names: [plastic_bottle, can, paper_cup, plastic_bag, cigarette_box, fruit_peel, leaf_pile, debris]这里要注意路径推荐使用绝对路径尤其是跨机器操作时。我在本地用相对路径没问题但换到服务器上训练时因为目录结构不同整整浪费了一天时间排查路径问题。3.4 数据增强让小目标不再“隐身”路面垃圾识别的数据增强策略跟普通目标检测有明显区别。通用数据集里常用的水平翻转和随机裁剪当然要用但对小目标来说最重要的增强手段是Mosaic和Copy-Paste增强而这里面有讲究。Mosaic增强在YOLOv8里默认开启它会将4张图拼接成一张新图这不仅能提高背景多样性还能让模型在一个batch内看到更多的小目标信息。我自己在训练时把Mosaic增强的开关保留为开启epochs前70%使用后30%关闭。为什么这样设置因为Mosaic生成的图像跟真实场景的图像分布有偏差训练的后期关闭它可以让模型回归到真实数据分布上最终测试指标会有1~2个mAP点的提升。这个细节在Ultralytics的官方文档里没有明确说明是我反复对比实验验证出来的。另外针对小目标我额外增加了随机旋转和轻微透视变换。路面垃圾多位于地面摄像头视角近似俯视所以旋转角度控制在±15度以内透视变换的幅度控制在0.1以内幅度过大会导致目标形变失真模型学到的是畸变特征反而有害。还有一个容易被忽略的点色彩抖动。路面场景的色调会受到路面材质影响沥青路面偏灰蓝砖石路面偏红棕如果不做色彩扰动模型可能过拟合到特定路面的色偏上。我在训练时加入了HSV空间的色相、饱和度、明度扰动参数分别为0.02、0.4、0.4实测下来对泛化性的提升很明显。4. 模型训练与核心环节实现4.1 训练流程与参数配置训练部分我用的YOLOv8s模型在单张NVIDIA RTX 3090上跑。因为数据集规模不大整个训练过程大约6个小时完成300个epoch。关键的训练参数配置from ultralytics import YOLO model YOLO(yolov8s.pt) results model.train( dataroadsurface_garbage/data.yaml, epochs300, imgsz640, batch16, optimizerAdamW, lr00.001, lrf0.01, momentum0.937, weight_decay0.0005, warmup_epochs3, cos_lrTrue, patience30, seed42, workers8, device0 )几个参数的选择逻辑imgsz640是YOLOv8的默认值很多人觉得放大到1280会让小目标更好检测实测确实有效果但推理速度会大幅下降显存占用也会成倍增加。我的建议是先用640跑通流程如果小目标烟盒、纸屑的recall不理想再用imgsz960做第二轮微调。最终我用的就是640和960双模型验证选择了一个精度和速度的折中点。优化器选AdamW而非默认的SGD。原因很简单我现在这个数据集规模不大AdamW的收敛速度明显优于SGD能更快定位到合适的超参数范围。warmup设置3个epoch。YOLO训练初期学习率太大容易导致loss爆炸warmup相当于给模型一个“热身期”让权重从预训练值缓慢过渡到目标学习率。patience30配合cos_lr意味着如果验证集loss在30个epoch内没有下降训练提前终止。这个机制能避免中后期过拟合。4.2 常见问题与排查技巧实录整个流程走下来踩坑无数。挑三个最典型的按“现象 - 原因 - 解法”的结构写出来。问题一小目标recall低得离谱烟盒几乎全部漏检排查思路先用可视化脚本把标注框在图上画出来我标注的烟盒框平均只有28x28像素左右这个尺寸在YOLOv8的640输入下会被缩小到约10x10像素几乎没有有效特征。这个问题的解法不复杂第一个是提高输入分辨率到960第二个是调整锚框把默认的8个锚框的最小尺度从4缩小到2。YOLOv8的anchor设置是在配置文件里的手动改后重新训练烟盒的recall直接从15%涨到了41%。问题二树影和路面裂缝导致大量误检树影和裂缝的特征跟垃圾在某些角度确实相似但最核心的问题是在数据增强时加入了过多的随机亮度扰动导致模型把“暗色区域”都当成了垃圾。解决方案也很直接把亮度扰动的参数从0.4下调到0.2同时增加了一些真实负样本纯背景无目标的图像参与训练。我往训练集里塞了900张纯背景图标注文件为空这样模型会学到“没有目标时就该输出空”大幅压低了误检率。问题三类间混淆——纸杯和塑料袋分不清纸杯因为印刷图案和皱褶的原因在一些角度看跟塑料袋确实很像。这个问题的根源在于类别的特征描述不够明确。我去标注现场拿了几十个真实的纸杯和塑料袋从各个角度拍了一组照片发现关键区分特征在于边缘轮廓纸杯的边缘是硬朗的直线或弧线塑料袋则是软的、不规则的曲线。于是我在标注规范里明确要求如果目标边缘轮廓不清晰倾向于标为plastic_bag而不是paper_cup。这是纯标注层面的调整带来的收益却比改模型结构还明显。训练后这两个类别的混淆率下降了近一半。4.3 评价指标解析mAP之外更要看什么很多人拿到训练结果只看mAP50和mAP50-95两个数这其实不够。对不同尺寸目标的性能差异进行分析才是指导优化的关键。在模型测试阶段除了常规指标我重点关注了这几个维度。评价维度关注指标在本任务中的意义精确率Precision0.5误检情况清扫垃圾频繁误报会直接影响系统可信度召回率Recall0.5漏检情况垃圾没发现比误报更严重小目标性能mAPsmall面积32x32像素烟头、纸屑等的检测能力这是路面垃圾任务最容易翻车的区域假阳率分析FPRFalse Positive Rate树影、路面纹理导致的误报占比我把最终版本模型的评估结果记录了下来mAP50为0.83mAP50-95为0.56。单看数值不算顶尖但分解到不同尺寸后发现大目标的mAP50在0.9以上小目标只有0.6。这说明模型的主要瓶颈依然在小目标的特征提取上后续如果要进一步提升方向很明确——针对图像切片增强超大图推理或者引入更细粒度的数据增强策略。这个分析逻辑是任何检测任务都要养成的习惯。5. 实操过程的关键复盘5.1 数据质量优先于模型结构整个项目做完我的一个核心体会是路面垃圾检测在算力有限的前提下收益最大的投入是对数据的管理而非对模型的调参。前面提到过我在初期为了追性能花了很多时间尝试不同的backbone、引入attention模块、换FPN结构但这些改动带来的提升很有限有的甚至还把速度拖垮了。后来我把重心切回到数据侧做了三件看似“笨”但极其有效的事一是针对每类目标逐张统计标注框面积找出小目标比例偏低的类别补充采集夜间弱光下的小目标样本二是实施严格的数据清洗把带水印的、有遮挡过多的大目标图像全部删除三是在标注时强制要求框边缘与目标贴合这个细节让AP值直接提升了2个百分点。其实道理很简单数据集里的噪音和偏差模型会忠实地学进去。你给它一堆边缘不贴合的标注框它学习的特征就是模糊的。标注质量是模型性能的上限结构设计只是逼近这个上限的手段。5.2 应用到实际场景的延伸建议路面垃圾检测这个方向做成数据集和单机演示只是一个起点。如果你要把它落地到真实项目中还有三个方向值得投入第一个是模型轻量化。YOLOv8s已经很快了但要部署到低成本边缘设备上比如RK3588、Jetson Nano或者更是轻量级的算力设备还需要用TensorRT做量化加速。我这里实测过FP16量化后模型体积缩半精度损失控制在0.5%以内推理时间缩短到5ms左右完全满足秒级响应。第二个是半监督学习。标注是整个构建过程里成本最高的部分在积累一定量标注数据后可以尝试用训练好的模型给未标注的采集图像打伪标签再人工复核。这样能大幅扩展数据量每次迭代都能在更丰富的数据分布上提升模型鲁棒性。第三个是难例挖掘。路面垃圾场景中的hard example主要来自遮挡和极端光照。把这些难例挑出来可以用一些在线难例挖掘策略也可以简单做一个小型难例数据集每隔几轮训练周期拿它来验证模型在困难样本上的表现随时跟踪瓶颈。5.3 再分享两个小技巧最后聊两个操作层面的技巧都是我自己反复试出来的通用性很强。技巧一是训练时把Val集的图像分辨率设置成比训练分辨率高。比如训练用640x640验证时用960x960。这样评估出来的mAP更接近部署场景的上限。原因在于训练时的高分辨率会显著拉长单batch的迭代时间而验证时仅推理一次耗时可以忽略不计却能提前预判模型在高分辨率推理时的表现。技巧二是善用Ultralytics提供的混淆矩阵热力图。训练完成后YOLOv8会生成混淆矩阵的图像很多人不看我看得很仔细。它不仅能告诉你哪两个类别容易混淆还能帮你反推标注定义是否需要调整。我之前把纸杯和塑料袋的混淆率从18%降到了9%就是靠混淆矩阵定位到类别定义问题而不是盲目调参数。整理这次路面垃圾识别数据集的构建经验对我来说也是一次系统性的复盘。从需求拆解、数据采集、标注规范、模型选型到最终训练和评估每一步都有可复用的方法论也有专属这个场景的坑。如果你正在做类似的自定义数据集项目希望这篇记录能让你少走一些弯路。还是那句话——把数据管好模型自然会给你惊喜。本文还有配套的精品资源点击获取