YOLOv8改进——引入可变形卷积DCNv3

news2024/11/24 5:02:22

YOLOv8 详解
✨✨✨YOLOv8详解 【网络结构+代码+实操】
可变形卷积DCNv1 & DCNv2
✨✨✨论文及代码详解——可变形卷积(DCNv1)
✨✨✨论文及代码详解——可变形卷积(DCNv2)
DCNv3 是InternImage中提出的,DCNv3在DCNv2版本上进行了改进。
✨✨✨论文详解——《InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions》
✨✨✨ 代码详解——可变形卷积(DCNv3)

本文只讲解在YOLOv8的代码中添加DCNv3的操作流程, 具体的原理参见上述的链接~

1. 下载ops_dcnv3

如下图,首先下载InterImage官方代码,然后在segmentation、detection、classification文件夹下均可以找到ops_dcnv3文件夹,该文件夹下的内容就是实现DCNv3算子的核心代码。
在这里插入图片描述

  • modules
    如下图所示, modules文件夹中的dcnv3.py文件主要定义了DCNv3模块。
    其中DCNv3_pytorch是DCNv3的pytorch实现版本,DCNv3是DCNv3的C++实现版本。
    在这里插入图片描述
  • functions
    如下图所示,function文件夹中的dcnv3_func.py文件定义了DCNv3的一些核心操作。
    其中黄色部分的DCNv3Function类被c++版本的DCNv3 调用。
    其中红色部分的dcnv3_core_pytorch方法被pytorch版本的DCNv3_pytorch调用。
    在这里插入图片描述
  • src
    src下的代码是用C++来实现DCNv3中核心操作,其下的cpucuda分别表示cpu和cuda编程两种实现版本。c++实现的版本需要去编译,否则如上图所示,黄色箭头指向的import DCNv3 有红色波浪线,无法正常导入。
    如果想import DCNv3成功,有两种解决办法:
    (1)需要编译:DCNv3具体编译方法是直接运行make.sh文件(但是这种方法很容易编译失败,对于pytorch,cuda的版本以及c++编译器的配置都有要求)
    (2)不需要编译:去官网上下载轮子https://github.com/OpenGVLab/InternImage/releases/tag/whl_files (更推荐这种方法,但是也需要注意cuda和pytorch的版本)
    在这里插入图片描述
    然后将ops_dcnv3复制到ultralutics文件夹下。
    在这里插入图片描述

2. 添加DCNv3模块

打开modules.py文件。
在这里插入图片描述
首先从ops_dcnv3 中导入DCNv3DCNv3_pytorch
其中DCNv3是C++实现版本,必须先在上一步编译成功,或者安装好了轮子,否则会报错。
DCNv3_pytorch 是pytorch实现的版本,只要基础的pytorch环境安装正确就不会出错。
但是在实际的训练过程中,C++版本的运行速度更快,推荐使用C++版本。

from ..ops_dcnv3.modules import DCNv3,DCNv3_pytorch
  • DCNv3_YOLO
    然后在modules.py文件中添加DCNv3_YOLO模块。其中self.dcnv3即可以使用c++版本的DCNv3,也可以使用pytorch版本实现的DCNv3_pytorch。
class DCNV3_YoLo(nn.Module):
    def __init__(self, inc, ouc, k=1, s=1, p=None, g=1, d=1, act=True):
        super().__init__()
        
        self.conv = Conv(inc, ouc, k=1)
        self.dcnv3 = DCNv3(ouc, kernel_size=k, stride=s, group=g, dilation=d) # c++版本
        # self.dcnv3 = DCNv3_pytorch(ouc, kernel_size=k, stride=s, group=g, dilation=d) # pytorch版本
        self.bn = nn.BatchNorm2d(ouc)
        self.act = Conv.default_act
    
    def forward(self, x):
        x = self.conv(x)
        x = x.permute(0, 2, 3, 1)
        x = self.dcnv3(x)
        x = x.permute(0, 3, 1, 2)
        x = self.act(self.bn(x))
        return x
  • Bottleneck_DCNV3
    把原始的Bottleneck中的self.cv2Conv换成DCNV3_YOLO
    在这里插入图片描述
    具体代码如下:
