内容目录

前言

在前两章【课程总结】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的使用

  1. 第一步,在搜索引擎里搜索一个航拍图下载到本地
  2. 第二步,启动x-anylabeling
  3. 第三步,在x-anylabeling中,选择图片,使用快捷键进行标注:
    • 按下快捷键 "O" 来创建一个旋转形状。
    • 打开编辑模式(快捷键:"Ctrl+J")并单击选择旋转框。
    • 通过快捷键 "zxcv" 旋转所选框,其中:
      • z:大角度逆时针旋转
      • x:小角度逆时针旋转
      • c:小角度顺时针旋转
      • v:大角度顺时针旋转

标注效果如下:

上述航拍图的小车还是比较多的,我们可以借助X-anylabeling的自动标注功能辅助标注,具体方法

  1. 在X-anylabeling中,使用ctrl+A激活模型下载列表
  2. 在下拉列表中选择YOLOv5s_obb模型,工具会自动从github上下载模型
  3. 点击左侧的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数据标签格式一致。

参考资料

知乎:All in One | X-AnyLabeling v2.0.0 全自动标注工具

知乎:yolov5_obb: 旋转目标检测从数据制作到终端部署全流程教学

欢迎关注公众号以获得最新的文章和新闻

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

分类文章

personal_logo
Dongming
自由职业者

推荐活动

推荐文章

【操作攻略】GPU云环境的使用介绍
【项目实战】通过LLaMaFactory+Qwen2-VL-2B微调一个多模态医疗大模型
【课程总结】day19(中):Transformer架构及注意力机制了解
【重拾数学知识】矢量的点乘和叉乘
【课程总结】Day11(上):手势图像识别实战(LeNet模型)
【课程总结】day34:多模态大模型之ViT模型、CLIP模型论文阅读理解
【目录】AI知识学习路线图
【课程总结】day33:文生图StableDiffusion模型初步了解以及部署体验
【课程总结】day32(下):Xinference部署向量化模型
【课程总结】day31:多模态大模型初步了解
内容目录
滚动至顶部