赞
踩
目录
论文地址:https://arxiv.org/abs/1811.11168https://arxiv.org/abs/1811.11168
DCN v1根据输入特征学习到的偏移量,改变了卷积的采样位置,使得其具有更强的适应物体几何变化的能力,其采样位置更接近物体的真实结构,但有部分采样点超出了感兴趣区域,导致提取的特征受到无关图像内容的影响。而V2堆叠更多可变形卷积层,引入调制机制,提出了一种特征模拟方案,指导网络训练。
Deformable Conv V2添加到C2f中,形成C2f_DCN。
C2f_DCN代码复制到block路径下与C2F路径一致,在ultralytics/nn/modules/block.py,其中包括DCNv2,Bottleneck_DCN,C2f_DCN。
- import math
- import torch
- import torch.nn as nn
- class DCNv2(nn.Module):
- def __init__(self, in_channels, out_channels, kernel_size, stride=1,
- padding=1, dilation=1, groups=1, deformable_groups=1):
- super(DCNv2, self).__init__()
-
- self.in_channels = in_channels
- self.out_channels = out_channels
- self.kernel_size = (kernel_size, kernel_size)
- self.stride = (stride, stride)
- self.padding = (padding, padding)
- self.dilation = (dilation, dilation)
- self.groups = groups
- self.deformable_groups = deformable_groups
-
- self.weight = nn.Parameter(
- torch.empty(out_channels, in_channels, *self.kernel_size)
- )
- self.bias = nn.Parameter(torch.empty(out_channels))
-
- out_channels_offset_mask = (self.deformable_groups * 3 *
- self.kernel_size[0] * self.kernel_size[1])
- self.conv_offset_mask = nn.Conv2d(
- self.in_channels,
- out_channels_offset_mask,
- kernel_size=self.kernel_size,
- stride=self.stride,
- padding=self.padding,
- bias=True,
- )
- self.bn = nn.BatchNorm2d(out_channels)
- self.act = Conv.default_act
- self.reset_parameters()
-
- def forward(self, x):
- offset_mask = self.conv_offset_mask(x)
- o1, o2, mask = torch.chunk(offset_mask, 3, dim=1)
- offset = torch.cat((o1, o2), dim=1)
- mask = torch.sigmoid(mask)
- x = torch.ops.torchvision.deform_conv2d(
- x,
- self.weight,
- offset,
- mask,
- self.bias,
- self.stride[0], self.stride[1],
- self.padding[0], self.padding[1],
- self.dilation[0], self.dilation[1],
- self.groups,
- self.deformable_groups,
- True
- )
- x = self.bn(x)
- x = self.act(x)
- return x
-
- def reset_parameters(self):
- n = self.in_channels
- for k in self.kernel_size:
- n *= k
- std = 1. / math.sqrt(n)
- self.weight.data.uniform_(-std, std)
- self.bias.data.zero_()
- self.conv_offset_mask.weight.data.zero_()
- self.conv_offset_mask.bias.data.zero_()
-
- class Bottleneck_DCN(nn.Module):
- # Standard bottleneck with DCN
- 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
- if k[0] == 3:
- self.cv1 = DCNv2(c1, c_, k[0], 1)
- else:
- self.cv1 = Conv(c1, c_, k[0], 1)
- if k[1] == 3:
- self.cv2 = DCNv2(c_, c2, k[1], 1, groups=g)
- else:
- self.cv2 = Conv(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))
-
- class C2f_DCN(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_DCN(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).split((self.c, self.c), 1))
- y.extend(m(y[-1]) for m in self.m)
- return self.cv2(torch.cat(y, 1))

