YOLOV8添加可变形卷积(DCNv2)增强空间注意力

一、引言

可变形卷积(Deformable Convolution)是为了解决传统卷积在处理形变目标、复杂几何结构时能力不足的问题而设计的。它的核心思想就是:让卷积核的采样位置可以“自由活动”,而不是死板地固定在规则网格上

在实际目标检测任务中,常常会遇到各种变形目标,比如:

  • 正在奔跑的动物;
  • 被遮挡的人脸;
  • 弯曲的机械臂或树枝……

这些目标在图像中可能旋转、拉伸、形状不规则。传统卷积采样点是固定的,容易遗漏关键区域。而 可变形卷积(DCN) 通过引入可学习的偏移量(offset)和调制因子(mask),实现“采样点自由移动”,让卷积核“聪明”起来,自动对准目标结构。

对于人、动物、机械臂、树枝等形态复杂或可变形的目标,DCN 能够自适应目标轮廓、边界、细节的变化,增强特征表示能力,尤其是在目标检测、实例分割中效果明显。

二、思路

将网络结构中C2F层换成可变形卷积层

DCNV2代码:

class C2f DCN(nn.Module):
# CSp Bottleneck with 2 convolutions
definit. (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((y[-1])for m in self.m)
return self.cv2(torch.cat(y,1))

三、在YOLOv8添加DCNv2代码

按照以下步骤即可添加成功

1.在conv.py添加上述的DCNv2代码打开conv.py文件,该文件路径为:ultralytics/nn/modules/conv.py,如下图所示

复制完代码还没有完成,需要在该文件开头添加这个类C2f_DCN,如截图这样

2.在_init_.py文件导入C2f DCN

文件路径为:ultralytics/nn/modules/init.py,在init.py导入C2fDCN,导入截图所示

3.在tasks.py文件注册C2f DCN

该文件路径为:ultralytics/nn/tasks.py,在开头导入C2f_DCN,添加如截图所示

四、yaml文件修改

在ultralytics/cigmodelsv8日录下,新建一个yaml文件,复制yolov8.yaml文件,然后取名为yolov8-DCNv2.yam,这个文件代码如下所示,主要在主干网络把原始的c12层替换成可变性卷积层,也在其它地方修改,添加就行,还是多实验取张点最大的就行,可以在头部和骨干部修改,多多实验

nc:80 #nunber ofclasses
iscales:# model compound scaling constants, i.e.
'model=yolov8n.yaml' will call yolav8.yaml with scale 'n'
# [depth, width, max_channels]
n:[0.33,0.25,1024]# YOLOv8n summary: 225 layers,3157200 parameters,3157184 gradients8.9 GFLOPS
s:[0.33,0.50,1024]# YOLOv8s summary:225 layers,11166560 parameters,11166544 gradients28.8 GFLOPS
m:[0.67,0.75,768]25902640 parameters,25902624 gradients# YOLOv8m summary:295 layers,79.3GFLOPS
1:[1.00, 1.00, 512]# YOLOv8i summary:365 layers,43691520 parameters,43691504 gradients,165.7GFLOPS
x:[1.00,1.25,512]#YOLOv8x summary:365 layers,68229648 parameters,68229632 gradients,258.5 GFLOPS
# YOL0v8.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_DCN,[256,True]]
-[-1,1,TConv,[512,3,2]]#5-P4/16
-[-1,6,C2f_DCN,[512,True]]
-[-1,1,Conv,[1024,3,2]]#7-P5/32
-[-1,3,C2f_DCN,[1024, True]]
-[-1,1,SPPF,[1024,5]]#9
# YOLOv8.0n head
head:
-[-1,1,nn.Upsanple,[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,Detect,[nc]]# Detect(P3, P4, P5)

五、训练文件修改

根据你训练需求修改指定参数就行

import warnings
warnings.filterwarnings('ignore')
fron ultralytics import YoLo
1f-nane_- =='_-nain__':
model = YoL0(r'E:\Desktopinew-yolov8\ultralytics-main\ultralyticsicfg\models\v8\yolov8-DCNv2.yaml')
model.train(data=r'data.yaml'
cache=False,
1mgsz=640,
epochs=5.
single_cls=False
batch=4,
close mosaic=10,
workers=8,
device='cpu',
optimizer='SGD',
project='runs/train'
nane='exp",

如果是GPU训练,你的device就改成0

device='cou.参数意思是:你电脑是GPU你就埴0,CPU就埴cpu,GPU是有英伟达显卡的电脑使用的,如果没有英伟达显卡训练非常慢,因为我电脑没有英伟达显卡,这里训练只用了几张数据集进行测试,你们也可以租云服务器训练,方法都是一样的,后期有空会出一起环境配置视频,我以前的作品也有环境配置教程的,你们可以翻一下看看测试一下训练,打印出来的YOLOv8结构可以看到添加可变性卷积成功

数据集的配置:

训练成功则会打印模型结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值