【课程总结】Day15(下):图像分割之旋转目标检测

前言

在前两章【课程总结】Day15(上):图像分割之语义分割【课程总结】Day15(中):图像分割之实例分割中,我们学习掌握了语义分割和实例分割。在本章中,我们将了解YOLO最新的OBB(旋转目标检测)。

OBB(旋转目标检测)

OBB(Oriented Bounding Box,定向边界框)是一种改进的边界框表示方法,用于更准确地定位和识别具有任意方向的物体。

YOLO官网介绍:https://docs.ultralytics.com/tasks/obb/

示例体验

为了对OBB有个直观了解,我们参考YOLO官网的predict示例,实际体验下OBB的预测能力。

准备待预测图片

在搜索引擎中搜索"航拍图",找到一张航拍的图片,保存为aero_images.jpg。

准备预测代码

python 复制代码
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数据目录

按照官网提供的预测代码,我们准备以下代码:

python 复制代码
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的数据集,查看其结果如下:

shell 复制代码
dota8/
├── images/       # 图片数据
│   ├── train/    # 训练集图片
│   ├── val/      # 验证集图片
├── labels/       # 标签数据
│   ├── train/    # 训练集标签
│   ├── val/      # 验证集标签
YOLO OBB数据标签

查看labels目录下的标签内容如下:

shell 复制代码
# 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数据集目录
shell 复制代码
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目录下的标签内容:

shell 复制代码
# 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目录

shell 复制代码
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目录下

第二步:运行数据转换脚本

python 复制代码
from ultralytics.data.converter import convert_dota_to_yolo_obb

convert_dota_to_yolo_obb("path/to/DOTA")

运行结果如下:

查看train目录下的标签内容

shell 复制代码
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: 旋转目标检测从数据制作到终端部署全流程教学

相关推荐
小菜日记^_^2 分钟前
BEAGLE: Forensics of Deep Learning Backdoor Attack for Better Defense(论文阅读)
论文阅读·人工智能·深度学习·sp·ai安全·backdoor 后门攻击·安全四大
千天夜43 分钟前
激活函数解析:神经网络背后的“驱动力”
人工智能·深度学习·神经网络
大数据面试宝典44 分钟前
用AI来写SQL:让ChatGPT成为你的数据库助手
数据库·人工智能·chatgpt
封步宇AIGC1 小时前
量化交易系统开发-实时行情自动化交易-3.4.1.2.A股交易数据
人工智能·python·机器学习·数据挖掘
m0_523674211 小时前
技术前沿:从强化学习到Prompt Engineering,业务流程管理的创新之路
人工智能·深度学习·目标检测·机器学习·语言模型·自然语言处理·数据挖掘
HappyAcmen1 小时前
IDEA部署AI代写插件
java·人工智能·intellij-idea
噜噜噜噜鲁先森1 小时前
看懂本文,入门神经网络Neural Network
人工智能
InheritGuo2 小时前
It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models
人工智能·计算机视觉·sketch
weixin_307779132 小时前
证明存在常数c, C > 0,使得在一系列特定条件下,某个特定投资时刻出现的概率与天数的对数成反比
人工智能·算法·机器学习
封步宇AIGC2 小时前
量化交易系统开发-实时行情自动化交易-3.4.1.6.A股宏观经济数据
人工智能·python·机器学习·数据挖掘