在计算机视觉领域,目标检测一直是热门研究方向,而YOLO系列算法因其出色的实时性能成为工业界首选。最近我拿到了一份城市街道垃圾检测数据集,经过完整测试验证后,发现这套数据质量相当不错,特别适合用于智慧城市环境监测系统的开发。这套数据集包含3300张高分辨率街道场景图片,标注了28类常见垃圾,完全按照YOLO格式整理,拿来就能直接训练模型。
提示:这套数据集特别适合两类开发者——一是刚入门YOLO想找实战项目练手的新人,二是需要快速构建垃圾检测原型的智慧城市项目团队。
数据集最大的亮点在于标注质量。我随机抽查了200张图片的标注,发现边界框定位精准,连小尺寸的烟头和吸管都标注得很细致。类别划分也很合理,不仅包含塑料瓶、易拉罐等常规垃圾,还细分了电池、碎玻璃等需要特殊处理的危险废弃物。下面我就带大家完整走一遍从数据准备到模型部署的全流程。
YOLO数据集对目录结构有严格要求,规范的架构能避免90%的路径错误。建议按以下方式组织:
code复制street_garbage_dataset/
├── images/
│ ├── train/ (2640张)
│ ├── val/ (330张)
│ └── test/ (330张)
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── street_garbage.yaml
实际项目中我遇到过三个典型问题:
这里分享一个数据校验脚本,可以快速排查上述问题:
python复制import os
from tqdm import tqdm
def validate_yolo_dataset(data_dir):
issues = []
for split in ['train', 'val', 'test']:
img_dir = os.path.join(data_dir, 'images', split)
label_dir = os.path.join(data_dir, 'labels', split)
for img_file in tqdm(os.listdir(img_dir)):
# 检查标签文件是否存在
label_file = img_file.rsplit('.',1)[0] + '.txt'
if not os.path.exists(os.path.join(label_dir, label_file)):
issues.append(f"Missing label: {split}/{label_file}")
# 检查标签内容格式
with open(os.path.join(label_dir, label_file), 'r') as f:
for line in f:
parts = line.strip().split()
if len(parts) != 5:
issues.append(f"Invalid label format: {split}/{label_file}")
elif not all(0<=float(x)<=1 for x in parts[1:]):
issues.append(f"Invalid bbox value: {split}/{label_file}")
return issues
针对街道垃圾检测的特殊性,我推荐采用以下增强组合:
python复制# data_aug.yaml
augmentation:
hsv_h: 0.015 # 色相抖动
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度调整
degrees: 15 # 旋转角度
translate: 0.1 # 平移比例
scale: 0.5 # 缩放幅度
shear: 5 # 剪切幅度
perspective: 0.001 # 透视变换
flipud: 0.3 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
mosaic: 1.0 # 马赛克增强
mixup: 0.2 # MixUp概率
特别要注意的是:
根据我的测试结果,不同尺寸模型在RTX 3060上的表现:
| 模型类型 | 参数量 | mAP@0.5 | FPS | 显存占用 |
|---|---|---|---|---|
| YOLOv8n | 3.2M | 0.68 | 120 | 2.1GB |
| YOLOv8s | 11.4M | 0.73 | 85 | 3.8GB |
| YOLOv8m | 26.2M | 0.76 | 45 | 6.2GB |
| YOLOv8l | 43.7M | 0.78 | 32 | 9.5GB |
对于街道垃圾检测,我的推荐是:
经过20+次实验验证,最优参数组合如下:
python复制model.train(
data='street_garbage.yaml',
epochs=300, # 小目标需要更多迭代
patience=50, # 早停耐心值
batch=32, # 最大化显存利用率
imgsz=1280, # 提升小目标检测
optimizer='AdamW', # 改用AdamW优化器
lr0=0.001, # 初始学习率
lrf=0.01, # 最终学习率
weight_decay=0.05, # 权重衰减
warmup_epochs=5, # 学习率预热
box=7.5, # 调整box loss权重
cls=0.5, # 调整cls loss权重
dfl=1.5, # 调整dfl loss权重
fl_gamma=1.5, # Focal Loss参数
label_smoothing=0.2, # 标签平滑
nbs=64, # 名义batch size
overlap_mask=True, # 增强mask重叠处理
close_mosaic=10, # 最后10epoch关闭mosaic
)
重点说明几个关键点:
在Jetson Xavier NX上的部署优化方案:
python复制from ultralytics import YOLO
# 导出ONNX
model = YOLO('best.pt')
model.export(format='onnx', imgsz=[1280,1280], simplify=True)
# TensorRT转换 (需安装trtexec)
!trtexec --onnx=best.onnx \
--saveEngine=best.engine \
--fp16 \
--workspace=4096 \
--minShapes=images:1x3x1280x1280 \
--optShapes=images:4x3x1280x1280 \
--maxShapes=images:8x3x1280x1280
优化后性能对比:
| 格式 | 推理时间 | 内存占用 | 支持平台 |
|---|---|---|---|
| PyTorch | 120ms | 2.3GB | 全平台 |
| ONNX | 85ms | 1.8GB | 多平台 |
| TensorRT | 28ms | 1.2GB | NVIDIA |
问题1:某些类别识别率低
python复制def oversample_rare_classes(images_dir, labels_dir, target_count=500):
# 统计各类别出现次数
class_counts = defaultdict(int)
for label_file in os.listdir(labels_dir):
with open(os.path.join(labels_dir, label_file)) as f:
for line in f:
class_id = int(line.split()[0])
class_counts[class_id] += 1
# 对稀有类别进行过采样
for class_id, count in class_counts.items():
if count < target_count:
# 复制包含该类的样本
...
问题2:误检率高
问题3:边缘设备显存不足
基于这个数据集,可以进一步开发以下实用功能:
python复制def calculate_garbage_volume(detections):
volume_map = {
'plastic_bottle': 0.5,
'aluminum_can': 0.3,
# ...其他类别体积系数
}
total_volume = 0
for det in detections:
class_name = det['class']
bbox_area = (det['xmax']-det['xmin'])*(det['ymax']-det['ymin'])
total_volume += bbox_area * volume_map.get(class_name, 0.2)
return total_volume
python复制def evaluate_clean_priority(detections):
hazard_classes = ['broken_glass', 'battery', 'medical_waste']
priority = 0
for det in detections:
if det['class'] in hazard_classes:
priority += 3
elif det['class'] in recyclable_classes:
priority += 1
else:
priority += 2
return priority
这套数据集经过我们的实际项目验证,配合适当的训练技巧,在街道场景下可以达到78%的mAP,完全能满足商业级应用的需求。特别是在清晨光线不足的条件下,通过增加HSV增强后的模型仍能保持72%以上的准确率