class Bottleneck_DCNV3(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):  # ch_in, ch_out, shortcut, groups, kernels, expand
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, k[0], 1)
        self.cv2 = DCNV3_YoLo(c_, c2, k[1], 1, g=g)
        self.add = shortcut and c1 == c2
 
    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

  • C2f_DCNV3
    把原始C2f中的Bottleneck换成Bottleneck_DCNv3
    在这里插入图片描述
    具体代码如下:
class C2f_DCNV3(nn.Module):
    # CSP Bottleneck with 2 convolutions
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottleneck_DCNV3(self.c, self.c, shortcut, g, k=(3, 3), e=1.0) for _ in range(n))

    def forward(self, x):
        y = list(self.cv1(x).chunk(2, 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

    def forward_split(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

3. 补充声明

nn/tasks.py中,下图中的列表里添加DCNv3_YOLO,Bottleneck_DCNV3,C2f_DCNV3
在这里插入图片描述
在这里插入图片描述

4. 修改Yaml文件

yolov8s.yaml文件中的C2f修改成C2f_DCNV3, Conv修改成DCNv3_YOLO (具体怎么修改,都可以自己决定,然后通过实验看看效果如何)
在这里插入图片描述

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

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

相关文章

centos7.6 firewalld防火墙配置

1、查看系统版本 cat /etc/redhat-release 2、查看防火墙运行状态 systemctl status firewalld 此处可以看到防火墙已开启。 3、关闭开机自启动防火墙 systemctl disable firewalld.service 4、启动防火墙并查看状态,系统默认 22 端口是开启的。 systemctl start f…

HCIP学习--企业网三层架构实验

一、实验拓扑 二、实验要求 内网IP地址172.16.0.0/16合理分配 SW1/2之间互为备份 VRBP/STP/LANTRUNK均使用 所有PC通过DHCP获取ip地址 三、实验步骤 首先思考进行IP地址的规划 配置eht-trunk [sw1]interface Eth-Trunk 0 [sw1-Eth-Trunk0]q [sw1-GigabitEthernet0/0/1]i…

魏副业而战:她的闲鱼号被封了

我是魏哥,与其躺平,不如魏副业而战! 社群小K的闲鱼号被封了。 什么原因呢? 卖书被举报了。 魏哥调侃说,别干了,放弃吧。 她不听,重新开搞…… 这就是真正的网络创业者该有的素养。 魏哥蛮…

安卓系列机型-禁止卸载某个APP 防止误卸载软件 无需root权限

安卓系列机型-禁止安装某软件 防止“沉迷游戏的小孩”操作解析_安卓机器的博客-CSDN博客 上一期讲了如何禁止安装某个app。今天讲下如何禁止卸载某app。正好相反的操作。任何操作有利有弊。主要看使用者如何对待使用。 💔💔💔以腾讯的一款游…

Jenkins自动化部署Vue项目

1、新建item,选择 Freestyle project 2、源码管理选择git,输入git仓库地址和授权账号,并指明要部署的分支 3、构建选择 Execute shell,输入vue项目打包命令 命令示例: source /etc/profile node -v npm config set re…

内容分发网络CDN与应用程序交付网络ADN之间的异同

当您想要提高网站性能时,需要考虑许多不同的配置和设施,CDN和ADN是我们常遇见的几种选项之一。“CDN”指“内容分发网络”,而“ADN”指“应用程序交付网络”,但他们两者很容易被混淆,虽然它们的功能和作用都有较大差异…

​山东省图书馆典藏《乡村振兴战略下传统村落文化旅游设计》鲁图中大许少辉博士八一新书

​山东省图书馆《乡村振兴战略下传统村落文化旅游设计》鲁图中大许少辉博士八一新书

FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

arthas-安装

window环境 在线安装 进入到对应的目录,cmd 下载jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar 运行 java -jar arthas-boot.jar 该问题是没有运行的java项目,启动idea运行一个java项目,重新执行 选择要监听的端口号 输入ar…

【2023七夕】星河漫舞,七夕的璀璨之夜。分享:七夕表白的前端特效(附完整原代码+详细注释),情不知何起,却一往情深。愿天下有情人终成眷属

满山遍野你的脸庞,唯有遗忘是最漫长。 又一年的七夕了,今年,你还是孤单一人吗? … … 若是的话,咱们可是一个阵营的!!! 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿…

快妥稳!户外拍摄,5G黑科技更给力!

随着新媒体时代的到来,“户外实景美学”已然成为影视创作打磨爆款作品、衍生荧屏效应的一把“杀手锏”。恢弘山川、烟雨江南、异域小城、古朴村落……从一方影棚再到“天然片场”,主打一个“身临其境”般更加真实的视听体验。 杭州浙文影业影视公司是一家…

SRM系统交货协同管理:优化供应链交付流程

供应链的交货协同管理对于企业的运作至关重要。为了实现高效、准时的交付,越来越多的企业开始采用供应关系管理SRM系统来优化交货协同管理。 一、什么是SRM系统交货协同管理? SRM系统交货协同管理是指利用SRM系统来协调和管理供应链中各个参与方在交货过…

innovus加decap如何避免drc问题

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 加decap常见的问题就是跟regular wire产生drc,调试如下命令能够避免这类drc。 setFillerMode -add_fillers_with_drc false -fitGap false -ecoMode true

如何创建一个数据交互的Angular应用程序?这个工具不要错过!(一)

当我们构建带有数据的应用程序时,需要为客户提供排序、分组、过滤和聚合数据等选项,以便与之交互。我们可以通过多种途径实现这一目标: 使用内置的Array对象——它提供了过滤器、排序方法和reduce等用于分组和聚合的功能。使用Kendo UI for …

SpringBoot内嵌Tomcat连接池分析

文章目录 1 Tomcat连接池1.1 简介1.2 架构图1.2.1 JDK线程池架构图1.2.2 Tomcat线程架构 1.3 核心参数1.3.1 AcceptCount1.3.2 MaxConnections1.3.3 MinSpareThread/MaxThread1.3.4 MaxKeepAliveRequests1.3.5 ConnectionTimeout1.3.6 KeepAliveTimeout 1.4 核心内部线程1.4.1 …

MYSQL 统计停车时长百分比

SELECTCOUNT(*) AS 数量,subquery.total_count AS 总数,COUNT(*) * 100 / subquery.total_count AS 百分比,CASEWHEN park_long < 900 THEN 15分钟以内WHEN park_long > 900 AND park_long < 3600 THEN 15-60分钟WHEN park_long > 3600 AND park_long < 10800 T…

【Java 高阶】一文精通 Spring MVC - 视图解析(三)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

前端轻松实现文件预览(pdf、excel、word、图片)

需求&#xff1a;实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能&#xff0c;建议以下的预览文件标签可以在外层包裹一层弹窗。 图片预览 iframe标签能够将另一个HTML页面嵌入到…

【第16例】IPD开发流程:横向管理工具之袖珍卡

目录 前言 袖珍卡 作者介绍 相关课程 前言 IPD 本身是一个非常庞杂的体系&#xff0c;几乎涵盖了企业的方方面面。 不仅仅是华为&#xff0c;包括一些引入 IPD 的新星科技企业。 他们对 IPD 的引入也是走了先僵化再优化的一个过程。 比如说开始的阶段全盘照抄走流程&…

Android设置顶部状态栏颜色

Android设置顶部状态栏颜色_wx637304bacd051的技术博客_51CTO博客