1. 数据集背景与应用场景解析
这个无人机高精度城市河道治理垃圾检测数据集,是我在参与某沿海城市智慧水务项目时积累的实战成果。当时我们面临的核心痛点是:传统人工河道巡检效率低下,小型漂浮垃圾经常被漏检,而市面上现有的数据集要么类别不符,要么样本量不足。经过三个月的无人机航拍和标注工作,最终形成了这个包含5类2600张标注图像的数据集。
从实际应用来看,这个数据集特别适合以下三类场景:
- 河道日常巡检:无人机每小时可覆盖5公里河道,配合该数据集训练的模型,能自动标记塑料瓶、泡沫箱等常见污染物位置
- 暴雨后垃圾堆积监测:洪水冲刷带来的突发性垃圾聚集,通过航拍对比可快速评估污染程度
- 清洁作业效果验证:清理前后拍摄对比,量化评估治理成效
关键提示:数据集中的"聚苯乙烯"类别特指外卖盒、泡沫箱等白色污染物,这类轻质垃圾在河道拐弯处最易堆积,是需要重点监测的对象
2. 数据集核心技术指标详解
2.1 数据采集与标注规范
我们采用大疆M300 RTK无人机搭配H20T混合传感器负载,在离水面15-30米高度拍摄,确保单个像素对应实际尺寸2-3cm。标注时遵循以下原则:
- 目标可见性原则:只标注完全露出水面的物体,被水淹没超过1/3的垃圾不做标注
- 阴影处理规范:物体投射在水面的阴影不纳入标注范围
- 多角度覆盖:同一段河道在不同光照条件(顺光/逆光)下重复采集
标注文件采用YOLO格式,每个txt文件包含:
code复制<class_id> <x_center> <y_center> <width> <height>
所有坐标值已归一化处理,可直接用于训练。
2.2 类别定义与样本分布
| 类别ID | 中文名称 | 英文标签 | 样本量 | 典型场景示例 |
|---|---|---|---|---|
| 0 | 瓶子 | bottle | 632 | 矿泉水瓶、饮料瓶 |
| 1 | 硬塑料 | hard_plastic | 587 | 塑料桶、玩具碎片 |
| 2 | 口罩 | mask | 429 | 一次性医用口罩 |
| 3 | 聚苯乙烯 | polystyrene | 512 | 泡沫箱、外卖包装 |
| 4 | 软塑料 | soft_plastic | 440 | 塑料袋、包装膜 |
特别要注意的是"硬塑料"与"软塑料"的区分标准:
- 硬塑料:能保持固定形状的塑料制品(如桶、盒)
- 软塑料:易变形、可折叠的塑料材料(如薄膜、软包装)
3. 数据增强与模型训练实战
3.1 必须做的数据预处理
由于航拍图像的特殊性,建议在训练前执行以下增强策略:
python复制import albumentations as A
train_transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.3),
A.CLAHE(p=0.2),
A.HueSaturationValue(hue_shift_limit=20,
sat_shift_limit=30,
val_shift_limit=20, p=0.3),
A.GaussNoise(var_limit=(10, 50), p=0.2)
], bbox_params=A.BboxParams(format='yolo'))
关键增强逻辑解析:
- CLAHE增强:解决逆光拍摄导致的局部过暗问题
- 高斯噪声:模拟无人机传输过程中的信号干扰
- 色相调整:覆盖不同水质下的颜色偏差(浑浊/清澈)
3.2 模型选型与训练技巧
基于实测对比,推荐采用YOLOv8n模型架构,训练配置如下:
yaml复制# yolov8n.yaml
pretrained: True
optimizer: AdamW
lr0: 0.001
batch: 16
epochs: 100
imgsz: 640
augment: True
fliplr: 0.5
hsv_h: 0.015
hsv_s: 0.7
hsv_v: 0.4
训练过程中的关键观察点:
- Epoch 10-20:验证集mAP应突破0.65,否则检查标注质量
- Epoch 50左右:关注"口罩"类别的召回率,这类目标最易漏检
- Epoch 80+:软塑料与水面反光的混淆度应降至0.1以下
4. 典型问题排查手册
4.1 误检问题分析
现象:水面波纹被识别为软塑料
解决方案:
- 在验证集上统计误检样本的光照角度
- 增加45度侧光拍摄的样本
- 对soft_plastic类别启用cutout增强
参数调整:
python复制A.Cutout(num_holes=8,
max_h_size=32,
max_w_size=32,
p=0.5)
4.2 小目标漏检优化
对于直径小于20像素的目标(如远处漂浮的瓶盖):
- 修改模型head处的检测层:
yaml复制# 增加小目标检测层
head:
- [15, 18, 24] # P3/8 (小目标)
- [18, 21, 28] # P4/16
- [24, 28, 32] # P5/32
- 使用K-Means重新聚类anchor:
python复制from utils.autoanchor import kmean_anchors
anchors = kmean_anchors('./data.yaml', 9, 640, 5.0, 1000)
5. 部署应用中的实战经验
在边缘计算设备部署时,我们总结出这些黄金法则:
-
ROI区域设置:只检测河道水面区域(约占画面的60%),将推理速度提升40%
python复制def set_roi(frame): h, w = frame.shape[:2] roi_y = int(h * 0.2) # 去掉顶部20%的天空 return frame[roi_y:h, 0:w] -
动态阈值策略:根据光照自动调整检测阈值
python复制def dynamic_thresh(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) brightness = np.mean(gray) return 0.4 if brightness > 150 else 0.25 -
跨时段验证:必须在以下时段测试模型表现:
- 正午(强反光)
- 日落前2小时(长阴影)
- 阴天(低对比度)
我们在某沿海城市的实际部署中,这套方案使垃圾识别准确率从初期的72%提升至89%,误报率降至每小时不足5次。最关键的是发现了传统巡检中难以察觉的微塑料堆积点,这些直径1-5cm的碎片在特定河段形成了污染带。