由于项目里面需要用到机载的旋转目标检测(Oriented Bounding Box, OBB),本来想在yolov8上面直接加obb检测相关的模块,没想到官方更新了DOTAv2数据的yaml文件,意味着v8已经支持了obb检测,但是现在版本还不是很完善,遂记录一下在这里面的一些坑。
可供参考的官网地址:https://docs.ultralytics.com/zh/modes/
官方支持用pip、conda、gitclone、Docker4种方法安装,需要注意的是在当前(2024.1.2)使用pip安装是不包含obb检测的,只能去git上面clone一下代码:
克隆ultralytics仓库
git clone https://github.com/ultralytics/ultralytics
导航到克隆的目录
cd ultralytics
为开发安装可编辑模式下的包
pip install -e .
v8用起来爽的地方就是无脑用,官方已经更新了一个英文版教程,参考:https://docs.ultralytics.com/datasets/obb/#yolo-obb-format
这个过程中间其实还有挺多问题的,这里也记录一下:
obb检测方法里面旋转框的表示方法有好几种,v8这里使用的是
class_index, x1, y1, x2, y2, x3, y3, x4, y4(需要做归一化)
示例:0 0.780811 0.743961 0.782371 0.74686 0.777691 0.752174 0.776131 0.749758
要用自己数据的小伙伴们记得把数据转成这个格式。
把DOTAv2数据集转成YOLOv8可训练的模式
官方已经写好了代码:
from ultralytics.data.converter import convert_dota_to_yolo_obb
convert_dota_to_yolo_obb('path/to/DOTA')
记得要自己新建一个py文件,然后把path改成指向DOTAv2数据集的地址。
DOTAv2数据集准备的形式:
Notes:
The directory structure assumed for the DOTA dataset:
- DOTA
├─ images
│ ├─ train
│ └─ val
└─ labels
├─ train_original
└─ val_original
After execution, the function will organize the labels into:
- DOTA
└─ labels
├─ train
└─ val
注意:DOTA数据集有3个版本,需要用v2的标注(1和1.5第一二行都是图片来源介绍,会有bug)
准备好数据和模型之后就可以直接开始训练了,参考代码:
yolo detect train data=DOTAv2.yaml model=yolov8n.pt epochs=100 imgsz=640
单卡3090ti训不动的,我把batch改成了4(好卡都给学生了哈哈哈哈)
有一个该看但是我还没看的地方是关于DOTA数据集里图像裁切的问题,我看DOTA数据集提供的toolkit里面自带了这个功能,但是v8有没有集成暂时还没有去细究