YOLOv8_obb——旋转目标检测无敌大还丹(DOTA数据集)

安装

(1)Pytorch安装 (自行官网安装对应cuda版本)

(2)下载最新yolov8_obb代码:

GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

pip安装和gitclone均可

(3)安装依赖

官方给出:

也可尝试:pip install -e .

DOTA数据集的训练、测试、推理

(1)快速入门(测试环境)

使用dota8数据集用于测试:创建新py文件,复制下面代码运行(代码会自动帮你安装pt文件和dota8数据集,如果下载太慢导致失败,可根据失败信息自行下载)

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n-obb.pt')  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data='dota8.yaml', epochs=100, imgsz=640)

参考:DOTA8 -Ultralytics YOLOv8 文档

通过快速入门,可以了解项目的文件结构和数据集构架

(2)数据集处理

①将DOTA数据集转换为yolov8可训练的格式

原数据集格式如下:

v8使用的数据集格式:

关于数据集转换,官方已经写好了代码:
 

from ultralytics.data.converter import convert_dota_to_yolo_obb

convert_dota_to_yolo_obb('path/to/DOTA')

新建一个py文件,可以把路径改为指向DOTA文件夹的绝对路径,文件夹目录结构如下:

②数据集图像裁剪

方法一:使用已经裁剪好的DOTA数据集然后使用①转化格式,或者使用DOTA数据集提供的toolkit

方法二:利用ultralytics\ultralytics\data\split_dota.py,该Py文件提供了分割函数,使用如下:

from ultralytics.data.split_dota import split_trainval

split_trainval(data_root=r'datasets\DOTA',save_dir=r'datasets\DOTA_split')

备注 :尝试了方法二,发现裁剪后的图片数量和标签数量对应不上,各位看官可自行尝试

(3)开始训练 

①下载预训练权重

OBB -Ultralytics YOLOv8 文档

②确定数据集

③在cfg/datasets中创建DOTAv1-obb.yaml,修改路径和类别(如果使用项目自带的跳过该步骤)

④修改并使用cfg/models/v8/yolov8-obb.yaml

根据自己的DOTAv1-obb.yaml修改nc

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 Oriented Bounding Boxes (OBB) model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 15 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 15 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 21 (P5/32-large)

  - [[15, 18, 21], 1, OBB, [nc, 1]] # OBB(P3, P4, P5)

⑤新建train.py ,复制如下代码:

from ultralytics import YOLO

model = YOLO('yolov8n-obb.yaml').load('yolov8n-obb.pt')
model.train(data='DOTAv1.yaml', epochs=100, imgsz=1024, batch=4, workers=4)

命令运行:CUDA_VISIBLE_DEVICES=gpu_ids python train.py

(4)验证

from ultralytics import YOLO
 
def main():
    model = YOLO(r'runs/obb/train/weights/best.pt')
    model.val(data='dotav1.yaml', imgsz=1024, batch=4, workers=4)
if __name__ == '__main__':
    main()

(5)推理 

from ultralytics import YOLO
model = YOLO('runs/obb/train/weights/best.pt')
results = model('datasets/DOTA/images/val/P0003__1__0___0.png', save=True)

训练HRSC2016数据集

关于HRSC数据集解读:HRSC数据集解读,DOTA数据集转YOLO旋转框格式,HRSC数据集转YOLO旋转框格式_dota数据集 yolo格式-CSDN博客

 HRSC数据集转YOLO旋转框代码地址:GitHub - yrpyyds/HRSC2DOTA2YOLO: HRSC数据集转DOTA转YOLO v8,以及对应的显示标注框的简易UI

注:代码简单可以自行阅读,帮作者写个readme:先使用HRSC_to_DOTA->DOTA_to_YOLO,每个阶段均可使用drawed.py验证转化是否成功

问题:HRSC数据集经过整理后,Train文件夹下有效标注的数据集为617张(其中train=436,val=181),Test文件夹下有效标注集为438张(6张背景图)。

