
简介本资源是面向计算机视觉初学者与YOLOv5实践者的垃圾桶满溢检测专用数据集聚焦城市环卫智能化场景中的目标检测任务可直接用于模型训练、验证与部署。数据集严格遵循YOLOv5标准目录结构组织含训练集2680张400×500 RGB图像对应txt标签与验证集669张图像标签共3349个样本另附1个可视化脚本show.py支持一键加载任意图片并绘制三类边界框满溢垃圾桶、未满溢垃圾桶、散落垃圾便于快速检验标注质量与模型预测效果。压缩包总计2000个文件以1999个YOLO格式txt标签文件为主辅以1个即用型Python可视化工具整体大小313.44MB。目前已有448人学习下载结构规范、开箱即用显著降低数据预处理门槛特别适合目标检测入门实战、课程设计及轻量级边缘部署验证。1. 项目背景与核心价值最近在做一个智慧社区的项目其中一个核心需求就是自动识别垃圾桶的满溢状态。听起来简单但真上手才发现市面上现成的、标注好的“垃圾桶满溢”数据集几乎没有。要么是通用垃圾桶检测数据集不区分满溢状态要么是国外数据集垃圾桶类型和我们的差异巨大直接迁移效果很差。所以我们团队决定自己动手从零开始构建一个专门针对“垃圾桶满溢检测”的YOLOv5格式数据集。这个数据集的核心价值在于“场景专用”和“状态细分”。它不仅仅是检测“那里有个垃圾桶”而是精确判断这个垃圾桶当前是“空”、“未满”还是“已满溢”三种状态。这对于后续的智能环卫调度、垃圾清运路线优化至关重要。想象一下如果系统能精准知道哪个小区的哪个垃圾桶快满了清运车就可以按需、高效出动而不是定时定点盲目跑一圈这能节省大量的人力、油费和车辆损耗。我们最终整理并开源的数据集包含了3个类别empty空、not_full未满、overflow满溢。数据格式严格按照YOLOv5的要求来组织拿到手就能直接用于训练。在项目过程中我们踩了不少坑也总结了一套从数据采集、清洗、标注到格式转换和增强的完整流程。这篇文章我就把这些实战经验特别是那些在标准教程里不会细说的细节和技巧毫无保留地分享出来。2. 数据集构建全流程从原始图像到YOLO格式构建一个高质量的目标检测数据集远不止是拍几张照片、画几个框那么简单。它是一套系统工程每个环节都影响着最终模型的性能。下面我以我们的“垃圾桶满溢检测”项目为例拆解整个流程。2.1 数据采集真实性与多样性的平衡数据是模型的基石采集是第一道关。我们的目标是让模型在真实场景下鲁棒工作所以数据必须尽可能贴近实际。采集策略我们采用了“多时、多地、多条件”的采集原则。多时在不同时间段清晨、中午、傍晚、夜间进行采集以覆盖不同的光照条件。夜间或光线昏暗的垃圾桶区域是检测难点必须包含。多地覆盖了小区垃圾投放点、街道旁、商业区、公园等不同场景。不同地方的垃圾桶款式、颜色、摆放方式都不同。多条件特意采集了雨天、阴天、晴天以及垃圾桶被部分遮挡如被自行车、绿化遮挡的情况。设备与参数我们主要使用了智能手机和普通监控摄像头。这里有个关键点不必追求专业单反相机。因为最终部署的环境如监控摄像头画质通常一般用太“干净”的高清数据训练模型反而可能不适应真实的、带有些许模糊或噪点的输入。我们统一将分辨率调整到1920x1080或1280x720这与多数安防摄像头的输出规格匹配。类别定义与边界厘清在采集时就必须明确三类别的判定标准否则后期标注会极其混乱。empty(空)垃圾桶内可视范围内无垃圾或垃圾高度低于桶身高度的10%。这是一个相对明确的状态。not_full(未满)垃圾桶内有垃圾但垃圾高度低于桶口且无任何垃圾溢出桶外。这是最常见的状态。overflow(满溢)垃圾高度达到或超过桶口并有垃圾溢出到桶外地面或桶盖无法闭合。这是我们需要重点预警的状态。注意对于“未满”和“满溢”的临界点我们规定以“是否有垃圾物理上溢出桶体外”作为核心判断依据。因为单纯“与桶口齐平”在图像上有时难以精确判断而“溢出”是更显著、更不容置疑的特征。2.2 数据清洗与预处理剔除无效数据拍回来的原始图像不能直接用。我们建立了简单的清洗流水线去重使用感知哈希pHash或差分哈希dHash算法自动找出并删除高度相似或完全相同的图像避免数据冗余。筛选手动快速浏览剔除严重模糊、完全遮挡垃圾桶主体、或者拍摄角度过于极端如几乎垂直向下拍桶内的无效图片。统一格式将所有图像转换为.jpg格式并检查是否含有错误的EXIF方向信息某些手机拍摄的图片在电脑上显示是旋转的。我们用Python的PIL库进行了批量标准化处理。from PIL import Image, ImageOps import os def standardize_image(input_path, output_path, target_size(1280, 720)): try: with Image.open(input_path) as img: # 处理EXIF旋转信息 img ImageOps.exif_transpose(img) # 统一缩放到目标尺寸采用LANCZOS高质量下采样 img.thumbnail(target_size, Image.Resampling.LANCZOS) # 转换为RGB模式防止有RGBA或L模式 if img.mode ! RGB: img img.convert(RGB) # 保存为高质量JPEG img.save(output_path, JPEG, quality95) except Exception as e: print(f处理图片 {input_path} 时出错: {e}) # 批量处理示例 input_dir ./raw_images output_dir ./cleaned_images os.makedirs(output_dir, exist_okTrue) for img_name in os.listdir(input_dir): if img_name.lower().endswith((.png, .jpg, .jpeg)): standardize_image(os.path.join(input_dir, img_name), os.path.join(output_dir, img_name))这个预处理步骤虽然简单但能有效保证输入数据的质量基线避免因为数据本身的问题导致模型训练出现奇怪的现象。2.3 数据标注工具选择与标注规范标注是数据集中最耗时、也最关键的环节。标注质量直接决定模型性能的天花板。标注工具选择我们对比了LabelImg、CVAT、Roboflow和MakeSense.ai。最终选择LabelImg作为主要工具。原因如下离线可用数据涉及社区场景出于隐私和安全考虑离线工具是刚需。YOLO格式原生支持保存即为.txt标注文件无需二次转换。简单高效对于像垃圾桶这样目标相对清晰、数量不多的场景LabelImg的快捷键操作非常流畅。虽然CVAT功能更强大支持视频标注、团队协作但对我们这个项目来说有点“杀鸡用牛刀”且部署稍显复杂。标注规范细则SOP我们制定了详细的标注手册确保所有标注人员理解一致框体紧贴目标 bounding box 必须紧贴垃圾桶的外边缘但不必过于精确到像素级大致贴合即可。对于被遮挡的垃圾桶框体应覆盖可见部分。类别准确严格按照前述三类定义进行选择。对于难以判断的“未满/满溢”临界情况提交给项目负责人仲裁并记录案例后续统一标准。忽略原则对于距离极远、像素面积小于30x30的垃圾桶不予标注。因为在实际应用场景中这种目标即使检测出来也无实际管理价值。标签文件命名 每张图片image_001.jpg对应一个同名的标签文件image_001.txt。标注过程中的“坑”与技巧阴影和反光垃圾桶的金属部分或湿垃圾可能产生高光。我们要求标注框忽略这些高光区域仍然框住垃圾桶实体。多个垃圾桶重叠当两个垃圾桶紧挨着部分重叠时尽量分别框出。如果重叠面积超过50%则标注为“遮挡”只标注前面那个完整的。使用预标注加速在标注了约200张后我们训练了一个初版模型然后用这个模型对剩余图片进行推理预测生成预标注框。标注人员只需在预标注的基础上进行修正和确认效率提升了至少40%。这是一个非常实用的技巧。2.4 数据集划分与YOLOv5目录结构构建数据标注完成后不能把所有数据扔进去训练。必须科学地划分训练集、验证集和测试集。划分比例我们采用经典的比例70%训练集Train 20%验证集Val 10%测试集Test。这里特别强调测试集Test必须严格隔离在训练和调参过程中绝对不可使用仅用于最终模型性能的客观评估。验证集Val用于训练过程中监控模型是否过拟合、调整超参数。划分方法划分不是简单随机要保证数据分布的一致性。即训练集、验证集、测试集中三个类别的比例、不同场景小区、街道、不同光照条件的比例都应大致相同。我们使用了分层抽样Stratified Sampling的思路先按场景和主要光照条件给图片打上“场景标签”然后按标签进行划分。YOLOv5目录格式详解这是项目的交付物必须完全符合规范。我们的最终数据集目录结构如下trash_bin_overflow_dataset/ ├── images/ │ ├── train/ │ │ ├── image_001.jpg │ │ ├── image_002.jpg │ │ └── ... │ ├── val/ │ │ ├── image_101.jpg │ │ └── ... │ └── test/ # 可选很多项目将test放在另一个独立数据集 │ └── ... ├── labels/ │ ├── train/ │ │ ├── image_001.txt │ │ ├── image_002.txt │ │ └── ... │ ├── val/ │ │ ├── image_101.txt │ │ └── ... │ └── test/ │ └── ... ├── data.yaml └── README.md核心文件说明images/和labels/下的子目录train,val,test必须一一对应即images/train/image_001.jpg的标签一定在labels/train/image_001.txt。labels/下的.txt文件是YOLO格式的标注。每一行代表一个目标格式为class_id center_x center_y width height。坐标是归一化后的0-1之间。例如0 0.5 0.5 0.2 0.3表示类别0empty目标中心点位于图片宽度的50%、高度的50%处宽度占图片宽的20%高度占图片高的30%。data.yaml文件这是YOLOv5训练的配置文件是灵魂所在。内容如下# 数据集路径相对路径或绝对路径 path: ../trash_bin_overflow_dataset # 数据集根目录 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径相对于path # test: images/test # 测试集路径可选 # 类别数量 nc: 3 # 类别名称列表顺序必须与标注文件中的class_id严格对应 names: [empty, not_full, overflow]这个data.yaml文件是连接你的数据集和YOLOv5训练脚本的桥梁路径和类别名写错训练就会直接报错。3. 数据增强策略针对“满溢检测”的特化调整数据增强是提升模型泛化能力、防止过拟合的利器。但增强不是无脑堆砌必须针对具体任务的特点进行设计。对于“垃圾桶满溢检测”我们采用了以下增强组合3.1 基础空间变换增强这类增强模拟了摄像头视角的变化是必须的。随机旋转±10度以内模拟摄像头安装略有倾斜。随机平移±10%模拟目标在画面中的位置变化。随机缩放0.8 ~ 1.2倍模拟垃圾桶距离摄像头的远近。水平翻转p0.5这是一个非常安全且有效的增强因为垃圾桶没有固定的左右朝向要求。我们在YOLOv5的默认配置上适当降低了旋转和缩放的幅度因为实际监控中视角变化不会太剧烈过度的扭曲可能产生不真实的图像让模型学习到错误特征。3.2 光度度量增强这类增强模拟了光照条件的变化对室外场景至关重要。亮度、对比度、饱和度调整随机微调模拟一天中不同时间的光照。添加高斯噪声模拟低光照条件下摄像头的传感器噪点。模糊轻微高斯模糊或运动模糊模拟雨天、镜头污渍或快速移动如清运车经过造成的模糊。特别注意我们谨慎使用了色彩空间变换如HSV调整中的Hue色调变化。因为垃圾桶的颜色如绿色、灰色、蓝色本身可能是一种识别特征例如某些小区规定厨余垃圾桶是绿色大幅度改变色调可能会破坏这个特征导致模型困惑。我们将其调整幅度设置得非常小。3.3 针对“满溢”状态的上下文增强这是本项目增强策略的亮点。我们发现模型有时会混淆“未满”和“满溢”尤其是当垃圾桶内部垃圾堆得很高但尚未溢出时。为此我们设计了两类针对性增强模拟“溢出”特效对于not_full类别的图片我们尝试在垃圾桶边缘外侧随机添加一些小的、颜色纹理与桶内垃圾相似的斑块模拟轻微溢出的视觉效果并将类别标签改为overflow。这种做法必须极其谨慎且比例要很低我们设为2%并需要人工审核生成的图片是否合理。它的目的是让模型更关注“桶外有异物”这个核心特征而不是简单地看桶内是否“满”。遮挡增强CutOut/RandomErasing随机遮挡垃圾桶的一小部分10%-20%。这能强迫模型不只依赖垃圾桶的某个局部特征比如特定的logo或污渍来判断状态而是学习更全局的、综合的形状和内容特征。3.4 Mosaic与MixUp增强的取舍YOLOv5默认使用了Mosaic四图拼接和MixUp两图混合增强。它们能极大地丰富背景上下文提升小目标检测能力。Mosaic对我们这个任务非常有益。因为实际场景中画面里可能同时存在多个处于不同状态的垃圾桶。Mosaic增强能天然地创造这种多目标、多状态的复杂场景让模型学会同时处理多个实例。MixUp我们选择降低其概率或不用。因为将两张垃圾桶图片线性混合可能会产生一个“半空半满”的、在物理上不存在的垃圾桶图像这可能会干扰模型对“空”、“未满”、“满溢”这三个离散状态的清晰界定。我们的增强配置最终在data.yaml或训练命令中通过超参数体现核心是理解每个增强背后的逻辑并根据任务定制。4. 数据集质量评估与常见问题排查数据集做好后不能直接扔去训练。必须先进行质量评估否则垃圾数据进去垃圾模型出来。4.1 标注一致性检查我们编写了简单的检查脚本用于发现常见标注错误标签文件与图像文件是否一一对应。标注框是否超出图像边界中心点坐标或宽高大于1。类别ID是否合法是否只有0 1 2。是否存在空标签文件即图片中没有目标对于我们的场景这种情况应该极少需复核是否漏标。import os from pathlib import Path def check_annotation_consistency(image_dir, label_dir): image_files set([p.stem for p in Path(image_dir).glob(*.jpg)]) label_files set([p.stem for p in Path(label_dir).glob(*.txt)]) # 检查是否有图片没有对应的标签 img_no_label image_files - label_files # 检查是否有标签没有对应的图片 label_no_img label_files - image_files if img_no_label: print(f警告: 以下图片在 {label_dir} 中没有对应的标签文件: {list(img_no_label)[:5]}) # 只打印前5个 if label_no_img: print(f警告: 以下标签在 {image_dir} 中没有对应的图片文件: {list(label_no_img)[:5]}) # 检查标签内容 for label_file in Path(label_dir).glob(*.txt): with open(label_file, r) as f: lines f.readlines() for line_num, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: print(f错误: {label_file} 第{line_num1}行格式不正确: {line}) continue cls_id, cx, cy, w, h map(float, parts) if not (0 cls_id 3 and cls_id.is_integer()): print(f错误: {label_file} 无效类别ID: {cls_id}) # 检查归一化坐标是否在[0,1]合理范围内允许轻微超出如-0.02, 1.02因为数据增强可能导致 if not (-0.05 cx 1.05) or not (-0.05 cy 1.05): print(f警告: {label_file} 中心点坐标异常: ({cx}, {cy})) if w 0 or h 0 or w 1.1 or h 1.1: print(f警告: {label_file} 宽高异常: ({w}, {h}))4.2 数据集统计分析使用Python的matplotlib和seaborn库对数据集进行可视化分析洞察潜在问题类别分布直方图检查三个类别empty,not_full,overflow的样本数量是否严重不均衡。我们的初始数据中overflow样本远少于其他两类这就是典型的类别不平衡问题。目标尺寸分布散点图绘制所有标注框的宽度和高度归一化后。这能看出目标在图像中的相对大小。我们发现大部分垃圾桶目标尺寸集中在(0.1~0.3, 0.15~0.4)这个范围属于中等偏大的目标这有助于后续调整模型锚框Anchor的尺寸。目标位置热力图查看目标中心点在图像中的分布。理想情况应均匀分布。如果都集中在中心说明拍摄角度单一需要补充边缘位置的数据。4.3 解决类别不平衡问题我们发现overflow满溢样本只有empty和not_full的约1/5。直接训练模型会倾向于预测多数类对overflow的检测效果差。我们采用了组合策略过采样Oversampling在训练时对overflow类别的图片进行更多的重复采样。YOLOv5本身支持通过设置class_weights或在数据加载器中实现过采样。数据增强侧重对overflow类别的图片应用更丰富的光度度量增强以在数量不变的情况下增加其多样性。损失函数加权在训练损失函数中给overflow类别分配更高的权重让模型更关注对少数类的分类错误。这在YOLOv5中可以通过修改损失计算部分的代码实现。最终我们通过过采样和损失加权显著提升了模型对overflow状态的召回率Recall。4.4 可视化检查标注效果最后一步也是必不可少的一步将标注框画回原图人工抽查。我们随机抽取了训练集、验证集各约5%的图片检查标注框是否准确、类别是否正确。这个过程中确实发现了一些问题例如将地面阴影误标为溢出垃圾或者两个紧挨的垃圾桶标成了一个框。发现问题后立即返回标注工具进行修正并同步更新标注规范手册防止类似错误再次发生。5. 基于此数据集的YOLOv5模型训练要点有了高质量的数据集训练就成功了一大半。这里分享几个针对“垃圾桶满溢检测”这个具体任务的训练技巧和调参经验。5.1 模型选择与预训练权重YOLOv5提供了s、m、l、x等不同大小的模型。我们的考量是部署环境最终模型需要部署在边缘计算设备如RK3568、RV1106等或普通工控机上计算资源有限。精度与速度权衡垃圾桶目标相对较大特征明显不需要特别深的网络去捕捉微小特征。 因此我们选择了YOLOv5s模型。它在COCO数据集上预训练的权重包含了丰富的通用特征提取能力通过微调Fine-tuning可以快速适配我们的专用任务。从零开始训练Train from scratch不仅需要更长时间效果也通常不如使用预训练权重。5.2 关键超参数调优我们主要调整了以下几个参数在hyp.scratch-low.yaml或自定义的超参数文件基础上学习率lr0这是最重要的参数之一。我们从预训练权重微调初始学习率不宜太大。我们设置为0.01默认是0.01并配合余弦退火cosine调度器让学习率平滑下降。权重衰减weight_decay设置为0.0005帮助防止过拟合尤其是在我们数据集规模不是特别巨大的情况下。** mosaic 和 mixup**如前所述我们保持mosaic1.0但将mixup设置为0.1的低概率。锚框anchorsYOLOv5默认会使用k-means算法在你的数据集上重新聚类生成锚框。这是一个自动化过程通常效果很好。我们对比了使用默认COCO锚框和在我们的数据集上重新聚类后的锚框发现后者在训练初期的收敛速度稍快最终精度略有提升约0.5% mAP。所以如果你的目标尺寸分布与COCO差异大重新聚类锚框是有益的。输入图像尺寸imgsz我们统一预处理为640x640进行训练。这是速度和精度的良好平衡点。尝试过增大到832精度提升不明显但训练和推理速度下降明显。5.3 训练过程监控与早停我们使用TensorBoard或YOLOv5自带的训练日志来监控关键指标损失曲线box_loss, obj_loss, cls_loss观察训练损失和验证损失是否同步下降。如果验证损失很早就开始上升而训练损失持续下降这是典型的过拟合信号。精度指标mAP0.5, mAP0.5:0.95这是我们最关心的。特别是mAP0.5即IoU阈值为0.5时的平均精度。我们会重点关注overflow这个类别的AP值。召回率Recall对于“满溢检测”这种需要高灵敏度的应用召回率很重要。我们不希望漏报任何一个满溢的垃圾桶。我们设置了早停Early Stopping策略如果验证集mAP在连续的20个epoch内没有提升则自动停止训练并回滚到验证集指标最好的那个epoch的模型权重。这能有效防止过拟合并节省训练时间。5.4 模型评估与错误分析训练完成后在从未参与训练和调参的测试集上进行最终评估。YOLOv5的val.py脚本会生成详细的评估报告和混淆矩阵。重点关注混淆矩阵它能清晰告诉我们模型主要混淆在哪些类别之间。在我们的第一次训练中混淆矩阵显示模型将一部分not_full错误地预测为overflow。这促使我们回头检查数据发现是一些“未满但垃圾堆得很高”的图片与“轻微溢出”的图片在视觉上确实相似。针对这个问题我们采取了以下措施在数据集中增加了更多处于“临界状态”的样本并进行了更精确的标注。在数据增强中增加了针对垃圾桶“桶口”区域的轻微裁剪或模糊迫使模型更关注桶外区域来判断是否溢出而不是仅仅看桶内垃圾的高度。调整了分类损失函数的权重稍微提高了not_full和overflow之间分类错误的惩罚。经过两轮“训练-评估-错误分析-数据/模型调整”的迭代模型在三个类别上的区分度得到了显著改善。6. 数据集使用指南与扩展建议如果你拿到了我们开源的这个数据集或者想借鉴我们的方法构建自己的类似数据集这里有一些直接可用的建议。6.1 快速开始训练假设你已经克隆了YOLOv5官方代码并将我们的数据集放在了合适的位置。准备环境按照YOLOv5官方README安装PyTorch和依赖。放置数据集将数据集文件夹例如trash_bin_overflow_dataset放在YOLOv5项目目录旁。修改data.yaml确保data.yaml中的path路径指向正确。开始训练运行类似以下命令根据你的GPU情况调整参数python train.py --img 640 --batch 16 --epochs 100 --data ../trash_bin_overflow_dataset/data.yaml --weights yolov5s.pt --cache--cache参数可以将图像缓存到内存或RAM磁盘显著加速训练尤其当数据集放在机械硬盘上时。验证与测试训练完成后使用最佳模型在测试集上验证python val.py --weights runs/train/exp/weights/best.pt --data ../trash_bin_overflow_dataset/data.yaml --task test6.2 针对不同场景的微调我们的数据集主要基于中国城市的常见垃圾桶。如果你的应用场景不同例如农村或景区垃圾桶样式、颜色、摆放环境可能不同。室内垃圾桶光照条件稳定但背景可能更杂乱。不同国家的垃圾桶规格、颜色标准完全不同。最佳实践是进行迁移学习使用我们数据集上训练好的模型best.pt作为预训练权重在你的新场景数据即使只有几百张上进行微调。这样可以极大加快收敛速度并可能获得比从COCO权重开始训练更好的效果。微调时可以使用更小的学习率如0.001更少的训练轮数如50。6.3 数据集的局限性与扩展方向我们必须坦诚这个数据集的局限性地域性主要覆盖华东地区部分城市的社区场景。天气虽然包含了雨雪阴晴但极端天气如暴雨、大雾样本较少。垃圾桶类型以240L标准塑料垃圾桶为主其他类型如小型果皮箱、智能分类箱样本不足。视角主要以平视和略俯视角度为主极度俯视无人机视角或仰视角度缺失。因此这个数据集可以作为一个强大的基线Baseline。我们鼓励社区在此基础上进行扩展贡献数据如果你有不同场景、不同天气、不同国家的垃圾桶图片欢迎标注后提交共同完善这个数据集。探索新任务基于此数据集不仅可以做状态检测还可以尝试垃圾类型分类可回收、厨余、有害、其他或者垃圾桶损坏检测如桶盖缺失、轮子损坏。模型轻量化与部署尝试使用YOLOv5更小的模型如nano版本或使用模型剪枝、量化技术将其部署到更廉价的边缘设备上推动实际落地。构建一个专用数据集是一项繁琐但极具价值的工作。它没有太多炫技的成分更多的是耐心、规范和对细节的把握。通过这个“垃圾桶满溢检测数据集”项目我们不仅得到了一个能用的模型更沉淀了一套可复用的数据工程方法论。希望这份详细的复盘能帮你避开我们踩过的坑更高效地构建出解决你实际问题的优质数据集。本文还有配套的精品资源点击获取