还是在block.py路径下,添加C2f_DCN
- __all__ = [
- 'DFL', 'HGBlock', 'HGStem', 'SPP', 'SPPF', 'C1', 'C2', 'C3', 'C2f', 'C3x', 'C3TR', 'C3Ghost', 'GhostBottleneck',
- 'Bottleneck', 'BottleneckCSP', 'Proto', 'RepC3',
- 'C2f_DCN','C2f_DSConv']
路径D:\learn\sdxx\mbjc\ultralytics\ultralytics\nn\modules\__init__.py导入C2f_DCN。
- from .block import (C1, C2, C3, C3TR, DFL, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x, GhostBottleneck,
- HGBlock, HGStem, Proto, RepC3,
- C2f_DCN)#自己加的
- __all__ = [
- 'Conv', 'LightConv', 'RepConv', 'DWConv', 'DWConvTranspose2d', 'ConvTranspose', 'Focus', 'GhostConv',
- 'ChannelAttention', 'SpatialAttention', 'CBAM', 'Concat', 'TransformerLayer', 'TransformerBlock', 'MLPBlock',
- 'LayerNorm2d', 'DFL', 'HGBlock', 'HGStem', 'SPP', 'SPPF', 'C1', 'C2', 'C3', 'C2f', 'C3x', 'C3TR', 'C3Ghost',
- 'GhostBottleneck', 'Bottleneck', 'BottleneckCSP', 'Proto', 'Detect', 'Segment', 'Pose', 'Classify',
- 'TransformerEncoderLayer', 'RepC3', 'RTDETRDecoder', 'AIFI', 'DeformableTransformerDecoder',
- 'DeformableTransformerDecoderLayer', 'MSDeformAttn', 'MLP','deattn',
- 'C2f_DCN']
将模块名称加入到tasks.py中,路径在ultralytics/nn/tasks.py。
- from ultralytics.nn.modules import (AIFI, C1, C2, C3, C3TR, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x,
- Classify, Concat, Conv, ConvTranspose, Detect, DWConv, DWConvTranspose2d, Focus,
- GhostBottleneck, GhostConv, HGBlock, HGStem, Pose, RepC3, RepConv, RTDETRDecoder,
- Segment,CBAM,C2f_DCN)
在task.py下面def parse_model中加入C2f_DCN。这两个代码中加入C2f_DCN。 这代码是传入模块的通道数。
- if m in (Classify, Conv, ConvTranspose, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, Focus,
- BottleneckCSP, C1, C2, C2f, C3, C3TR, C3Ghost, nn.ConvTranspose2d, DWConvTranspose2d, C3x, RepC3,BasicRFB_a,C2f_DCN):
这个代码模块进行多次使用
if m in (BottleneckCSP, C1, C2, C2f, C3, C3TR, C3Ghost, C3x, RepC3,C2f_DCN):
C2f_DCN是block中的一个,在ultralytics/nn/modules/__init__.py路径下,增加导入包,以及增加名称。
- from .block import (C1, C2, C3, C3TR, DFL, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x, GhostBottleneck,
- HGBlock, HGStem, Proto, RepC3,C2f_DCN)
- __all__ = [
- 'Conv', 'LightConv', 'RepConv', 'DWConv', 'DWConvTranspose2d', 'ConvTranspose', 'Focus', 'GhostConv',
- 'ChannelAttention', 'SpatialAttention', 'CBAM', 'Concat', 'TransformerLayer', 'TransformerBlock', 'MLPBlock',
- 'LayerNorm2d', 'DFL', 'HGBlock', 'HGStem', 'SPP', 'SPPF', 'C1', 'C2', 'C3', 'C2f', 'C3x', 'C3TR', 'C3Ghost',
- 'GhostBottleneck', 'Bottleneck', 'BottleneckCSP', 'Proto', 'Detect', 'Segment', 'Pose', 'Classify',
- 'TransformerEncoderLayer', 'RepC3', 'RTDETRDecoder', 'AIFI', 'DeformableTransformerDecoder',
- 'DeformableTransformerDecoderLayer', 'MSDeformAttn', 'MLP','deattn','C2f_DCN']
在ultralytics/models/v8中yaml配置文件中,将任意的C2f改为C2f_DCN,通道多参数就多。
- # Ultralytics YOLO 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/42188推荐阅读
- C++应该怎么学如果把C语言看做是一头性格暴躁难以驯服的公牛的话,那么c++则是一条无比狡猾,凶猛厉害的恶龙。想要降服这条恶龙就需要十分强大的力量,换言之,想要掌握C++就需要谨小慎微的态度和较为扎实的技术能力。那么,如何才能学好C++呢?...
[详细]
赞
踩
- 近期开题的同学越来越多,很多同学不知道怎么选题,不知道老师分配的题目应该怎么做,指导老师分享的信息不多,无从下手?_人体工学椅真的有用吗人体工学椅真的有用吗博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Ja...
[详细]
赞
踩
- linux查询以**开头的所有端口号是否占用。Linux查询占用接口命令随笔记录目录1.背景介绍2.netstat 1.背景介绍linux查询以**开头的所有端口号是否占用2.netstat 有时...
[详细]
赞
踩
- MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布...
[详细]
赞
踩
- 接下来,我们可以使用Python的数据可视化库(如matplotlib、seaborn或plotly)来创建图表。我们可以使用不同的图表类型(如柱状图、饼图、折线图等)来展示数据,并使用颜色、字体等元素来增强图表的可读性和吸引力。-首先,我...
[详细]
赞
踩
- 3.当scrapy发起请求,就拿一个ip,如果返回来的response.state有问题,就换一个ip再来一次;同时,在缓存里面,把这个失效(无用的ip)删掉;1.首先,你不能每爬一个url,就去redis里面拿一个;要是这样,你scrap...
[详细]
赞
踩
- 使用python制作一张简单的节日贺卡_python简单贺卡代码python简单贺卡代码打开python按ctrl+N新建一个界面输入holiday=input('输入节日名称:')to_name=input('输入收件人的姓名:')fr_...
[详细]
赞
踩
- 补一下昨天()的博客:区间dp,dp有三个特征(条件):1、重叠子问题;2、最优子结构;3、无后效性(这里不一一解释了)dp的三个要素:1、状态(一般状态、目标状态)2、阶段划分3、决策(状态转移)现在我们将这些规则转移到区间dp里来:区间...
[详细]
赞
踩
- 1.在界面上显示菜单,提示用户可进行的操作,包括以下操作:(1)添加功能(Add):添加一门课程的基本信息,包括课程编号、课程名称、课程性质(选修或必修)、总学时、授课学时、实验学时、学分、开课学期等。(2)查找功能(Find):按课程编号...
[详细]
赞
踩
- 第1章绪论1.试述数据、数据库、数据库系统、数据库管理系统的概念。答:(1)数据(Data):描述事物的符号记录称为数据。数据的种类有数字、文字、图形、图像、声音、正文等。 在现代计算机系统中数据的概念是广义的。早期的计算机系统主要用于科...
[详细]
赞
踩
- 但是在我们所书写的Controller中,只在类上添加了@RestController注解、方法添加了@RequestMapping注解,并没有使用@ResponseBody注解,怎么给浏览器响应呢?上述案例的功能,我们虽然已经实现,但是呢...
[详细]
赞
踩
- 一、Dubbo背景和简介单一应用框架(ORM)当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护垂直应用框架...
[详细]
赞
踩
- 你还需要创建一个苹果开发者帐户,并注册开发者计划(费用适用),以获得在任何设备上运行应用程序所需的证书。Linux安装东西很简单,敲一行指令,然后回车就完事了,下面是不同的Linux系统的安装指令。要为iOS开发应用程序,你需要访问一台苹果...
[详细]
赞
踩
- 介绍了常用的内置函数,附示例。_python内置函数python内置函数1内置函数列表内置函数在Python中占有非常重要的地位,熟练使用内置函数对学习和使用python来说非常重要。Python官方文档给出python内置函数文档如下,本...
[详细]
赞
踩
- 基于Springboot框架福建福州某大学教室座位预约系统设计与实现研究背景和意义、国内外现状,福州外语外贸学院福建江夏学院泉州信息工程学院福州理工学院福建农林大学金山学院福建技术师范学院福建船政交通职业学院漳州职业技术学院闽西职业技术学院...
[详细]
赞
踩
- 使用新版toml配置文件的frp,为多个内网web服务添加https支持_frp0.53.2httpfrp0.53.2http准备二级域名一个(example.com)云服务器一台(假如ip为:server-ip)申请一个或多个三级域名的S...
[详细]
赞
踩
- https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247485111&idx=3&sn=24466f90326147ffa67a6892adc72aaf&chksm=ec5ed9c...
[详细]
赞
踩
- 摘要本文对学生选课管理系统的构建流程进行了介绍,其主要包括需求分析详细设计、系统实现等重要部分组成,在此基础上构建的系统可应用到实际的学生选课管理系统业务中。本系统的主要特点在于将SSM应用到学生选课管理系统中,SSM的引入可提高系统开发效...
[详细]
赞
踩
- 哔哩哔哩文章摘要:本文介绍了饮食分享平台的计算机实战项目,包括系统设计、数据库搭建、后端实现和前端展示等方面。通过使用Java、SpringBoot、Vue.js和MySQL等技术,我们成功地构建了一个功能完善的饮食分享平台,用户可以在平台...
[详细]
赞
踩
- 有时候异步执行不满足我们的需求,于是://author:autumoon//联系QQ:4589968//日期:2020-11-18//同步执行QEventLoopeventLoop;QMetaObject::ConnectionconnRe...
[详细]
赞
踩
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。