全网首发!Yolov8_obb旋转框检测(DOTA1.0数据集)

news2024/10/5 2:50:26

一、YOLOv8环境搭建

(1)Pytorch的安装

如果你的环境没有部署请参考本人文章:NLP笔记(2)——PyTorch的详细安装_安装torchnlp-CSDN博客

(2)下载最新的Yolov8-obb代码:

 https://github.com/ultralytics/ultralytics

(2)安装配置文件,建议使用镜像源

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

二、DOTA1.0数据集转换

(1)原始数据集格式如下

937.0 913.0 921.0 912.0 923.0 874.0 940.0 875.0 small-vehicle 0

(2)通过坐标在 0 和 1 之间归一化的四个角点来指定边界框,支持的 OBB 数据集格式如下

class_index, x1, y1, x2, y2, x3, y3, x4, y4

 (3)新建一个yoloobb.py文件实现标签转换

from ultralytics.data.converter import convert_dota_to_yolo_obb
convert_dota_to_yolo_obb('C:\myyolo\ultralytics-main\dataobb')
#关于dataobb文件下的目录下面会详细说明

(4)跳转到convert_dota_to_yolo_obb.py函数,对class_mapping进行修改

class_mapping = {
    "plane": 0,
    "baseball-diamond": 1,
    "bridge": 2,
    "ground-track-field": 3,
    "small-vehicle": 4,
    "large-vehicle": 5,
    "ship": 6,
    "tennis-court": 7,
    "basketball-court": 8,
    "storage-tank": 9,
    "soccer-ball-field": 10,
    "roundabout": 11,
    "harbor": 12,
    "swimming-pool": 13,
    "helicopter": 14,
}

(5)在ultralytics-main下新建一个文件夹dataobb设置如下结构,分割后的数据集参考:

DOTA数据集切割处理——旋转框和水平框_dota数据集的切分-CSDN博客

其中,images/train和images/val放置原始图片文件,labels/train_original和labels/val_original分别放置原始的标签文件,labels/train和labels/val为空,然后运行步骤(3)的代码,运行结束转换后的标签会保存在labels/train和labels/val中,格式如下。

4 0.915039 0.891602 0.899414 0.890625 0.901367 0.853516 0.917969 0.854492

三、开始训练

(1)下载预训练权重

OBB - Ultralytics YOLOv8 Docs

(2)构建数据集,按照下面目录格式,其中test可为空,一定要对应。

(3)创建一个dota8-obb.yaml,然后将路径和类别改成自己的。

path: C:\myyolo\ultralytics-main\datasets # dataset root dir
train: images/train
val: images/val
#test: images/test
names:
  0: plane
  1: baseball-diamond
  2: bridge
  3: ground-track-field
  4: small-vehicle
  5: large-vehicle
  6: ship
  7: tennis-court
  8: basketball-court
  9: storage-tank
  10: soccer-ball-field
  11: roundabout
  12: harbor
  13: swimming-pool
  14: helicopter

(4)新建yolov8-obb.yaml,修改nc,我使用的是yolov8n.

# 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)

(5)新建一个train.py,我使用的是yolov8n,设置相关参数如下,即可运行。注意:如果你使用的权重是yolov8s-obb,只需要把下面代码中的配置文件yolov8-obbn.yaml改成yolov8s-obb.yaml,依次类推。

from ultralytics import YOLO

def main():
    model = YOLO('yolov8n-obb.yaml').load('yolov8n-obb.pt')  # build from YAML and transfer weights
    model.train(data='dota8-obb.yaml', epochs=100, imgsz=1024, batch=4, workers=4)
if __name__ == '__main__':
    main()

四、验证

from ultralytics import YOLO

def main():
    model = YOLO(r'best.pt')
    model.val(data='dota8-obb.yaml', imgsz=1024, batch=4, workers=4)
if __name__ == '__main__':
    main()

最后:

会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

目录 一、MongoDB 1.1、简介 a)MongoDB 是什么?为什么要使用 MongoDB? b)应用场景 c)MongoDB 这么强大,是不是可以直接代替 MySQL ? d)MongoDB 中的一些概念 e)Do…

如何用Docker部署Nacos服务并结合内网穿透实现公网访问管理界面?

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik Nacos是阿里开放的一款中间件,也是一款服务注册中心,它主要提供三种功能:持久化…

HCIA的网络地址转换NAT

NAT:网络地址转换 功能: 1.将大量的私有地址转换成公有地址(节约IP地址) 2.将一个IP地址转换成另一个IP地址(公有的)(增加内部网络设备的安全性):比如有一个内网&#xf…

【数据结构】C语言实现顺序栈

顺序栈的C语言实现 导言一、栈的分类二、顺序栈2.1 顺序栈的数据类型2.2 顺序栈的初始化2.3 栈的判空2.5 顺序栈的进栈2.6 顺序栈的出栈2.7 顺序栈的查找2.8 顺序栈的另一种实现方式2.9 顺序栈的销毁 结语 导言 大家好,很高兴又和大家见面啦!&#xff0…

