从数据集选择到模型训练:手把手教你用YOLOv8搞定遥感目标检测(附DOTA/FAIR1M实战)
从数据集选择到模型训练手把手教你用YOLOv8搞定遥感目标检测附DOTA/FAIR1M实战当第一次接触遥感目标检测任务时面对DOTA、FAIR1M这些动辄几十GB的数据集很多开发者都会感到无从下手。本文将带你从零开始完成一个完整的遥感目标检测项目——从选择合适的数据集到数据预处理、模型训练最终实现高精度检测。我们会重点对比不同数据集的特点并给出YOLOv8在遥感场景下的优化技巧。1. 遥感目标检测数据集深度对比选择合适的数据集是项目成功的第一步。目前主流的遥感数据集主要分为两类水平边界框(HBB)和旋转边界框(OBB)。以下是几个核心数据集的对比分析数据集类别数图像数量实例数量标注类型分辨率范围特色场景DOTA152,806188,282OBB0.5-30m多尺度目标FAIR1M3715,2661MOBB0.3-0.8m细粒度分类UCAS-AOD22,42014,596HBB0.5-2m飞机/车辆专用HRSC2016191,0712,976OBB0.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模型并修改Anchorfrom 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 \ modelyolov8x-obb.yaml \ datadata.yaml \ epochs300 \ batch16 \ imgsz1024 \ optimizerAdamW \ lr00.001 \ weight_decay0.05 \ warmup_epochs3 \ box7.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-OBBIoU阈值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(formatengine, device0, imgsz1024)针对不同硬件平台的优化建议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_idx1], dets) mask ious iou_thr dets dets[mask] scores scores[mask] return keep