拓冰建站拓冰建站
首页 / 资讯中心 / 正文

构建垃圾桶满溢检测数据集:从数据采集到YOLOv5格式实战指南

简介本资源是面向计算机视觉初学者与YOLOv5实践者的垃圾桶满溢检测专用目标检测数据集适用于智能环卫、城市物联网等场景下的模型训练与算法验证。数据集严格遵循YOLOv5标准目录结构组织开箱即用无需格式转换或标签重映射显著降低入门门槛。压缩包共2000个文件含1999个YOLO格式的txt标注文件每图一标含3类坐标与类别ID及1个可视化脚本show.py——该脚本可随机加载图像并自动绘制带类别标签的边界框结果直接保存至本地便于快速检验标注质量与模型推理效果。数据总量313.44MB涵盖训练集2680张、验证集669张RGB图像分辨率统一为400×500三类别定义清晰满溢的垃圾桶、未满溢的垃圾桶、散落垃圾。目前已有448人学习下载是少有的聚焦实际城市管理痛点、标注规范且配套工具完备的轻量级工业检测数据集。1. 项目背景与核心价值为什么需要“垃圾桶满溢检测”数据集在智慧城市和社区精细化管理的大背景下垃圾桶满溢检测是一个看似微小、实则影响深远的应用场景。想象一下一个拥有数千个公共垃圾桶的城区如果依赖传统的环卫工人定时巡检不仅人力成本高昂而且效率低下。经常出现的情况是有的垃圾桶早已爆满垃圾散落一地影响市容和卫生而有的垃圾桶还空空如也清运车却已经来过造成了运力的浪费。这就是一个典型的“非均衡”调度问题。“垃圾桶满溢检测”这个任务本质上是一个基于视觉的目标检测问题。我们需要通过摄像头可以是固定的监控摄像头也可以是移动的环卫车或无人机搭载的摄像头拍摄的图片或视频流自动识别出画面中的垃圾桶并进一步判断其“满溢状态”。这通常被建模为一个多类别的目标检测任务例如划分为“空桶”、“未满”和“满溢”三个类别。有了这个自动化的“眼睛”城市管理系统就能实时掌握每个垃圾桶的状态实现按需、高效的清运调度这就是其核心价值所在——将粗放式管理转变为数据驱动的精细化运营。然而任何AI视觉模型的落地第一步也是最关键的一步就是数据。市面上通用的目标检测数据集如COCO、VOC虽然包含“瓶子”、“罐子”等类别但几乎没有针对“垃圾桶”及其“满溢状态”的标注数据。直接使用这些通用数据集训练的模型在真实的垃圾桶检测场景下精度会惨不忍睹。因此构建一个高质量、场景匹配的专用数据集就成了项目成败的基石。这也是为什么“垃圾桶满溢检测数据集”具有很高的实用价值和分享意义。2. 数据集构建全流程从原始图像到YOLOv5标准格式构建一个可用的数据集远不止是收集图片那么简单。它是一套完整的工程流程涉及数据采集、清洗、标注、格式转换和质量校验等多个环节。下面我将以一个典型的智慧社区项目为例拆解整个构建过程。2.1 数据采集与清洗寻找“对的”图片数据采集是源头质量决定上限。我们的目标是训练一个在真实场景下鲁棒的模型因此数据必须尽可能覆盖实际应用中的各种情况。1. 采集渠道与考量实地拍摄这是最理想的方式。使用手机或相机在不同时间段早、中、晚、夜间、不同天气晴、雨、阴、不同角度平视、俯视、斜角对社区内各种类型的垃圾桶塑料的、不锈钢的、带盖的、脚踏式的进行拍摄。这能最大程度保证数据的真实性和多样性。网络爬取作为补充。可以从一些公开的图片网站、社区分享平台使用“trash can”、“dumpster”、“overflowing bin”等关键词进行爬取。但必须注意版权问题仅用于个人学习和研究且数据分布可能与本地场景差异较大。模拟生成在数据极度匮乏的初期可以考虑使用3D建模软件如Blender模拟生成一些垃圾桶图像甚至可以通过GAN生成对抗网络进行数据增强。但这属于进阶手段对技术要求较高。 注意如果采用网络图片务必仔细筛选剔除那些带有明显水印、严重PS痕迹、或者画面主体并非垃圾桶的图片。对于实地拍摄的图片要检查是否对焦清晰、曝光正常。2. 清洗规则去重使用感知哈希pHash或结构相似性SSIM算法剔除内容几乎完全相同的图片避免数据冗余。筛选手动或设计简单规则如图像尺寸、亮度方差过滤掉质量过差的图片如完全模糊、过暗、过曝的图片。初步归类将图片按大概的场景如“室内楼道”、“室外路边”、“公园”、“商业街”进行文件夹分类便于后续管理和分析数据分布。经过这个阶段你应该获得了一个包含数百至数千张原始图片的集合。这是我们的“原材料”。2.2 数据标注详解使用LabelImg定义三个状态类别标注是为图片中的目标物体“打标签”的过程是监督学习的关键。我们选择使用开源的LabelImg工具因为它支持直接导出YOLO格式的标签文件.txt简单易用。1. 类别定义Classes这是标注的“词典”必须清晰无歧义。我们定义三个类别empty(空桶):垃圾桶内可视垃圾容量低于20%或完全看不到垃圾。盖子通常是关闭或半开的内部空旷。not_full(未满):垃圾桶内垃圾容量在20%到80%之间。垃圾未达到桶口从外部视角看桶壁仍有较大面积未被遮挡。overflowing(满溢):垃圾桶内垃圾容量超过80%垃圾已经达到或超过桶口甚至散落在桶周围。盖子可能被顶开或者垃圾从投递口溢出。 实操心得类别定义需要所有标注人员统一理解。最好制作一个“标注手册”包含每个类别的典型示例图片和边界案例说明。例如“一个塞满塑料袋但并未凸出桶口的桶”算not_full还是overflowing需要明确规则如以桶口物理边缘为界。2. 标注过程与规范边界框Bounding Box:使用矩形框紧密包围整个垃圾桶本体而不是只框垃圾。对于overflowing类别框体应包含溢出的垃圾部分。标签一致性同一个垃圾桶在不同图片中应保持相同的类别标签除非其状态确实发生了变化如清运前后。遮挡与截断处理部分遮挡如果垃圾桶被树、柱子等遮挡了一部分但主体可见仍然标注整个垃圾桶的估计完整轮廓。严重遮挡/截断如果垃圾桶只有不到三分之一部分出现在画面边缘建议舍弃这张图片或不予标注因为这样的样本对模型训练干扰大于帮助。小目标处理对于远景中很小的垃圾桶如果其像素尺寸过小如宽高均小于15像素标注意义不大模型也很难学习可以考虑忽略或归为一个“small_bin”的额外类别进行专门处理本数据集暂不涉及。标注完成后每张图片如bin_001.jpg会对应生成一个同名的文本文件bin_001.txt。这个文件就是YOLO格式的标签。2.3 YOLOv5格式深度解析理解标签文件的每一个数字YOLO格式的标签文件内容非常精简但每一行都至关重要。理解其含义是处理数据集的基础。一个bin_001.txt文件内容可能如下0 0.435546 0.512500 0.300781 0.450000 1 0.734375 0.601562 0.250000 0.350000每一行代表一个标注对象格式为class_id x_center y_center width heightclass_id:类别索引从0开始。对应关系为0-empty,1-not_full,2-overflowing。这个映射关系需要记录在一个单独的classes.txt文件中。x_center y_center:边界框中心点的归一化坐标。计算公式为中心点绝对坐标 / 图像宽度或高度。值域在[0, 1]之间。例如图片宽度为640像素边界框中心点横坐标为278像素则x_center 278 / 640 0.434375。width height:边界框的归一化宽度和高度。计算公式为框体宽高度 / 图像宽度或高度。例如边界框宽度为192像素图像宽度为640像素则width 192 / 640 0.3。 核心原理为什么要归一化归一化是为了消除图像绝对尺寸的影响让模型专注于物体的相对位置和形状比例。这样无论输入图像是640x640还是1920x1080标签的数值范围都是一致的便于模型训练。目录结构最终形态一个标准的YOLOv5数据集目录应如下所示垃圾桶满溢检测数据集/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── bin_001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── bin_100.jpg │ └── ... ├── labels/ │ ├── train/ # 训练集标签与images/train一一对应 │ │ ├── bin_001.txt │ │ └── ... │ └── val/ # 验证集标签与images/val一一对应 │ ├── bin_100.txt │ └── ... └── dataset.yaml # 数据集配置文件关键3. 核心配置文件dataset.yaml的编写与调优dataset.yaml文件是YOLOv5训练时读取数据集的“地图”它告诉模型数据在哪里、有哪些类别。一个错误或不合理的配置会导致训练失败或效果不佳。3.1 基础配置解析一个最基础的dataset.yaml文件内容如下# 数据集根目录路径相对于yolov5项目根目录 path: ../垃圾桶满溢检测数据集 # 训练集和验证集的图片目录相对于path train: images/train val: images/val # 类别数量 nc: 3 # 类别名称列表必须与标注时的class_id顺序严格对应 names: [empty, not_full, overflowing] 避坑指南90%的初学者错误都出在路径和类别名上。路径问题path可以是绝对路径如/home/user/datasets/bin_detection也可以是相对路径。使用相对路径时务必确认其是相对于你启动训练命令时所在的目录通常是yolov5/文件夹。最稳妥的方式是使用绝对路径。类别名问题names列表中的字符串必须与标注时使用的类别名完全一致大小写敏感。nc的值必须等于names列表的长度。这里nc: 3对应[empty, not_full, overflowing]。3.2 进阶配置与数据平衡考量在实际项目中我们往往需要更精细的控制。一个增强版的dataset.yaml可能包含path: /datasets/bin_detection train: images/train val: images/val test: images/test # 可选预留测试集 nc: 3 names: [empty, not_full, overflowing] # 可选自动计算锚框anchor对于自定义数据集特别是目标尺寸与COCO差异大时建议开启 # 在train.py中使用 --autoanchor 参数效果相同 # autoanchor: true # 可选可视化参数用于train.py中的--evolve等超参数进化 # 通常不需要手动修改 # anchors: # - [10,13, 16,30, 33,23] # P3/8 # - [30,61, 62,45, 59,119] # P4/16 # - [116,90, 156,198, 373,326] # P5/32数据不平衡问题在垃圾桶数据集中not_full状态的图片可能最多overflowing状态的图片可能最少。严重的数据不平衡会导致模型对少数类别overflowing的检测效果极差。解决方案在准备数据阶段重采样Oversampling复制overflowing类别的图片-标签对增加其在训练集中的出现频率。YOLOv5本身不支持直接在配置文件中设置类别权重但可以通过复制图像文件来实现。数据增强Data Augmentation对少数类别的图片应用更激进的数据增强如mosaic, mixup, 随机旋转、裁剪。YOLOv5的训练脚本内置了强大的增强管道可以通过hyp.scratch.yaml或自定义的超参数文件来调整增强强度间接帮助模型更好地学习少数类别。分层采样确保在划分训练集/验证集时每个类别在两者中的比例大致相同避免验证集中出现训练集未见过类别的极端情况。4. 数据集划分、管理与质量评估实战有了标注好的数据和配置文件下一步是将其组织成模型训练所需的格式并评估数据本身的质量。4.1 训练集、验证集与测试集的科学划分千万不要把所有数据都扔进训练集标准的机器学习流程需要三个独立的数据集训练集Training Set用于模型参数的学习和更新。通常占70%-80%。验证集Validation Set用于在训练过程中监控模型性能调整超参数如学习率以及进行早停Early Stopping判断。通常占10%-15%。它不参与参数更新。测试集Test Set用于在训练结束后对模型的最终性能进行一次无偏评估。它模拟模型在全新、未见过的数据上的表现。通常占10%-15%。划分方法手动划分繁琐且易出错推荐使用Python脚本自动完成。核心是使用sklearn.model_selection中的train_test_split函数并且分层抽样stratify以确保类别比例一致。import os from sklearn.model_selection import train_test_split import shutil # 假设所有图片在 images/all/ 所有标签在 labels/all/ image_dir images/all label_dir labels/all all_images [f for f in os.listdir(image_dir) if f.endswith(.jpg)] all_images.sort() # 获取每个图片对应的类别取第一个目标的类别简单处理。更严谨应统计主类别 def get_image_class(img_name): label_path os.path.join(label_dir, img_name.replace(.jpg, .txt)) if not os.path.exists(label_path): return -1 # 无标签 with open(label_path, r) as f: first_line f.readline().strip() if first_line: return int(first_line.split()[0]) return -1 classes [get_image_class(img) for img in all_images] valid_indices [i for i, cls in enumerate(classes) if cls ! -1] all_images [all_images[i] for i in valid_indices] classes [classes[i] for i in valid_indices] # 第一次分割分出训练验证集 和 测试集 (80% vs 20%) train_val_imgs, test_imgs, train_val_cls, test_cls train_test_split( all_images, classes, test_size0.2, random_state42, stratifyclasses ) # 第二次分割从训练验证集中再分出训练集和验证集 (75% vs 25% 即总量的60% vs 20%) train_imgs, val_imgs, train_cls, val_cls train_test_split( train_val_imgs, train_val_cls, test_size0.25, random_state42, stratifytrain_val_cls ) # 此时 train:val:test ≈ 60%:20%:20% # 复制文件到对应目录 def copy_files(file_list, src_img_dir, src_lbl_dir, dst_img_dir, dst_lbl_dir): os.makedirs(dst_img_dir, exist_okTrue) os.makedirs(dst_lbl_dir, exist_okTrue) for f in file_list: shutil.copy(os.path.join(src_img_dir, f), os.path.join(dst_img_dir, f)) lbl_f f.replace(.jpg, .txt) shutil.copy(os.path.join(src_lbl_dir, lbl_f), os.path.join(dst_lbl_dir, lbl_f)) copy_files(train_imgs, image_dir, label_dir, images/train, labels/train) copy_files(val_imgs, image_dir, label_dir, images/val, labels/val) copy_files(test_imgs, image_dir, label_dir, images/test, labels/test) print(f划分完成: 训练集{len(train_imgs)}张, 验证集{len(val_imgs)}张, 测试集{len(test_imgs)}张)4.2 使用Roboflow等工具进行云端管理与增强对于团队协作或更大规模的项目手动管理数据集版本、标注和增强会很痛苦。这时可以考虑使用专业的数据集管理平台如Roboflow。Roboflow的核心优势可视化标注与审核提供在线标注界面支持团队协作标注和审核流程。一键数据增强提供丰富的增强选项旋转、裁剪、亮度对比度调整、模糊、 mosaic等并可以预览增强效果直接生成增强后的VOC、YOLO、COCO等格式数据集。版本管理像代码一样管理数据集版本V1, V2方便回溯和对比不同版本数据训练出的模型效果。自动预处理与导出可以统一调整图片尺寸、自动生成dataset.yaml文件并直接导出为YOLOv5 PyTorch格式开箱即用。使用流程简述在Roboflow创建项目上传原始图片。在线完成标注或上传已有的标签文件。在“Generate”页面选择增强选项如旋转30度、亮度调整、 mosaic等和预处理选项如统一缩放到640x640。选择导出格式为“YOLOv5 PyTorch”。平台会生成一个版本号如dataset-1并提供一个下载链接或直接生成一段Python代码用于在训练环境中下载该版本数据集。 个人体会对于个人或小项目手动流程足以应对。但对于需要持续迭代、多人协作的工业级项目强烈建议在早期就引入类似Roboflow的工具。它节省的时间和管理成本远超其学习成本。尤其是在数据增强环节可视化地看到增强效果能让你更有信心地选择增强策略而不是盲目调参。4.3 数据集质量评估与可视化分析在投入训练前花点时间分析数据集质量能提前发现潜在问题。1. 使用YOLOv5内置工具分析YOLOv5仓库中提供了一个极好的脚本utils/plots.py但更直接的是使用其训练前检查功能。在启动训练时添加--data dataset.yaml参数YOLOv5在开始训练前会自动对数据集进行简要统计并在日志中输出类别分布、标签数量等信息。更深入的分析可以运行python path/to/yolov5/utils/general.py --task data --data path/to/dataset.yaml注意不同版本YOLOv5工具脚本位置和参数可能有变请参考官方文档这个命令会生成数据集的统计图表。2. 关键指标自查类别分布直方图检查三个类别的样本数量是否严重失衡。如果overflowing数量不及其他类的1/5就需要考虑前文提到的重采样或增强策略。边界框尺寸分布绘制所有标注框的宽度和高度的分布图。如果大部分框都非常小如归一化宽高0.05意味着你的数据集中小目标很多可能需要调整模型锚框使用--autoanchor或在训练时使用更小的检测头如YOLOv5s的P2层。边界框中心点分布检查标注框的中心点是否均匀分布在图像各个区域。如果中心点都集中在图像中央说明你的拍摄角度可能过于单一模型可能无法很好地检测图像边缘的物体。图像尺寸统计查看原始图像的宽高比和分辨率。如果差异巨大如既有1920x1080又有640x480在训练时统一缩放到正方形如640x640可能会导致严重变形。可以考虑在数据加载时使用矩形训练rectTrue来减少填充带来的信息损失。3. 可视化检查编写一个简单的脚本随机抽取几十张图片并将标注框和类别名绘制在图片上人工浏览一遍。这是发现标注错误如框错物体、类别标错最有效的方法。你可能会惊讶于能发现多少问题框得不紧、该标overflowing却标了not_full、漏标了画面角落的垃圾桶等等。在训练前修复这些错误比训练一个周后发现模型精度上不去再回头找数据问题成本要低得多。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门