从数据集选择到模型训练:手把手教你用YOLOv8搞定遥感目标检测(附DOTA/FAIR1M实战)
当第一次接触遥感目标检测任务时,面对DOTA、FAIR1M这些动辄几十GB的数据集,很多开发者都会感到无从下手。本文将带你从零开始,完成一个完整的遥感目标检测项目——从选择合适的数据集,到数据预处理、模型训练,最终实现高精度检测。我们会重点对比不同数据集的特点,并给出YOLOv8在遥感场景下的优化技巧。
1. 遥感目标检测数据集深度对比
选择合适的数据集是项目成功的第一步。目前主流的遥感数据集主要分为两类:水平边界框(HBB)和旋转边界框(OBB)。以下是几个核心数据集的对比分析:
| 数据集 | 类别数 | 图像数量 | 实例数量 | 标注类型 | 分辨率范围 | 特色场景 |
|---|---|---|---|---|---|---|
| DOTA | 15 | 2,806 | 188,282 | OBB | 0.5-30m | 多尺度目标 |
| FAIR1M | 37 | 15,266 | 1M+ | OBB | 0.3-0.8m | 细粒度分类 |
| UCAS-AOD | 2 | 2,420 | 14,596 | HBB | 0.5-2m | 飞机/车辆专用 |
| HRSC2016 | 19 | 1,071 | 2,976 | OBB | 0.4-2m | 船舶检测 |
DOTA的优势在于场景多样性,包含15个常见类别,特别适合需要检测多种目标的场景。其OBB标注方式能更好地处理旋转目标。最新版本DOTA-v1.5还增加了对小目标的标注密度。
FAIR1M是目前最精细的遥感数据集,不仅区分飞机型号,还将船舶细分为Liquid Cargo Ship、Container Ship等子类。如果你的项目需要识别具体型号,这个数据集是不二之选。
对于计算资源有限的开发者,可以从UCAS-AOD这类小型数据集入手。它虽然只包含飞机和车辆两类,但标注质量高,适合快速验证算法原型。
2. 数据预处理实战技巧
拿到遥感数据后,通常需要经过以下处理流程:
数据格式转换
大多数遥感数据集使用非标准格式存储标注,需要转换为YOLO格式。以DOTA为例,其OBB标注需要转换为YOLOv8支持的旋转框格式:def dota_to_yolo_obb(line, img_width, img_height): parts = line.split() points = [float(p) for p in parts[:8]] class_id = parts[8] # 转换为归一化坐标 normalized = [(x/img_width, y/img_height) for x,y in zip(points[::2], points[1::2])] return f"{class_id} {' '.join(map(str, [coord for pair in normalized for coord in pair]))}"图像切片处理
遥感图像通常尺寸巨大(如4000×4000),直接输入网络会导致显存不足。推荐使用滑动窗口切割:python scripts/slice_image.py \ --input_dir ./DOTA/images \ --output_dir ./sliced \ --slice_size 1024 \ --overlap 200数据增强策略
针对遥感图像特点,建议在YOLOv8配置中添加以下增强:augment: hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 45 # 大幅旋转增强 translate: 0.2 scale: 0.5 # 尺度变化增强 shear: 15 perspective: 0.001 flipud: 0.5 # 上下翻转 fliplr: 0.5 # 左右翻转
注意:处理OBB数据时,常规的水平翻转会导致标注错误,需要使用专门的旋转框增强库如 imgaug 。
3. YOLOv8模型训练优化
3.1 模型选择与修改
YOLOv8原生支持旋转框检测,只需在数据配置中指定obb格式:
# data.yaml path: ./DOTA train: images/train val: images/val names: 0: plane 1: ship # ...其他类别 obb: True # 关键参数对于小目标密集场景(如FAIR1M),建议使用YOLOv8x模型并修改Anchor:
from ultralytics import YOLO model = YOLO('yolov8x-obb.yaml') model.model.anchors = [[5,6, 8,14, 15,11], [10,13, 16,30, 33,23]] # 调整anchor尺寸3.2 训练参数调优
关键训练参数配置示例:
yolo train \ model=yolov8x-obb.yaml \ data=data.yaml \ epochs=300 \ batch=16 \ imgsz=1024 \ optimizer=AdamW \ lr0=0.001 \ weight_decay=0.05 \ warmup_epochs=3 \ box=7.5 # 调整旋转框损失权重针对遥感图像的特殊性,我们还需要:
使用跨阶段特征融合提升小目标检测:
# 在model.yaml中添加 head: - [-1, 1, nn.ConvTranspose2d, [256, 256, 4, 4]] # 上采样 - [[-1, -2], 1, Concat, [1]]采用在线困难样本挖掘(OHEM):
loss: ohem_ratio: 0.7 # 保留70%困难样本
4. 评估与部署实战
4.1 评估指标解读
遥感目标检测常用特殊指标:
- mAP50-OBB:旋转框IoU阈值0.5时的平均精度
- mAP50-95-OBB:IoU阈值0.5到0.95的平均精度
- 方位角准确率:预测框角度误差<5°的比例
使用DOTA官方评估工具:
python tools/evaluation.py \ --pred_dir ./runs/detect/predict/labels \ --gt_dir ./DOTA/labels/val \ --imagesetfile ./DOTA/ImageSets/val.txt4.2 模型部署优化
将训练好的模型转换为TensorRT格式提升推理速度:
from ultralytics import YOLO model = YOLO('best.pt') model.export(format='engine', device=0, imgsz=1024)针对不同硬件平台的优化建议:
- Jetson系列:使用
--half启用FP16推理 - CPU部署:添加
--int8量化选项 - Web端:导出为ONNX后使用ONNX.js运行
在实际项目中,我们发现以下几个技巧能显著提升效果:
- 对FAIR1M数据集,先按大类预训练再微调子类
- 使用TTA(Test Time Augmentation)时限制旋转角度范围
- 对高分辨率图像采用金字塔推理策略
处理特别密集的小目标时,可以尝试这种后处理方案:
def nms_obb(dets, iou_thr): # 基于角度加权的NMS算法 angles = dets[:, 5] weights = np.cos(2 * angles) + 1.5 # 角度相似度权重 scores = dets[:, 4] * weights keep = [] while len(dets) > 0: max_idx = np.argmax(scores) keep.append(max_idx) # 计算旋转IoU ious = rotated_iou(dets[max_idx:max_idx+1], dets) mask = ious <= iou_thr dets = dets[mask] scores = scores[mask] return keep