1. 数据标注与工具选择在开始YOLOv8-OBB模型训练之前数据标注是至关重要的一步。对于旋转目标检测任务传统的水平框标注无法准确描述目标的方位信息这时候就需要使用旋转矩形框OBB进行标注。我推荐使用X-AnyLabeling这款开源标注工具它专门针对旋转目标检测任务进行了优化支持DOTA格式的标注输出。安装X-AnyLabeling非常简单直接从GitHub克隆仓库即可git clone https://github.com/CVHub520/X-AnyLabeling cd X-AnyLabeling python anylabeling/app.py实际标注时我发现几个实用技巧使用快捷键能大幅提升效率按P键开始绘制旋转框ZXCV键可以微调角度对于密集小目标建议放大图像后再标注标注完成后一定要检查角度是否正确这是旋转检测的关键标注完成后工具会生成DOTA格式的标注文件包含每个目标的四个角点坐标和类别信息。这种格式在遥感图像领域已经成为事实标准后续我们也会基于这个格式进行数据转换。2. 数据集准备与格式转换拿到DOTA格式的标注数据后我们需要进行一系列预处理才能用于YOLOv8-OBB训练。首先建议将数据集划分为训练集、验证集和测试集比例通常为7:2:1。下面这个Python脚本可以帮你自动完成划分import random import os import shutil def split_dataset(source_images_dir, source_labels_dir, train_images_dir, train_labels_dir, val_images_dir, val_labels_dir, test_images_dirNone, test_labels_dirNone, val_ratio0.2, test_ratio0.1): # 创建目标文件夹 os.makedirs(train_images_dir, exist_okTrue) os.makedirs(train_labels_dir, exist_okTrue) os.makedirs(val_images_dir, exist_okTrue) os.makedirs(val_labels_dir, exist_okTrue) # 获取所有图像文件 image_files [f for f in os.listdir(source_images_dir) if f.endswith((.jpg, .png))] random.shuffle(image_files) # 计算各集合大小 total len(image_files) val_size int(total * val_ratio) test_size int(total * test_ratio) if test_ratio 0 else 0 train_size total - val_size - test_size # 分配文件 for i, img_file in enumerate(image_files): base_name os.path.splitext(img_file)[0] label_file f{base_name}.txt if i train_size: dest_img os.path.join(train_images_dir, img_file) dest_label os.path.join(train_labels_dir, label_file) elif i train_size val_size: dest_img os.path.join(val_images_dir, img_file) dest_label os.path.join(val_labels_dir, label_file) else: if test_ratio 0: dest_img os.path.join(test_images_dir, img_file) dest_label os.path.join(test_labels_dir, label_file) else: continue shutil.copy(os.path.join(source_images_dir, img_file), dest_img) shutil.copy(os.path.join(source_labels_dir, label_file), dest_label)接下来是关键的一步将DOTA格式转换为YOLOv8-OBB格式。Ultralytics官方提供了转换工具但需要特别注意几点图像格式要统一全用jpg或png类别名称和顺序要与后续训练配置一致转换后的标注文件会包含归一化后的中心点坐标、宽高和旋转角度转换命令很简单from ultralytics.data.converter import convert_dota_to_yolo_obb convert_dota_to_yolo_obb(你的数据集路径)3. 模型配置与训练数据准备好后我们需要配置YOLOv8-OBB的训练环境。首先创建数据集配置文件通常命名为mydata.yaml# Ultralytics YOLO , AGPL-3.0 license path: /path/to/your/dataset train: images/train val: images/val test: images/test # 可选 # 类别定义 names: 0: airplane 1: ship 2: storage-tank 3: baseball-diamond 4: tennis-court # 添加你的其他类别...然后修改模型配置文件如yolov8n-obb.yaml主要调整类别数量# 参数 nc: 5 # 修改为你的类别数量 scales: # 模型规模系数 # [depth, width, max_channels] n: [0.33, 0.25, 1024] s: [0.33, 0.50, 1024] m: [0.67, 0.75, 1024] l: [1.00, 1.00, 1024] x: [1.00, 1.25, 1024] # 骨干网络和头部配置...开始训练的Python代码示例from ultralytics import YOLO def main(): # 加载模型配置和预训练权重 model YOLO(yolov8n-obb.yaml).load(yolov8n-obb.pt) # 训练参数配置 model.train( datamydata.yaml, epochs100, imgsz640, batch16, # 根据GPU显存调整 workers4, # 数据加载线程数 device0, # 使用哪块GPU optimizerAdamW, # 推荐使用的新优化器 lr00.001, # 初始学习率 weight_decay0.05, warmup_epochs3, box7.5, # 调整框损失权重 cls0.5, # 分类损失权重 angle0.2 # 角度损失权重 ) if __name__ __main__: main()训练过程中有几个关键点需要注意学习率设置对于小数据集可以适当减小数据增强YOLOv8默认会启用Mosaic等增强但对于旋转目标可能需要调整角度表示YOLOv8-OBB使用弧度制表示角度范围是[-π/2, π/2]显存占用旋转框检测比水平框更耗显存batch_size要适当减小4. 模型评估与推理训练完成后我们可以在验证集上评估模型性能model YOLO(runs/obb/train/weights/best.pt) metrics model.val( datamydata.yaml, splitval, imgsz640, conf0.25, # 置信度阈值 iou0.6, # IoU阈值 device0 )对于旋转框检测有几个特殊的评估指标需要关注mAP50: 使用0.5 IoU阈值时的平均精度mAP50-95: IoU阈值从0.5到0.95的平均精度角度误差预测框与真实框的角度差异实际推理时可以使用以下代码results model.predict( sourcetest_images, imgsz640, conf0.25, iou0.45, saveTrue, save_txtTrue, save_confTrue )对于遥感图像等大尺寸图像我建议使用滑窗推理results model.predict( sourcelarge_image.tif, imgsz640, conf0.25, iou0.45, stride320, # 滑窗步长 saveTrue )5. 模型优化与部署训练好的模型通常还需要进一步优化才能投入实际应用。对于YOLOv8-OBB模型可以考虑以下几个优化方向量化压缩将FP32模型转换为INT8减小模型体积model.export(formatonnx, imgsz640, int8True)TensorRT加速生成engine文件提升推理速度model.export(formatengine, imgsz640)后处理优化自定义NMS算法平衡精度和速度模型剪枝移除冗余通道减小模型大小实际部署时可以使用Ultralytics提供的FastAPI服务from ultralytics import YOLO from fastapi import FastAPI, File, UploadFile app FastAPI() model YOLO(yolov8n-obb.pt) app.post(/predict) async def predict(file: UploadFile File(...)): results model(file.file) return results[0].obb.data.tolist()对于边缘设备部署建议使用OpenVINO或TensorRT格式它们对Intel和NVIDIA硬件有更好的支持。我在实际项目中发现经过优化的YOLOv8-OBB模型在Jetson Xavier NX上可以达到30 FPS的实时性能完全满足工业检测需求。