【2023-2024年最新教程】yolov5_obb: 旋转目标检测从数据制作到终端部署全流程教学

导读

yolov5_obbyolov5 目标检测框架的一个变种,支持旋转目标检测任务(Oriented Bounding Boxes,OBB),旨在生成更好拟合具有角度位置的物体预测结果。考虑到目前全网上关于此方面的资料相对较少,鱼龙混杂,不是比较老旧、乱七八糟,就是一言不合就付费查看,交钱看个寂寞,实在是不忍直视。因此,此篇博文旨在提供一个从数据集制作、划分、安装、训练、验证、部署保姆级教程,帮助大家从0到1快速完成项目的上手和开发,满足日常工作和学习的需求。

数据集制作

工具介绍

X-AnyLabeling不仅是一个标注工具,它还是自动数据标注未来的一大飞跃。它的设计不仅简化了标注过程,还集成了尖端的AI模型,以获得更出色的结果。X-AnyLabeling 专注于实际应用,力求提供一个工业级的、功能丰富的工具,可帮助开发人员自动标注和处理各种复杂任务的数据。

在最新的 v2.2.0 版本中,X-AnyLabeling 已经完美支持了旋转框的标注,同时提供全方位的角度显示,实操体验方面也与经典的 roLabelImg 完全保持一致,可无缝迁移,且支持直接导出 DOTA 格式的标签文件,无需转换一键训练。最后,工具中还提供了 yolov5_obb 自定义模型的加载运行,可极大提升数据标注效率,形成快速闭环。

喜欢的小伙伴欢迎点个star,持续关注后续更丰富的功能更新。

工具安装

git clone https://github.com/CVHub520/X-AnyLabeling
cd X-AnyLabeling
pip install -r requirements.txt
# pip install -r requirements-gpu.txt
python anylabeling/app.py

使用教程

  • 按下快捷键 “O” 来创建一个旋转形状。
  • 打开编辑模式(快捷键:“Ctrl+J”)并单击选择旋转框。
  • 通过快捷键 “zxcv” 旋转所选框,其中:
    • z:大角度逆时针旋转
    • x:小角度逆时针旋转
    • c:小角度顺时针旋转
    • v:大角度顺时针旋转
高级用法

此外,您可以使用训练好的模型批量预标记当前数据集。

  • 按下快捷键 “Ctrl+A” 打开自动标注模式;
  • 选择一个适当的默认模型或加载自定义模型。
  • 按下快捷键 “Ctrl+M” 运行所有图像一次。


导出DOTA标签,请参考此文档

入门指南

准备工作

  • 环境要求

    • Python 3.7+
    • PyTorch ≥ 1.7
    • CUDA 9.0或更高版本
    • Ubuntu 16.04/18.04
  • 安装开始

a. 创建一个conda虚拟环境并激活它:

conda create -n yolov5_obb python=3.8 -y 
source activate yolov5_obb

b. 确保您的CUDA运行时API版本≤CUDA驱动程序版本。 (例如11.3 ≤ 11.4)

nvcc -V
nvidia-smi

c. 根据您的机器环境,根据官方说明安装PyTorch和torchvision,并确保cudatoolkit版本与CUDA运行时API版本相同,例如:

pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116
nvcc -V
python
>>> import torch
>>> torch.version.cuda
>>> exit()

d. 克隆最新版本的YOLOv5_OBB存储库。

git clone https://github.com/CVHub520/yolov5_obb.git
cd yolov5_obb

e. 安装yolov5-obb。

pip install -r requirements.txt
cd utils/nms_rotated
python setup.py develop  # 或者 "pip install -v -e ."

注意:

  1. 对于Windows用户,请参考此问题,如果在你在生成 utils/nms_rotated_ext.cpython-XX-XX-XX-XX.so方面遇到困难。
  2. 需要注意的是,笔者这里对 poly_nms_cuda CUDA实现重构了一遍,如果你使用的是 hukaixuan19970627 实现的原始版本,大概率是会编译不通过,可参考着修改下,但建议直接使用此修改后的版本,避免冲突。
  • DOTA_devkit [可选]

如果您需要分割高分辨率图像并进行评估,建议使用以下工具:

