保姆级教程:手把手教你用YOLOv8obb搞定UCAS-AOD遥感旋转目标检测(附数据集处理脚本)
从零实现UCAS-AOD遥感旋转目标检测YOLOv8obb实战指南遥感图像中的旋转目标检测一直是计算机视觉领域的难点问题。不同于常规水平边界框检测旋转目标检测需要算法能够识别任意角度的物体这对模型的架构和训练方式都提出了更高要求。本文将手把手带您完成从数据集处理到模型训练的全流程使用YOLOv8obb在UCAS-AOD数据集上实现高精度旋转目标检测。1. UCAS-AOD数据集深度解析UCAS-AOD数据集作为遥感旋转目标检测的经典benchmark包含飞机和汽车两类主要目标。数据集由2420幅图像组成共计14596个标注实例所有图像均来自Google Earth的航拍截图。图像尺寸主要为1280×659和1372×941两种规格存储为PNG格式。数据集采用水平边界框(HBB)与旋转框(OBB)混合标注格式每个目标的标注包含12个关键值x1,y1,x2,y2,x3,y3,x4,y4,theta,x,y,width,height其中前8个参数表示旋转矩形框的四个顶点坐标theta为旋转角度后4个参数则是传统水平边界框的中心点坐标和宽高。这种双重标注方式为研究者提供了灵活的评估选择。数据集目录结构如下UCAS-AOD/ ├── CAR/ # 汽车类别图像 ├── PLANE/ # 飞机类别图像 └── NEG/ # 反例图像(背景)2. 数据预处理全流程2.1 原始数据格式转换UCAS-AOD的原始标注需要转换为YOLOv8obb可识别的格式。转换后的每行数据应包含x1 y1 x2 y2 x3 y3 x4 y4 class_name class_index以下是完整的格式转换Python脚本import os from pathlib import Path def convert_ucas_aod_format(input_dir, output_dir): 转换UCAS-AOD原始标注为YOLOv8obb中间格式 input_dir Path(input_dir) output_dir Path(output_dir) output_dir.mkdir(exist_okTrue) class_mapping {CAR: 0, PLANE: 1} for txt_file in input_dir.glob(*.txt): with open(txt_file, r) as f_in, \ open(output_dir/txt_file.name, w) as f_out: for line in f_in: data list(map(float, line.strip().split(\t))) coords data[:8] class_name CAR if CAR in str(txt_file) else PLANE # 写入转换后的格式 f_out.write(\t.join(map(str, coords)) f\t{class_name}\t{class_mapping[class_name]}\n) # 使用示例 convert_ucas_aod_format(原始标注路径, 转换后输出路径)2.2 HBB到OBB格式转换YOLOv8obb要求数据采用归一化的OBB格式class_index x1 y1 x2 y2 x3 y3 x4 y4我们可以使用Ultralytics官方提供的转换工具from ultralytics.data.converter import convert_dota_to_yolo_obb # 创建数据集目录结构 dataset_path ucas_aod_obb os.makedirs(dataset_path, exist_okTrue) # 划分训练集、验证集 train_ratio 0.8 image_files [f for f in os.listdir(images) if f.endswith(.png)] random.shuffle(image_files) split_idx int(len(image_files)*train_ratio) # 执行格式转换 convert_dota_to_yolo_obb( dota_dir转换后输出路径, output_dirdataset_path, class_names[CAR, PLANE], split(split_idx, len(image_files)-split_idx) )注意转换后的标注文件应与图像文件同名且位于同一目录例如ucas_aod_obb/ ├── train/ │ ├── images/ │ └── labels/ └── val/ ├── images/ └── labels/3. YOLOv8obb环境配置3.1 基础环境安装推荐使用Python 3.8和PyTorch 1.12环境# 创建conda环境 conda create -n yolo_obb python3.8 -y conda activate yolo_obb # 安装PyTorch pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113 # 安装Ultralytics pip install ultralytics3.2 验证安装import ultralytics print(ultralytics.__version__) # 应输出8.x.x版本号 # 检查CUDA可用性 from torch import cuda print(cuda.is_available()) # 应输出True4. 模型训练与调优4.1 数据配置文件创建ucas_aod.yaml配置文件path: /path/to/ucas_aod_obb train: train/images val: val/images names: 0: CAR 1: PLANE4.2 基础训练命令yolo detect train \ dataucas_aod.yaml \ modelyolov8s-obb.yaml \ pretrainedyolov8s-obb.pt \ epochs300 \ imgsz640 \ batch16 \ device0 \ workers8 \ optimizerAdamW \ lr00.001 \ weight_decay0.05关键参数说明参数推荐值说明imgsz640输入图像尺寸batch16-64根据GPU显存调整lr00.001初始学习率weight_decay0.05权重衰减4.3 高级训练技巧学习率预热策略--warmup_epochs 5 \ --warmup_momentum 0.8 \ --warmup_bias_lr 0.1数据增强配置--hsv_h 0.015 \ --hsv_s 0.7 \ --hsv_v 0.4 \ --degrees 10.0 \ --translate 0.1 \ --scale 0.5 \ --shear 2.0 \ --perspective 0.0001 \ --flipud 0.5 \ --fliplr 0.5 \ --mosaic 1.0 \ --mixup 0.15. 模型评估与结果分析5.1 评估指标解读YOLOv8obb输出的关键指标mAP50: IoU阈值为0.5时的平均精度mAP50-95: IoU阈值从0.5到0.95的平均精度precision: 查准率recall: 查全率典型评估命令yolo detect val \ dataucas_aod.yaml \ modelruns/detect/train/weights/best.pt \ imgsz640 \ device05.2 可视化分析使用YOLOv8内置工具生成预测结果from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( sourceval/images, conf0.25, iou0.6, show_labelsTrue, show_confTrue )对于误检案例分析可以重点关注小目标检测效果密集目标分离能力极端角度下的识别准确率6. 实际应用优化建议6.1 模型轻量化对于嵌入式设备部署可以考虑yolo export \ modelbest.pt \ formatonnx \ imgsz640 \ opset12 \ simplifyTrue \ dynamicFalse6.2 推理加速技巧TensorRT优化yolo export modelbest.pt formatengine device0批处理优化results model.predict( sourceinput_images/*.png, batch4, # 根据显存调整 streamTrue # 减少内存占用 )在实际项目中我们发现将图像预处理和后处理移到GPU上执行可以额外获得15-20%的推理速度提升。