保姆级教程:手把手教你用YOLOv8obb搞定UCAS-AOD遥感旋转目标检测(附数据集处理脚本)
2026/6/2 21:43:33 网站建设 项目流程

从零实现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_ok=True) 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_ok=True) # 划分训练集、验证集 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_dir=dataset_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 python=3.8 -y conda activate yolo_obb # 安装PyTorch pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113 # 安装Ultralytics pip install ultralytics

3.2 验证安装

import ultralytics print(ultralytics.__version__) # 应输出8.x.x版本号 # 检查CUDA可用性 from torch import cuda print(cuda.is_available()) # 应输出True

4. 模型训练与调优

4.1 数据配置文件

创建ucas_aod.yaml配置文件:

path: /path/to/ucas_aod_obb train: train/images val: val/images names: 0: CAR 1: PLANE

4.2 基础训练命令

yolo detect train \ data=ucas_aod.yaml \ model=yolov8s-obb.yaml \ pretrained=yolov8s-obb.pt \ epochs=300 \ imgsz=640 \ batch=16 \ device=0 \ workers=8 \ optimizer=AdamW \ lr0=0.001 \ weight_decay=0.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.1

5. 模型评估与结果分析

5.1 评估指标解读

YOLOv8obb输出的关键指标:

  • mAP50: IoU阈值为0.5时的平均精度
  • mAP50-95: IoU阈值从0.5到0.95的平均精度
  • precision: 查准率
  • recall: 查全率

典型评估命令:

yolo detect val \ data=ucas_aod.yaml \ model=runs/detect/train/weights/best.pt \ imgsz=640 \ device=0

5.2 可视化分析

使用YOLOv8内置工具生成预测结果:

from ultralytics import YOLO model = YOLO('runs/detect/train/weights/best.pt') results = model.predict( source='val/images', conf=0.25, iou=0.6, show_labels=True, show_conf=True )

对于误检案例分析,可以重点关注:

  1. 小目标检测效果
  2. 密集目标分离能力
  3. 极端角度下的识别准确率

6. 实际应用优化建议

6.1 模型轻量化

对于嵌入式设备部署,可以考虑:

yolo export \ model=best.pt \ format=onnx \ imgsz=640 \ opset=12 \ simplify=True \ dynamic=False

6.2 推理加速技巧

TensorRT优化

yolo export model=best.pt format=engine device=0

批处理优化

results = model.predict( source='input_images/*.png', batch=4, # 根据显存调整 stream=True # 减少内存占用 )

在实际项目中,我们发现将图像预处理和后处理移到GPU上执行,可以额外获得15-20%的推理速度提升。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询