前言
在前两章【课程总结】Day15(上):图像分割之语义分割和【课程总结】Day15(中):图像分割之实例分割中,我们学习掌握了语义分割和实例分割。在本章中,我们将了解YOLO最新的OBB(旋转目标检测)。
OBB(旋转目标检测)
OBB(Oriented Bounding Box,定向边界框)是一种改进的边界框表示方法,用于更准确地定位和识别具有任意方向的物体。
YOLO官网介绍:https://docs.ultralytics.com/tasks/obb/
示例体验
为了对OBB有个直观了解,我们参考YOLO官网的predict示例,实际体验下OBB的预测能力。
准备待预测图片
在搜索引擎中搜索"航拍图",找到一张航拍的图片,保存为aero_images.jpg。
准备预测代码
from ultralytics import YOLO
import cv2
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
# OBB模型
model = YOLO("yolov8n-obb.pt") # load an official model
results = model("aero_images.jpg") # predict on an image
result = results[0]
img = result.plot()
cv2.imshow("img", img)
# 按 ESC 退出
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
OBB特点
-
方向性:与传统的轴对齐边界框
(AABB)
不同,OBB可以围绕物体的中心旋转,从而更好地适应物体的形状和方向。 -
更高的检测精度:OBB能够减少物体被包围的空白区域,特别是在处理长条形或不规则形状物体时,能够显著提高检测的精度。
-
参数表示:OBB通常使用中心点坐标、宽度、高度和旋转角度来表示。这样可以更灵活地适应各种物体。
-
应用场景:OBB特别适用于需要检测方向性物体的场景,如交通标志、建筑物、车辆等。
数据标注
YOLO数据集
为了更加直观地了解YOLO中OBB的数据格式,我们通过运行以下代码,查看YOLO中的数据集形式。
YOLO OBB数据目录
按照官网提供的预测代码,我们准备以下代码:
from ultralytics import YOLO
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
if __name__ == "__main__":
# Load a model
model = YOLO("yolov8n-obb.yaml") # build a new model from YAML
# Train the model
results = model.train(data="dota8.yaml", epochs=2, imgsz=640)
运行以上代码后,代码会自动下载dota8的数据集,查看其结果如下:
dota8/
├── images/ # 图片数据
│ ├── train/ # 训练集图片
│ ├── val/ # 验证集图片
├── labels/ # 标签数据
│ ├── train/ # 训练集标签
│ ├── val/ # 验证集标签
YOLO OBB数据标签
查看labels目录下的标签内容如下:
# class_index x1 y1 x2 y2 x3 y3 x4 y4
1 0.813477 0.523437 0.814453 0.504882 0.87207 0.504882 0.87207 0.524414
1 0.81836 0.451172 0.817384 0.434571 0.871094 0.434571 0.870117 0.453126
此外,YOLO官网提到目前也支持DOTA数据集格式,对此我们也顺便了解下DOTA数据集。
DOTA数据集
DOTA(Dataset for Object Detection in Aerial Images)是一个用于航空图像目标检测的大型数据集,DOTA8是该数据集的一个版本,专注于8类物体的检测。DOTA8数据集主要用于评估目标检测算法在航空图像中的表现。
数据集下载
下载地址:https://captain-whu.github.io/DOTA/dataset.html
DOTA数据集目录
DOTA-v2.0/
├── train/ # 训练集数据
│ ├── images/ # 训练集图片
│ ├── labelTxt-v2.0/ # 训练集标签
│ └── meta/ # 训练集相关元数据,例如类别
├── val/ # 验证集数据
│ ├── images/ # 验证集图片
│ ├── labelTxt-v2.0/ # 验证集标签
│ └── meta/ # 验证集相关元数据,例如类别
├── test-challenge/ # 挑战赛测试集数据
│ ├── images/
│ └── meta/
└── test-dev/ # 开发测试集数据
│ ├── images/
│ └── meta/
DOTA数据集标签
查看labelTxt-v2.0目录下的标签内容:
# x1, y1, x2, y2, x3, y3, x4, y4, category, difficult
45 734 52 741 32 754 25 747 small-vehicle 1
546 355 551 348 567 361 562 367 small-vehicle 1
481 420 472 417 480 399 488 402 small-vehicle 0
496 422 487 418 494 402 504 405 small-vehicle 0
451 171 446 164 464 156 467 163 small-vehicle 1
271 802 291 796 302 826 283 831 swimming-pool 0
471 528 487 496 540 516 524 547 swimming-pool 0
数据转换
通过对比上述DOTA的数据集标签与YOLO OBB的数据标签,我们发现数据标签格式不同,需要做数据转换。
第一步:手动调整DOTA-v2.0目录
DOTA-v2.0/
├── images/
│ ├── train/
│ | ├──P2809.png
│ ├── val/
│ | ├──P2912.png
├── labels/
│ ├── train_original/
│ | ├──P2809.txt
│ ├── val_original/
│ | ├──P2912.txt
1.标签数据需要将原始标签的目录改为train_original和val_original
2.运行转换脚本后,标签数据将自动生成到train和val目录下
第二步:运行数据转换脚本
from ultralytics.data.converter import convert_dota_to_yolo_obb
convert_dota_to_yolo_obb("path/to/DOTA")
运行结果如下:
查看train目录下的标签内容
16 0.320312 0.19043 0.71875 0.19043 0.71875 0.796875 0.320312 0.796875
可以看到数据标签已经转换为YOLO OBB的格式。
自定义数据标注
在实际应用场景中,我们需要标注自己的数据集,对此我们使用x-anylabeling进行数据标注。
x-anylabeling的安装
本文不再赘述,详细内容在【课程总结】Day15(中):图像分割之实例分割已做介绍。
x-anylabeling的使用
- 第一步,在搜索引擎里搜索一个航拍图下载到本地
- 第二步,启动x-anylabeling
- 第三步,在x-anylabeling中,选择图片,使用快捷键进行标注:
- 按下快捷键 “O” 来创建一个旋转形状。
- 打开编辑模式(快捷键:“Ctrl+J”)并单击选择旋转框。
- 通过快捷键 “zxcv” 旋转所选框,其中:
- z:大角度逆时针旋转
- x:小角度逆时针旋转
- c:小角度顺时针旋转
- v:大角度顺时针旋转
标注效果如下:
上述航拍图的小车还是比较多的,我们可以借助X-anylabeling的自动标注功能辅助标注,具体方法
- 在X-anylabeling中,使用ctrl+A激活模型下载列表
- 在下拉列表中选择YOLOv5s_obb模型,工具会自动从github上下载模型
- 点击左侧的AI按钮和自动标注,激活自动标注功能
自动标注效果如下:
最后,使用导出功能导出图片和标注信息
导出后的标签文件如下:
X-anylabeling导出为DOTA标签后,其内容格式与YOLO OBB数据标签格式一致,这样省去了进行数据转换的步骤。
内容小结
- OBB是一种改进的边界框表示方法,用于更准确地定位和识别具有任意方向的物体。
- DOTA是一个用于航空图像目标检测的大型数据集。
- DOTA和YOLO OBB的数据标签格式不太相同,可以借助YOLO提供的
convert_dota_to_yolo_obb
进行数据转换。 - 对于自定义数据集标注的情况下,我们可以使用x-anylabeling进行数据标注。
- x-anylabeling可以自动标注,也可以手动标注。
- X-anylabeling导出为DOTA标签后,其内容格式与YOLO OBB数据标签格式一致。