OpenAIOps社区线上宣讲会圆满召开,期待您的加入!

2024年1月12日“OpenAIOps社区”线上宣讲会圆满召开,群体智慧协同创新社区的创立为AIOps领域未来发展注入了活力。OpenAIOps社区是一个AIOps开源社区及创新平台,由中国计算机学会(CCF)、清华大学、南开大学、中科院、国防科大、必示科技等单位共同发起&a…

Java环境变量——Windows和Linux配置jdk

本文我主要是介绍jdk的下载方式和在Windows系统下安装配置jdk11(压缩包格式),其他格式的jdk以及Linux操作系统上的jdk安装我后续视情况进行更新… JDK的下载 大家可以去官网Java|Oracle下载对应的资源 继续往下翻,就可以看到Jav…

中国数据库市场的领军黑马——亚信安慧AntDB数据库

自2008年问世以来,亚信科技AntDB数据库一直在中国国产数据库市场中崭露头角,尤其在信创政策的大力支持下,成为这一领域的一匹黑马。经过多次迭代,AntDB已经发展到了7.0版本,为超高强度和密度的业务需求提供了强有力的解…

微信服务号和订阅号区别

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务,每月可推送4次,每次最多8篇文章,发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

目标检测中的数据增强

整个代码参考:bubbliiiing/object-detection-augmentation。 random_data.py import cv2 import numpy as np from PIL import Image, ImageDrawdef rand(a=0, b=1):return np.random.rand()*(b-a) + adef get_random_data(annotation_line, input_shape, jitter=.3, hue=.1…

几个简单好用Python库,让你工作效率翻倍

概要 Python是一门强大的编程语言,不仅可以进行软件开发,还可以通过各种优秀的第三方库来提高工作效率。本文将介绍几个简单而好用的Python库,它们可以帮助你在各种领域提高工作效率,从数据处理到图形设计,再到网络爬…

提升设备巡检效率:易点易动设备管理系统的应用

设备巡检是企业保持设备正常运转和提高生产效率的重要环节。然而,传统的设备巡检过程通常繁琐而耗时,容易出现信息遗漏和延误。为了解决这一问题,现代企业可以利用智能化的设备管理系统来提升设备巡检的效率。易点易动设备管理系统是一种功能…

ED UV灯FCC认证的辐射与传导整改实例

摘要:某型LED UV灯出口美国,因此需要满足美国FCC标准要求。常规来说这个UV灯是需要测试FCC PART18标准要求的。但是,这个虽然是uv灯,但是利用的紫外线图层改变led的发光,而不是标准里面的定义的uv灯是放电灯&#xff0…

HTML中使用less

首先,什么是less? less和css 区别: 1、Less是一门CSS预处理语言,而css是一种用来表现HTML或XML等文件样式的计算机语言; 2、less扩展了CSS语言,增加了css本身没有的变量、函数等特性; 3、css可…

【C语言】ipoib驱动 - ipoib_cm_post_receive_srq_rss函数

一、ipoib_cm_post_receive_srq_rss函数定义 static int ipoib_cm_post_receive_srq_rss(struct net_device *dev,int index, int id) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_recv_ring *recv_ring priv->recv_ring index;struct ib_sge *sge;stru…

RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Qt QProgressBar进度条控件

文章目录 1 属性和方法1.1 值1.2 方向1.3 外观1.4 信号和槽 2 实例2.1 布局2.2 代码实现 QProgressBar是进度条控件,进度条用来指示任务的完成情况 1 属性和方法 QProgressBar有很多属性,完整的可查看帮助文档。这里以QProgressBar为例,列出…

HackTheBox - Medium - Windows - Scrambled

Scrambled 最近身体有些不舒服,恐怕理论值要与现实产生较大偏差了 Scrambled 是一台中型 Windows Active Directory 计算机。通过枚举远程计算机上托管的网站,潜在攻击者能够推断出用户“ksimpson”的凭据。该网站还指出 NTLM 身份验证已禁用&#xff0…

友思特分享丨高精度彩色3D相机:开启崭新的彩色3D成像时代

来源:友思特 机器视觉与光电 友思特分享丨高精度彩色3D相机:开启崭新的彩色3D成像时代 原文链接:https://mp.weixin.qq.com/s/vPkfA5NizmiZmLiy_jv3Jg 欢迎关注虹科,为您提供最新资讯! 3D成像的新时代 近年来&#…

多合一小程序商城系统源码:支持全平台端口 附带完整的搭建教程

现如今,随着移动互联网的飞速发展,小程序已经成为电商行业的新宠。罗峰给大家分享一款多合一小程序商城系统源码。该系统旨在为商家提供一个功能强大、易于搭建和管理的电商平台,帮助商家快速占领市场,提高品牌影响力。 以下是部…

2、指令系统、存储系统和缓存

指令系统 计算机指令的组成 1、操作码——需要完成什么样的操作2、操作数——参与运算的数据以及单元地址以上两个都是由二进制编码存储 计算机指令执行过程 指令的寻址方式(怎么样找到操作数?) 指令组成 操作码字段地址码字段 1、顺序寻…