cd yolov5_obb/DOTA_devkit
sudo apt-get install swig
swig -c++ -python polyiou.i
python setup.py build_ext --inplace

数据集划分

准备自定义数据集文件

注意:确保标签格式为[polygon classname difficulty],例如,您可以将difficulty=0,除非另有说明。

  x1      y1       x2        y2       x3       y3       x4       y4       classname     diffcult

1686.0   1517.0   1695.0   1511.0   1711.0   1535.0   1700.0   1541.0   large-vehicle      1

然后,修改路径参数并运行此[脚本] (./divide.py),如果不需要拆分高分辨率图像。否则,您可以按以下步骤操作。

cd yolov5_obb
python DOTA_devkit/ImgSplit_multi_process.py

确保您的数据集组织在如下所示的目录结构中:

.
└── dataset_demo
    ├── images
    │   └── P0032.png
    └── labelTxt
       

 └── P0032.txt

最后,您可以创建一个自定义的数据yaml文件,例如[yolov5obb_demo.yaml] (./data/yolov5obb_demo.yaml)。

注意:

  • DOTA是一个高分辨率图像数据集,因此需要在训练/测试之前进行分割,以获得更好的性能。
  • 对于单类问题,建议添加一个"None"类,实际上将其变为一个2类任务,例如DroneVehicle_poly.yaml

训练/验证/检测

在正式开始训练任务之前,请遵循以下建议:

  1. 确保将输入分辨率设置为32的倍数。
  2. 默认情况下,将批处理大小设置为8。如果将其增加到16或更大,请调整框丢失的缩放因子,以帮助收敛theta
  • 要在多个GPU上使用分布式数据并行(DDP)模式进行训练,请参考此shell[脚本] (./sh/ddp_train.sh)。

  • 要训练原始数据集演示,而不分割数据集,请参考以下命令:

python train.py \
  --weights weights/yolov5n.pt \
  --data data/task.yaml \
  --hyp data/hyps/obb/hyp.finetune_dota.yaml \
  --epochs 300 \
  --batch-size 1 \
  --img 1024 \
  --device 0 \
  --name /path/to/save_dir
  • 要检测自定义图像文件/文件夹/视频,请参考以下命令:
