城市街道垃圾数据源城市街道垃圾检测数据集(YOLO)
城市街道垃圾数据源城市街道垃圾检测数据集(YOLO)
该数据集是城市街道场景下,包含3300张街道垃圾图像。该数据集包含塑料瓶、香蕉皮、易拉罐、玻璃瓶等28种垃圾类型。该数据集已进行数据划分为训练集、验证集和测试集。具有完整的txt标注文本和yaml配置文件,该数据精度较高。
(YOLO格式,28类,3300张)”,由于这是一个具体的数据资源包,我无法直接“发送”文件给您
数据准备与目录结构代码:帮您快速整理数据。
YOLOv8/v5 训练代码:直接用于该数据集的模型训练。
推理/检测代码:训练完成后对街道图片进行垃圾检测。
data.yaml 配置文件模板:包含28种垃圾类别的定义。
📂 第一步:数据集目录结构准备
YOLO格式的数据集需要特定的文件夹结构。假设您下载到的图片在 images 文件夹,标注在 labels 文件夹,请确保结构如下:
street_garbage_dataset/
├── images/
│ ├── train/ (存放训练集图片)
│ ├── val/ (存放验证集图片)
│ └── test/ (存放测试集图片)
├── labels/
│ ├── train/ (存放对应的txt标注)
│ ├── val/
│ └── test/
└── street_garbage.yaml (配置文件)
import os
import shutil
import random
def split_dataset(base_dir, image_ext=‘.jpg’):
# 定义路径
images_dir = os.path.join(base_dir, ‘images’)
labels_dir = os.path.join(base_dir, ‘labels’)
# 创建子目录
for split in ['train', 'val', 'test']:
os.makedirs(os.path.join(images_dir, split), exist_ok=True)
os.makedirs(os.path.join(labels_dir, split), exist_ok=True)
# 获取所有图片文件名
all_images = [f for f in os.listdir(os.path.join(base_dir, 'images_raw')) if f.endswith(image_ext)]
random.shuffle(all_images)
total = len(all_images)
train_size = int(total * 0.8)
val_size = int(total * 0.1)
splits = {
'train': all_images[:train_size],
'val': all_images[train_size:train_size+val_size],
'test': all_images[train_size+val_size:]
}
for split_name, files in splits.items():
for fname in files:
# 移动图片
src_img = os.path.join(base_dir, 'images_raw', fname)
dst_img = os.path.join(images_dir, split_name, fname)
shutil.move(src_img, dst_img)
# 移动对应的txt标签 (假设标签文件名与图片名一致,仅后缀不同)
label_name = fname.replace(image_ext, '.txt')
src_lbl = os.path.join(base_dir, 'labels_raw', label_name)
if os.path.exists(src_lbl):
dst_lbl = os.path.join(labels_dir, split_name, label_name)
shutil.move(src_lbl, dst_lbl)
print(f"数据集划分完成!训练集:{len(splits['train'])}, 验证集:{len(splits['val'])}, 测试集:{len(splits['test'])}")
使用示例:将原始数据放在 images_raw 和 labels_raw 中运行
split_dataset(‘./street_garbage_dataset’)
📝 第二步:创建 data.yaml 配置文件
这是YOLO模型识别28种垃圾的关键文件。请创建名为 street_garbage.yaml 的文件。
注意:由于您未提供具体的28类名称列表,我根据常见街道垃圾列举了部分示例(塑料瓶、香蕉皮等),请您根据实际数据集的 classes.txt 或文档补全剩余的类别名称。
street_garbage.yaml
数据集根路径 (请修改为您本地的绝对路径)
path: /absolute/path/to/street_garbage_dataset # <— 修改这里
图片子目录
train: images/train
val: images/val
test: images/test
类别数量
nc: 28
28种垃圾类别名称 (请根据实际情况补全/修正)
names:
0: plastic_bottle # 塑料瓶
1: banana_peel # 香蕉皮
2: aluminum_can # 易拉罐
3: glass_bottle # 玻璃瓶
4: paper_cup # 纸杯
5: plastic_bag # 塑料袋
6: cigarette_butt # 烟头
7: tissue # 纸巾
8: food_wrapper # 食品包装
9: straw # 吸管
10: cardboard # 纸板
11: styrofoam # 泡沫塑料
12: metal_cap # 金属盖
13: broken_glass # 碎玻璃
14: battery # 电池
15: mask # 口罩
16: umbrella # 雨伞
17: shoe # 鞋子
18: toy # 玩具
19: book # 书本
20: leaf # 落叶 (如果是作为垃圾)
21: branch # 树枝
22: stone # 石块
23: cloth # 布料
24: tire # 轮胎
25: bucket # 桶
26: box # 盒子
27: other_trash # 其他垃圾
⚠️ 请务必核对您的数据集文档,确保顺序和名称与txt标注中的数字对应!
🚀 第三步:模型训练代码 (基于 YOLOv8)
推荐使用 Ultralytics 的 YOLOv8,它对多类别小目标检测效果很好。
安装依赖:
pip install ultralytics
训练脚本 (train_model.py):
from ultralytics import YOLO
def train_garbage_detector():
# 1. 加载预训练模型 (推荐 yolov8n.pt 或 yolov8s.pt,速度快且适合移动端部署)
# n=nano, s=small, m=medium, l=large, x=xlarge
model = YOLO(‘yolov8n.pt’)
# 2. 开始训练
results = model.train(
data='street_garbage.yaml', # 指向上面创建的yaml文件
epochs=100, # 训练轮数,可根据收敛情况调整
imgsz=640, # 输入图片尺寸
batch=16, # 批次大小,根据显存调整 (显存小可设为8)
workers=4, # 数据加载线程数
device='0', # 使用GPU (0),如果是CPU则改为 'cpu'
project='garbage_detection', # 项目保存目录
name='exp_street_28classes', # 实验名称
patience=20, # 早停耐心值,防止过拟合
save=True, # 保存检查点
plots=True # 生成训练过程图表
)
print("训练完成!模型保存在 runs/detect/exp_street_28classes/weights/best.pt")
if name == ‘main’:
train_garbage_detector()
🔍 第四步:推理/检测代码
训练完成后,使用以下代码对新图片进行检测。
检测脚本 (detect.py):
from ultralytics import YOLO
import cv2
def detect_garbage(image_path, model_path):
# 加载训练好的最佳模型
model = YOLO(model_path)
# 进行预测
results = model.predict(
source=image_path,
conf=0.25, # 置信度阈值
iou=0.45, # NMS IoU阈值
show=True, # 是否直接显示结果窗口
save=True, # 是否保存图片到 runs/detect/predict
line_width=2 # 边框粗细
)
# 打印检测结果详情
for result in results:
boxes = result.boxes
for box in boxes:
cls_id = int(box.cls[0])
conf = float(box.conf[0])
class_name = result.names[cls_id]
print(f"检测到: {class_name}, 置信度: {conf:.2f}")
if name == ‘main’:
# 替换为您的模型路径和图片路径
model_file = ‘runs/detect/exp_street_28classes/weights/best.pt’
test_image = ‘test_street.jpg’
detect_garbage(test_image, model_file)
💡 针对该数据集的特别建议
类别不平衡问题:
28类垃圾中,某些类别(如塑料瓶)
小目标检测:
街道垃圾(如烟头、吸管)通常很小。
优化:训练时将 imgsz 设置为更大(如 1280),虽然会减慢速度,但能显著提升小物体检测率。
:model.train(…, imgsz=1280, …)
更多推荐

所有评论(0)