保姆级教程:手把手教你用YOLOv8-OBB训练自己的遥感旋转目标检测模型(UCAS-AOD数据集)
从零构建遥感旋转目标检测模型YOLOv8-OBB实战指南遥感图像中的目标检测一直是计算机视觉领域的重要课题。与常规水平边界框HBB检测不同旋转目标检测OBB能够更精确地框定倾斜物体在航拍图像分析、自动驾驶等场景中尤为重要。本文将手把手带您完成从UCAS-AOD数据集处理到YOLOv8-OBB模型训练的全流程。1. 理解UCAS-AOD数据集特性UCAS-AOD数据集包含2420幅航拍图像涵盖飞机、汽车两类目标及背景样本。其特殊之处在于标注方式——采用旋转矩形框HBB而非传统水平框。原始标注格式包含12个数值x1,y1,x2,y2,x3,y3,x4,y4,theta,x,y,width,height其中前8个坐标代表旋转框的四个顶点坐标theta表示倾斜角度后4个参数则是传统水平框的中心点和宽高。这种混合标注方式在实际使用中需要特别注意图像尺寸不统一1280×659或1372×941同一物体可能同时存在旋转框和水平框标注角度表示方式需要统一规范通常采用OpenCV的0-180度表示法提示处理前建议先统计原始标注的theta值分布避免后续角度转换时出现方向混乱。2. 标注格式转换实战YOLOv8-OBB要求输入特定的OBB格式class cx cy w h angle我们需要将原始HBB标注转换为这种格式。转换过程分为两个关键步骤2.1 原始数据预处理首先提取有效的旋转框顶点坐标前8个值并添加类别信息。以下Python脚本演示了这一过程import os import numpy as np def convert_ucas_to_intermediate(input_path, output_path): for filename in os.listdir(input_path): if not filename.endswith(.txt): continue with open(f{input_path}/{filename}) as f_in, \ open(f{output_path}/{filename}, w) as f_out: for line in f_in: data list(map(float, line.strip().split(\t))) vertices np.array(data[:8]).reshape(4, 2) # 确定类别示例代码实际需根据文件名判断 class_name PLANE if PLANE in filename else CAR class_idx 0 if class_name CAR else 1 # 写入转换后的中间格式 f_out.write(\t.join(map(str, vertices.flatten())) f\t{class_name}\t{class_idx}\n)2.2 转换为YOLO-OBB格式使用Ultralytics官方提供的转换工具完成最终格式转换from ultralytics.data.converter import convert_dota_to_yolo_obb # 目录结构要求 # ├── images # │ ├── image1.png # │ └── ... # └── labels # ├── image1.txt # └── ... convert_dota_to_yolo_obb(/path/to/dataset)转换后的标注文件示例0 0.2159 0.1385 0.2274 0.0580 0.2585 0.0748 0.2470 0.1552 1 0.1984 0.2554 0.1977 0.1883 0.2460 0.1862 0.2468 0.25333. 数据准备与增强策略3.1 数据集YAML配置创建dataset.yaml文件配置数据路径和类别path: /path/to/ucas_aod train: images/train val: images/val test: images/test names: 0: CAR 1: PLANE3.2 针对遥感图像的特殊增强在data.yaml中添加增强参数augment: hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 45.0 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0005 flipud: 0.5 fliplr: 0.5关键增强策略较大的旋转角度degrees: 45适应航拍物体多角度特性上下翻转flipud模拟不同航拍视角适度的色彩扰动应对光照变化4. 模型训练与调优4.1 基础训练命令yolo detect train dataucas_aod.yaml modelyolov8s-obb.yaml pretrainedweights/yolov8s-obb.pt epochs300 imgsz6404.2 关键参数优化建议参数推荐值作用说明lr00.01初始学习率lrf0.1最终学习率衰减系数warmup_epochs5学习率预热轮数box0.05框回归损失权重cls0.5分类损失权重dfl1.5分布焦点损失权重angle0.05角度预测损失权重4.3 提升mAP50的技巧角度编码优化在task/obb.py中调整角度编码方式def encode_angle(angle): # 将角度归一化到[0,1]范围 return (angle % 180) / 180自适应锚框计算yolo detect train ... calc_anchorsTrue多尺度训练augment: scale: [0.5, 1.5] # 随机缩放范围5. 常见问题解决方案问题1训练时出现NaN in loss错误检查标注坐标是否超出[0,1]范围降低初始学习率lr00.001添加梯度裁剪grad_clip_norm10.0问题2角度预测不准确确认原始标注角度单位弧度/角度增加角度损失权重angle0.2在数据增强中增加旋转变化问题3小目标检测效果差使用更高分辨率imgsz1024采用多尺度训练调整锚框尺寸hyp.anchor_t3.0训练完成后使用以下命令验证模型性能yolo detect val modelruns/train/exp/weights/best.pt dataucas_aod.yaml实际部署时建议将模型转换为TensorRT格式提升推理速度yolo export modelbest.pt formatengine device0