资讯动态

城市街道垃圾检测YOLO数据集构建全流程:采集、标注、训练与避坑指南

发布时间:2026/10/21 22:04:45 来源:尧图企业网站定制
直接讲吧。城市街道垃圾检测这个方向这几年的热度一直在往上走。无论是智慧城市项目、环卫精细化管理还是机器人自主巡检底层都缺不了一样东西——高质量的数据集。而YOLO系列由于部署友好、精度可观几乎成了这类落地项目的默认算法选型。这次想聊的就是围绕“城市街道垃圾检测数据集YOLO”从零搭建一套可用数据资产的全过程包括数据怎么采、标注怎么做、格式怎么转、训练怎么调以及那些文档里很少写但实践中一定会踩的坑。1. 项目背景与数据集的核心价值1.1 城市街道垃圾检测到底在解决什么问题市容环境管理长期依赖人工巡查环卫工人按片区清扫、管理人员随机抽查这种模式的问题在于信息滞后。某条街道出现散落垃圾可能要等到下一次巡检才会被发现。如果换成固定摄像头加算法实时识别或者让巡检车上装一套边缘计算设备情况就完全不同了。检测模型可以做到在垃圾出现的几分钟内就触发告警并附带准确的类别和位置信息。这里说的垃圾检测不是简单的“有无垃圾”二分类而是要做多类别的目标检测。常见的类别包括塑料瓶、易拉罐、纸屑、烟蒂、塑料袋、玻璃瓶、果皮、大件废弃物等。不同类别的处理优先级不同对算法模型的要求也不同。比如烟蒂体积小、颜色杂检测难度就比塑料瓶大得多如果边缘设备上还要求实时推理模型的参数量和计算量也会限制死。数据集的构建本质上就是在为这种复杂场景下的识别难题提供“燃料”。1.2 为什么选YOLO作为检测方案目标检测领域可选方案不少两阶段的Faster R-CNN、单阶段的SSD、基于Transformer的DETR、以及YOLO全系列。但真正在边缘场景大规模落地的还是YOLO。原因很直接。YOLO把目标检测当成回归问题来做单次前向传播就能同时输出所有目标的类别和边界框。它不需要像Faster R-CNN那样先提取候选区域再逐区域分类天然就快一个数量级。YOLOv5之后Ultralytics的生态把训练、验证、导出、部署整条链路打通了对工程人员极其友好。YOLOv8更是把检测、分割、姿态估计统一到一个框架下。到了YOLO11精度和速度之间又取得了更好的平衡。对于街道垃圾这种目标不算太小、类别不算太多的任务YOLO的性价比是最高的。而且YOLO的社区资源太丰富了。预训练权重随处可得出了问题搜一下基本上都能找到解决方案这对项目周期短、人手有限的团队来说是决定性的优势。1.3 数据规模与场景设计的预期目标一个能用的城市街道垃圾检测数据集至少要覆盖几千张真实街道场景图像每张图像平均包含3到10个目标实例。数量太少模型连拟合都困难数量够了但场景单一模型换个街道就“失灵”。所以在项目设计阶段就要把场景因素拆开考虑光照晴天、阴天、傍晚、夜间路灯照明下的垃圾。时间落叶和非垃圾物体带来的干扰一日不同时段的影子变化。环境商业街、居民区、公园步道、学校周边、菜市场附近。状态堆放成堆的垃圾、单件散落的垃圾、垃圾桶外溢的垃圾、被风刮到路沿的垃圾。我见过一些做出来的数据集精度报告很漂亮mAP能到0.85以上但拿到另一个城市的真实街道上一测直接掉到0.5以下。原因就是采集场景太单一模型学到的其实是“特定路面上出现的特定物体”而不是“垃圾”本身的通用特征。设计数据集时场景广度比数量更重要这话我说过很多次但每次都要再说一遍。2. 数据集构建采集策略与标注规范2.1 图像采集的核心原则采集是垃圾检测数据集最容易出问题的环节。很多人以为随便网上扒几千张图就行结果版权有争议不说场景分布也完全不可控。更推荐的做法是项目组自己组织采集配合公开数据源做补充。自己采集时有几个原则一定要守住。第一分辨率要统一高于检测目标的最小可辨识尺寸。如果模型输入是640x640原图分辨率不能低于1280x720否则小目标比如烟蒂缩放到输入尺寸后只剩几个像素神仙算法来了也白搭。实测下来1920x1080或更高分辨率的图像训练效果最稳。第二同一个场景不要连续帧截图。连续帧之间的差异太小等于在复制数据还会让验证集的评估虚高。正确做法是间隔时间采样或者同一位置变换角度拍摄。例如在一段300米长的街道上以50米为间隔每次拍摄3个角度这样得到的数据多样性远胜于在原地连拍100张。第三必须派人去街道上实际拍摄覆盖不同时段。室内办公桌和室外光照下的同一类垃圾视觉特征差异巨大。我倾向于安排至少2轮实拍第一轮按初步类别清单覆盖主要垃圾类型第二轮专门补拍第一轮中识别失败或漏检的样本。每个点位、每个类别都需要拍摄超过30张图片才能支撑有效的增广。2.2 类别体系的确定与边界情形处理类别体系是数据集的骨架。这里面有一个反复出现的设计纠葛类别定得粗还是细。定得细比如把“塑料瓶”细分为“透明塑料瓶”“白色塑料瓶”“彩色塑料瓶”模型理论上能学得更精细但对标注工作量和算力都是压力而且类别之间边界模糊会带来大量标注噪声。定得粗比如全部归为“垃圾”倒是简单可建不了精准业务。折中的做法是按下表核心类别来划分基本能在业务实用性和模型可学性之间取得平衡。类别ID类别名称包含对象举例难度评级0plastic_bottle透明/半透明饮料瓶、纯净水空瓶中1can易拉罐、金属罐、铁皮罐中2paper废纸团、纸箱碎片、传单纸屑低3plastic_bag塑料袋、包装袋、外卖袋高4cigarette_butt烟蒂、烟盒碎片极高5glass_bottle啤酒瓶、饮料玻璃瓶中6fruit_waste果皮、果核、剩余食物中7bulky_waste旧家具、家电包装箱、装修废料低边界情形对于垃圾检测数据集来说尤其多发。比如一个塑料瓶的瓶身和瓶盖材质不同但同属一个实例标注时仍然应该框成一个框而不是拆成两个目标一个塑料袋里装着纸屑优先框塑料袋本身另一个类别的目标若被完全遮挡住则不单独标注两个目标如果重叠面积太大一般按可见度来判断是否遗漏标注如果完全被遮挡且不具备独立识别性就跳过而像路边停着的自行车、树叶、排水箅子等容易被误判为垃圾的“干扰类”不建议单独开类但需要在场景样本中留有足够的实例数量让模型学会区分。2.3 标注工具选择与质量审核流程标注工具我最常用的有两个开源的LabelImg适合单人小批量和X-AnyLabeling支持自动辅助标注适合中大批量。X-AnyLabeling在加载一个初始模型之后会自动给出预标注框人工只需要修正边界和漏检目标。这个辅助能缩短20%-30%的标注时间但千万别完全信任预标注框——自动标注的目标框偏大或偏小是常事必须逐个检查。标注格式方面LabelImg默认输出VOC XML格式X-AnyLabeling功能更强可以导出COCO JSON或YOLO TXT格式。为了方便后续训练这里我建议全部统一为YOLO TXT格式另外再额外生成一份VOC格式用于二次校验和备份。YOLO格式每行5个数字class_id、x_center、y_center、width、height均为归一化后的浮点数。需要注意的坑是坐标归一化是基于原图尺寸的宽和高分别进行的不是基于同一缩放因子。也就是说x_center除以图宽y_center除以图高这两个式子要分开写不是直接除以图像对角线长度也不是除以同一值。总有标注工具导出脚本在这一点上搞混检查时尤其要警惕。质量审核机制比工具本身更重要。我的做法是“双人交叉抽检”两个人分别独立标注同一批样本对比一致性不一致的框数除以总框数得出分歧率。理想状态分歧率应低于5%如果超过10%说明标注规范文档本身写得不够清楚或者类别边界太模糊需要先调整规范再继续标。全部标注完成后还要做一轮全量检查重点是边界框是否贴合目标边界、是否存在漏标、类别标签是否有明显误标。3. YOLO格式转换与数据划分策略3.1 从源数据到YOLO训练目录的标准化流程不管采集的图像格式是JPG还是PNG标注结果是VOC XML还是COCO JSON最终进入YOLO训练流程前必须转换成统一的目录结构。YOLOv5、YOLOv8、YOLO11等主流版本对数据集目录的要求高度一致dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/images和labels目录一一对应图像文件名与标签文件名同名但扩展名不同。比如一张图片叫street_0001.jpg它对应的标签文件就是street_0001.txt。如果某张图片没有任何检测目标对应的txt文件内容为空——这里有个细节训练时最好把这个空标签文件也保留或者更稳妥的是干脆删除该图像避免YOLO训练时因空标签而出现无意义的本底损失。数据划分的比例和策略要特别注意。划分的单位应该是图像而不是目标或者某一条标注记录。我建议按8:1:1的比例切分训练集、验证集、测试集并且切分要基于目录下所有的图像。不过如果图片总数太少比如只有2000张那么固定比例切分出来的测试集仍然偏小这时候建议用K折交叉验证来评估模型稳定性。划分还有一个经常被忽略的要求——同一条街道、同一个时间点、位置接近的图像要尽量放进同一个集合。如果不这样做训练集和验证集里会出现极其相似的“场景近亲”验证集精度会虚高等模型部署到新街道上马上露馅。所以不要做纯随机切分最好按采集点或者按位置做group划分。具体可以分两步先把所有图像按照场景标签分组再把整组随机分配到train/val/test中。3.2 标签文件的格式细节与校验脚本YOLO标签文件是纯文本每一行一个目标实例。比如0 0.623437 0.741197 0.078125 0.146875 2 0.215217 0.485676 0.181818 0.187639第一位是类别ID后四位是归一化的中心点x、中心点y、宽度w、高度h。这些都必须是0到1之间的浮点数。反复出现的问题包括框越过图像边界导致w或h大于1或者中心点坐标恰好落在图像外坐标是负数文件名扩展名大小写不一致.JPG和.jpg在Linux下都会被系统识别为完全不同的文件。标准做法是写一个小脚本用Python库比如OpenCV或Pillow解析每张图片的尺寸再逐条验证标签坐标的合法性。验证不通过的重新生成标签而不是直接丢弃因为这类问题往往是标注工具导出时的系统性偏差修好脚本就能批量修复。常见的缺陷数据大概有3类标签框宽或高为0的单条实例、中心点坐标出现负值的单条实例、以及类别ID超出类别总数的整行记录。3.3 数据清洗与重复样本消除网上下载或第三方公开数据集拿过来的数据清洗是必不可少的一步。重复样本一般有两种完全相同的图像文件和内容相似但经过了裁剪或滤镜处理的变化版本。后者更隐蔽因为文件名不同、MD5不同但视觉上几乎一样。快速清洗方法是先对图像分红绿蓝三色直方图特征然后用感知哈希算法perceptual hash简称pHash算指纹最后计算汉明距离。汉明距离小于等于5就视为近似重复手动确认一遍。这一步有时候能直接砍掉10%对模型泛化能力的帮助非常显著。清理完成后要同步更新对应的标签文件否则会出现图像文件和标签文件不同步的脏数据。数据集的去重不只是为了省存储更核心的原因是防止评估虚高验证集里如果出现训练集图像的轻微变体模型对这些图像的检测准确率天然更高直接污染了mAP的可信度。这一点对实际落地的项目来说至关重要。4. 训练配置与调参实操4.1 模型选型YOLOv5/YOLOv8/YOLO11怎么判断选取哪个YOLO版本取决于你的算力平台和部署目标。YOLOv5是很多人的老朋友了生态非常成熟端侧部署资料丰富但它的工程结构比较老在性能上目前处于落后状态建议新项目直接跳过。YOLOv8的优势是工程体验好、配置统一分类、检测、分割都在一个环境里搞定是目前综合性价比最高的选择。YOLO11是最新的大版本在精度上相比YOLOv8有一定提升但具体提升幅度取决于任务和数据量如果追求最新特性可以优先尝试。模型尺寸n/s/m/l/x的选择取决于算力和时延要求。推荐的做法是从一个中等尺寸的模型起步比如YOLOv8s。这个模型的训练速度与精度折中是最稳的用它先跑通全流程、拿到baseline如果推理速度快于需求再尝试体积更小的n版本做压缩如果精度不达标再上m或l版本。根据我的经验街道场景垃圾检测任务中从s跳到l的收益往往不超过4到5个百分点但推理时延和显存占用会成倍上升所以没必要一上来就冲最大号模型。4.2 参数配置与完整训练命令参考以下是一个已经过一轮调优后的YOLOv8训练配置供参考。实际experiment时按路径和类别数替换即可。# street_garbage.yaml path: ./datasets/street_garbage/ train: images/train val: images/val test: images/test nc: 8 names: 0: plastic_bottle 1: can 2: paper 3: plastic_bag 4: cigarette_butt 5: glass_bottle 6: fruit_waste 7: bulky_waste配置文件里有两个经常被忽略的细节validtrain和val的路径是相对于datasets目录的不是相对于项目根目录的如果Config路径搞错YOLO训练出来的模型会直接用 COCO的80类框架损失函数计算时会出现类别维度不匹配的报错。另一个是验证集和测试集的路径不显式写test时验证会直接在val上进行如果没有分隔开模型的最终测试结果参考价值就很低。训练命令大致是yolo detect train datastreet_garbage.yaml modelyolov8s.pt epochs150 imgsz640 batch32 lr00.01 patience30其中imgsz是训练时缩放到输入尺寸非常关键与推理尺寸必须保持接近否则性能会打折扣。batch大小受显存限制一个经验值是24GB显存能够容纳32的batch跑yolov8s显存不足时优先减小batch不要急着换小模型因为batch太小会导致梯度不稳定。patience设为30让训练在验证集不再提升时早停既能节约时间又能防止过拟合。4.3 数据增强的思考与实践效果YOLO自带的数据增强本事就不小它默认开启了mosaic、平移、翻转、缩放、色彩调整等一堆操作。mosaic增强会把4张图拼成一张训练样本对小目标检测、多目标场景非常有用。街道垃圾场景里目标尺度差异大mosaic能强制模型学习到不同尺度下的目标特征所以要保留。但有两个增强选项要特别谨慎一个是degrees旋转增强垃圾桶等目标有很强的“正立”语义旋转角度建议控制在15度以内否则会产生大量正常人不会见到的倾斜垃圾反而扰乱判断另一个是hsv色彩增强垃圾在夜间的偏色问题很常见可适度增强但如果增过头了颜色的特异性会被破坏塑料瓶和玻璃瓶之间本来就靠颜色区分过度扭曲会造成误判。剪辑镜像fliplr随便开。但垂直翻转flipud建议关掉因为垃圾不会飞在空中。实际调参时数据增强的效果需要配合多轮实验来比较。可以先在增强全开的情况下跑50个epoch观察验证集loss是否有明显抖动如果抖动剧烈就逐步关掉旋转和色彩增强看谁在拉垮指标。这是最直接的排查思路。4.4 模型评估指标的重要性与解读YOLO训练完成后评估主要看三个指标精确率Precision、召回率Recall和mAP50IoU0.5时的平均精度。这三个指标都有报告但业务人员很容易被漂亮的综合mAP欺骗。以街道垃圾为例mAP50达到0.82看起来不错但打开每个类别的精度表会发现烟蒂的AP可能只有0.65而塑料瓶的AP是0.92。这意味着路边烟蒂的漏报率远高于塑料瓶而烟蒂恰恰可能是街道环卫考核扣分最集中的目标。因此评估必须按类别去看而不能只看综合指标。业务上如果更关注漏检率该检出的垃圾没检出来那么重点看Recall如果更关注误报率把地砖裂缝、树叶等误判为垃圾那么重点看Precision。两者的优先级与后端人工核查成本挂钩可以在调参时设置不同的置信度阈值来匹配业务需求。如果要验证模型的泛化能力最有说服力的做法是拿一段完全没有参与训练的视频流时序上采帧检测画一条检测随时间的置信度变化曲线。如果置信度前期抖动很大、后段趋于平稳说明模型对新场景还算稳健如果某几条街道上的置信度系统性偏低这往往是场景覆盖不够需要单独补那些街道的训练图像。5. 常见问题与排查技巧5.1 小目标漏检烟蒂、瓶盖从哪里改进小目标漏检是街道垃圾检测模型最普遍的痛点。烟蒂、瓶盖这类目标在640x640输入尺寸下往往只占据几十个像素特征信息太少特征图在多层下采样之后几乎丢失干净。排查思路是分层级解决提高输入分辨率比如从640提升到960或1280这直接改善小目标的可辨识性。代价是显存占用和推理延迟上升要在设备允许条件下使用。调整ANCHOR不过YOLOv8已经改成自适应锚框所以手动调锚框的意义不大但如果用的是YOLOv5就需要检查默认锚框是否覆盖小目标尺寸。数据层面对小目标实例做过采样。统计一下整个数据集里目标框小于输入尺寸5%的实例占比如果低于总实例数的3%说明小目标样本量不足可以用copypaste增强把某个图像的小目标复制到新背景上既增加实例数量又增加场景多样性。训练后做一次confusion matrix分析重点看小目标被误判成哪些类别再对照错误样本修正数据集比如烟蒂如果误判为纸屑就要补充烟蒂在偏白背景下的样本。5.2 夜间与强光条件下的检测退化白天训练的模型到夜间场景往往精度骤降。这不是模型的问题是数据分布变了。解决方案不是祈祷模型自动泛化而是老老实实补充夜间采集的样本。夜间图像建议做两种标注一是普通目标框标注与白天一致二是对低照度下肉眼都看不清的目标可以先不标但完全不标不代表模型不会学习到建议在训练时加入“夜间增广”即把白天图像随机降低亮度、增加噪声模拟夜间效果。真实的夜间数据仍然是最可靠的合成数据只能作为补充。有时候摄像头本身带红外补光垃圾在红外下的反射特征和可见光完全不同这种情况下合成增广基本无效一定要有真实的红外图像数据。5.3 训练Loss异常与显存溢出排查训练没跑几步Loss变成nan或者loss完全不下降这是目标检测训练中最恶劣的两种失败。排查顺序是有讲究的Loss为nan优先检查学习率。如果learning rate设置太高比如0.1以上很容易梯度爆炸。解决方法是降低学习率到原来的1/10再逐步回升。其次检查数据集看看有没有标签坐标超出边界或类别ID超范围的数据YOLO的pytorch接口通常会在DataLoader阶段刚性报错所以在训练前跑一遍criterion检查脚本就能提早发现。显存溢出常见于大分辨率训练和小的batch大模型。YOLO的默认多卡训练会把batch分配到每张卡上如果只有单卡而batch64很可能OOM。解决办法是把batch减小、或者开启梯度累积。YOLO训练多个epoch时的显存需求并不完全一致图片缩放后目标数量差距大的小batch也会导致显存波动所以统一裁剪到相同尺寸比不定尺寸训练更稳定。5.4 误报集中垃圾桶与排水箅子最后讲一个最容易被低估的业务痛点误报。垃圾桶本身不算垃圾但在垃圾检测数据里经常出现。如果训练集的垃圾桶样本都关联着“无垃圾标签”模型容易把垃圾桶本身当成垃圾特征。这是标签冲突。处理办法有两条路。一是把垃圾桶作为单独背景类加入训练但不做检测输出只是让模型在特征层面学会“垃圾桶不是垃圾”二是在部署后的告警逻辑里叠加一个简单的后规则如果检测框和已知垃圾桶位置的匹配度太高就降低该框的置信度。两条路可以同时用但第一种在模型层面更干净。排水箅子道路边排水口在很多场景下长得像深色方块也容易引起误报。要减少这类误报建议在采集时专门多拍排水箅子、树影、井盖这些负样本并确保负样本也进入了训练集目录。YOLO训练时负样本不会被计算损失但模型在推理时能学会不把它当成目标吗实际上YOLO默认的ignore机制允许背景信息参与学习只是提供负样本本身并不能直接保证模型不误报对于这些困惑样本可以直接把它们放入验证集中人工判断。实践上最有效的还是叠加规则或判断置信度阈值。6. 数据集落地后的扩展与维护6.1 新增类别与增量训练的策略街道垃圾类型不可能靠一次采集就穷尽项目上线后一定会有新类别出现。这时候无需把整个流程重跑一遍但也不建议只拿新类别的数十张图在原模型上微调那样会造成严重的类别不平衡导致旧类别精度明显下滑。稳妥的做法是把新类别样本和部分旧类别样本混合形成一个小型增量集然后在原权重上继续训练若干epoch。学习率调低到原始训练时的1/10例如原始是0.01这次可以设0.001其他参数尽量保持一致。新旧数据集合并后重新划分验证集避免增量集和原始训练集重叠区域过大使验证失去意义。这样增量训练后新类别的AP会提升旧类别的AP会轻微下降但不会完全崩塌。6.2 发布标准与文档化数据集的最终交付形态不只是图片和标签文件还包括一张说明卡片。建议包含以下字段类别定义与边界说明、采集时间范围、地理覆盖范围、训练集/验证集/测试集图像数量和实例数量、标注版本、已知的类别混淆情况、以及原始标注工具和质检报告摘要。有了这张卡片后续接手的人才不会一头雾水。关于发布共享如果条件允许可以挑出一个脱敏版本发布到公开社区图像中不包含人脸、车牌等个人隐私信息地点信息只精确到城市级不出现小区名和详细路名。公开版本的类别体系可以简化为6类或8类之外的通用类别与业务版本做区分。这些是数据合规的基础操作。6.3 从检测到业务的最后一公里数据集和模型训练只是整个系统的一半另一半是把检测结果转成业务动作。模型输出的每个检测框都附带置信度业务系统可以根据置信度设置分级告警置信度高于0.8的垃圾直推保洁班长处理置信度在0.5到0.8之间的进入队列等待人工复核置信度低于0.5的不推送。这是我在真实项目里进行过的最简单也最有效的一招能降低80%的无谓调度。同时建议在告警时给置信度加一个阈值滞后机制。单个摄像头场景下同一位置的目标连续检出5次以上才触发一次告警避免垃圾还没被清扫前每帧都推送重复消息把摄像头和调度后台都逼疯。很多人喜欢直接把模型的输出接告警完全没有考虑时间维度的消抖这是路边项目和老练项目的一个分水岭。最后说点个人体会做城市街道垃圾检测数据集前期最费功夫的其实不是训练模型而是把采集、标注、清洗、校验这套数据工序真正立起来。数据质量决定模型上限这句话在垃圾检测这种长尾分布极其明显的任务上体现得淋漓尽致。烟蒂类别如果能有500个以上样本且标注准确率超过98%哪怕直接拿yolov8s跑效果也比那些标注粗糙的万级数据集强。我个人习惯在每次模型训练前都快速跑一遍数据分布统计脚本检查每个类别的实例数和框面积分布确认没有明显的类别失衡后再动手。这种“先体检再训练”的习惯帮我省下的时间远比花掉的要多。我自己在实际操作中还有一个比较受用的习惯每次模型迭代完我都会保留训练日志、最终权重、以及对应的数据集版本号命名。比如“street_v2.3_yolov8s_640”看起来有点啰嗦但三个月后回看时你能迅速定位到是哪个数据版本跑出的哪个结果这对调参和复现的帮助极大而且对客户汇报时的数据可追溯性也无价。最后提一个建议如果你的数据集还在起步阶段尽量别把时间花在选择完美模型结构上先把YOLOv8s跑通一个端到端的流程再去优化细节。这套流程比你反复比较YOLOv8和YOLO11谁更强重要得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