数据集分为三个层级,0级为船,1级是航母、军舰、商船、潜艇,2级为各种航母,军舰细分。

由于船舰类型丰富、每个类型数据量较小、类别区分没有明确界限,因此大部分处理方式(上述代码链接)均将HRSC三级类别归到二级类别且将一级类别的ship删去。但这种删去同样带来了一些问题,它将很多分类结果为ship的图片变成了背景图。例如,一张图片它只有一个框 其注释为ship=1,现在我们删除ship导致其注释txt文件变成了空文件,图片并没有删除,而且变成了背景图;那么我们能不能直接删掉这种图片呢?答案是否定的,因为如果一张图片中既有我们要的类别也有ship的话,删除整张图片也会删除我们想要的。

解决方式可以自行决定

后续训练过程同DOTA数据集训练过程,只需要修改dataset.yaml,以及修改Yolov8obb.yaml中的nc即可

更换yolo的backbone和neck

待更新

  • 19
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: YOLOv5_obb数据集是一种基于YOLO (You Only Look Once)算法改进的目标检测数据集,用于检测物体的外接矩形框(Oriented Bounding Box,OBB)。 传统的YOLO算法通常使用水平矩形框来表示物体的位置和尺寸,但对于某些具有倾斜或旋转形状的物体,使用OBB可以更准确地描述其位置和方向。因此,YOLOv5_obb数据集使用OBB来定义物体的边界框,以提高目标检测的准确性。 YOLOv5_obb数据集通常包含大量带有OBB标签的图像样本,每个样本都包含一个或多个物体的OBB标注信息。这些OBB标注信息一般由矩形框的四个顶点的位置和物体类别标签组成。 使用YOLOv5_obb数据集可以训练一个可以检测和定位具有任意形状的物体的目标检测模型。通过学习样本图像中物体的OBB信息,模型可以准确地识别和定位这些物体。 此外,YOLOv5_obb数据集还可用于解决一些特定应用场景中的目标检测问题,例如航空影像、卫星图像或城市场景中的目标检测。这些场景下的物体可能具有复杂的形状和旋转角度,使用OBB可以更好地适应这些特殊要求。 总之,YOLOv5_obb数据集是一种为了解决特定物体形状和方向的目标检测问题而设计的数据集。通过使用OBB标注信息,可以提高目标检测模型在这些场景下的表现和准确性。 ### 回答2: YOLOv5是一种目标检测算法,而YOLOv5-OBB则是基于YOLOv5的一种针对有方向边界框目标的检测模型。OBB全称为Oriented Bounding Box,即有方向的边界框。 YOLOv5-OBB数据集是针对有方向边界框目标检测任务构建的数据集。在常规的边界框目标检测任务中,边界框是水平的,即边界框的长宽与坐标轴平行。而在有方向边界框目标检测任务中,边界框可以按照物体的朝向进行旋转。 为了支持YOLOv5-OBB模型的训练和评估,需要一个包含有方向边界框的标注数据集。该数据集需要提供每个目标物体的类别标签、边界框的顶点坐标和角度信息。 标注一个有方向边界框通常需要指定边界框的中心坐标、边界框的宽度和高度、以及边界框的旋转角度。在训练过程中,YOLOv5-OBB模型将使用这些标注信息进行参数学习,以实现对有方向边界框目标的准确检测。 YOLOv5-OBB数据集可以包含各种不同种类的物体,比如车辆、行人、交通标识等。通过大规模、多样化的数据集训练得到的YOLOv5-OBB模型可以在实际应用中具有较好的目标检测效果,能够对有方向边界框目标进行高效、准确的识别和定位。 总而言之,YOLOv5-OBB数据集是用于训练和评估YOLOv5-OBB模型的一种包含有方向边界框标注的数据集,可以有效支持对有方向边界框目标的检测任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值