python detect.py \
    --weights /path/to/*.pt \
    --source /path/to/image \
    --img 1024 \
    --device 0 \
    --conf-thres 0.25 \
    --iou-thres 0.2 \
    --name /path/to/save_dir

注意:有关更多详细信息,请参考[此文档] (./docs/GetStart.md)。

部署

  • 导出*.onnx文件:
python export.py \
    --weights runs/train/task/weights/best.pt \
    --data data/task.yaml \
    --imgsz 1024 \
    --simplify \
    --opset 12 \
    --include onnx

Python

  • 使用onnxruntime检测导出的onnx文件:
python deploy/onnxruntime/python/main.py \
    --model /path/to/*.onnx \
    --image /path/to/image

C++

  • 进入目录:
cd opencv/cpp

.
└── cpp
    ├── CMakeLists.txt
    ├── build
    ├── image
    │   ├── demo.jpg
    ├── main.cpp
    ├── model
    │   └── yolov5m_obb_csl_dotav15.onnx
    └── obb
        ├── include
        └── src

注意,建议使用OpenCV版本4.6.0或更新,v4.7.0已成功测试。
Eigen是一个高性能的C++模板库,专用于线性代数运算,支持矩阵和向量操作,具有自然的C++语法、无依赖性和跨平台特性,广泛应用于科学计算、图形学和机器学习等领域。

mkdir build && cd build
cmake ..
make

对于 OpenVINO 或者 TensorRT 或者移动端部署,原理是一样的,只需要改下 engine 那块即可。

模型库

同时提供了 *.pt 和 *.onnx 文件,方便大家下载。

总结

今天为大家介绍了构建旋转目标检测任务的整个pipeline,如果你在这个过程中碰到任何问题,可在 github issue 反馈,需要交流学习的欢迎添加微信:ww10874,备注yolov5_obb,非诚勿扰。

  • 22
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
### 回答1: 旋转yolov5_obb是指对yolov5_obb目标检测模型中的目标框进行旋转操作。yolov5_obb模型是基于yolov4模型改进而来的,专门用于检测旋转的目标物体,比如旋转的车辆、建筑物等。 旋转yolov5_obb的方法一般包括以下几个步骤: 1. 获取目标框的中心坐标和长宽信息以及旋转角度。中心坐标表示目标框的中心点在图像上的位置,长宽信息表示目标框在x和y方向的大小,旋转角度表示目标框相对于水平方向的旋转程度。 2. 根据旋转角度,将目标框进行逆时针旋转。即根据旋转角度将目标框顺时针旋转回水平方向,并保持目标框的中心坐标不变。这可以通过将目标框的四个角点绕中心点进行旋转实现,旋转后重新计算目标框的中心坐标和长宽信息。 3. 在旋转后的目标框上进行目标检测。将旋转后的目标框输入yolov5_obb模型,利用模型的特征提取和分类回归网络,预测目标框中的目标类别和精确位置。 旋转yolov5_obb可以帮助我们检测旋转的目标物体,解决了传统yolov5模型难以准确检测旋转目标的问题。在一些需要对旋转目标进行准确识别和位置定位的应用场景中,旋转yolov5_obb具有很大的实用价值。 ### 回答2: 旋转Yolov5_obb是指对Yolov5_obb模型中的目标框进行旋转处理。Yolov5_obb是一种基于旋转框的目标检测模型,适用于目标存在旋转的场景,比如车辆行驶的方向可能不仅仅是水平方向。 在对Yolov5_obb进行旋转处理时,需要对每一个目标框进行旋转角度的调整。首先,需要确定旋转中心,一般可以选择目标框的中心点作为旋转中心。然后,根据旋转角度,对目标框进行旋转变换。 旋转变换涉及到目标框中的坐标变换。假设目标框的坐标为(x, y, w, h, θ),其中,(x, y)是中心点坐标,w和h是目标框的宽和高,θ是目标框的旋转角度。对于旋转后的目标框,可以根据以下公式进行计算: 新的中心点坐标:(x', y') = (x*cosθ - y*sinθ, x*sinθ + y*cosθ) 新的宽和高:w' = w, h' = h 新的旋转角度:θ' = 0(旋转后的目标框与x轴平行) 通过上述计算,就可以得到旋转后的目标框的坐标。然后,可以将旋转后的目标框输入到Yolov5_obb模型中进行目标检测旋转Yolov5_obb可以提高模型的适应性,使其能够更好地应对存在旋转目标的场景。但需要注意的是,旋转处理会引入一些误差,可能会对检测的准确性造成一定影响,因此在具体应用中需要根据场景的需求来决定是否进行旋转处理。 ### 回答3: 旋转Yolov5_obb是指对Yolov5_obb模型进行旋转操作。Yolov5_obb模型是基于Yolov5的改进版本,支持检测倾斜的对象,如旋转的框、文本等。旋转Yolov5_obb可以通过以下步骤实现: 1. 数据准备:首先需要将训练集中的标注框进行转换,使其成为基于中心点坐标、框宽高和旋转角度的表示。可以使用逆时针角度表示旋转,一般可以转换为0到180度之间的值。 2. 模型调整:针对Yolov5_obb模型的网络结构进行修改,主要包括调整输入层的参数和添加旋转相关的操作。可以通过修改最后输出层的维度来适应新的输出。 3. 训练模型:使用经过转换后的训练集进行训练。可以使用yolov5代码库提供的训练脚本,根据自己的需求进行调整。训练过程中需要注意,特别是损失函数的定义和权重调整需要根据旋转目标的特点进行优化。 4. 模型测试:在测试阶段,需要将测试集中的图像输入到训练好的模型中,并根据输出的边界框和旋转角度进行后处理操作。可以选择将旋转框转换为长方形框,或者在绘制边界框时使用旋转操作。 总之,旋转Yolov5_obb需要对模型进行相应的调整和训练。通过数据准备、模型调整、训练模型和模型测试等步骤,可以达到旋转检测目标的目的。同时,还需要根据具体应用场景合理调整网络结构和训练策略,以提高模型的检测性能和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CVHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值