做基因结构可以用哪个网站,wordpress配置报错,福州网上办事大厅,品牌策划论文一、本文介绍
本文给大家带来的改进机制是CVPR2024的最新改进机制DynamicConv其是CVPR2024的最新改进机制#xff0c;这个论文中介绍了一个名为ParameterNet的新型设计原则#xff0c;它旨在在大规模视觉预训练模型中增加参数数量#xff0c;同时尽量不增加浮点运算#x… 一、本文介绍
本文给大家带来的改进机制是CVPR2024的最新改进机制DynamicConv其是CVPR2024的最新改进机制这个论文中介绍了一个名为ParameterNet的新型设计原则它旨在在大规模视觉预训练模型中增加参数数量同时尽量不增加浮点运算FLOPs所以本文的DynamicConv被提出来了使得网络在保持低FLOPs的同时增加参数量从而允许这些网络从大规模视觉预训练中获益下面的图片为V10n和利用了DynamicConv的训练精度对比图本文内容包含详细教程 代码 原理介绍。 欢迎大家订阅我的专栏一起学习YOLO 专栏回顾YOLOv10改进系列专栏——本专栏持续复习各种顶会内容——科研必备 目录 一、本文介绍
二、原理介绍
三、核心代码
四、手把手教你添加DynamicConv机制
4.1 修改一
4.2 修改二
4.3 修改三
4.4 修改四
五、DynamicConv的yaml文件和运行记录
5.1 DynamicConv的yaml文件1
5.2 DynamicConv的yaml文件2
5.3 训练代码
5.4 DynamicConv的训练过程截图
五、本文总结 二、原理介绍 官方论文地址 官方论文地址点击此处即可跳转
官方代码地址 官方代码地址点击此处即可跳转
动态卷积Dynamic Convolution是《DynamicConv.pdf》中提出的一种关键技术旨在增加网络的参数量而几乎不增加额外的浮点运算FLOPs。以下是关于动态卷积的主要信息和原理 主要原理
1. 动态卷积的定义 动态卷积通过对每个输入样本动态选择或组合不同的卷积核称为experts来处理输入数据。这种方法可以视为是对传统卷积操作的扩展它允许网络根据输入的不同自适应地调整其参数。
2. 参数和计算的动态化 在动态卷积中不是为所有输入使用固定的卷积核而是有多个卷积核或参数集并且根据输入的特性动态选择使用哪个核。 这种选择通过一个学习得到的函数例如使用多层感知机MLP和softmax函数来动态生成控制各个卷积核贡献的权重。
3. 计算过程 给定输入特征和一组卷积核每个核对应一个专家。 每个专家的贡献由一个动态系数 控制这些系数是针对每个输入样本动态生成的。 输出是所有动态选定的卷积核操作的加权和 其中表示卷积操作是通过一个小型网络如MLP动态计算得出的这个小网络的输入是全局平均池化后的特征。
动态卷积的优点
参数效率高通过共享和动态组合卷积核动态卷积可以在增加极少的计算成本的情况下显著增加模型的参数量。适应性强由于卷积核是针对每个输入动态选择的这种方法可以更好地适应不同的输入特征理论上可以提高模型的泛化能力。资源使用优化动态卷积允许模型在资源有限的环境中如移动设备部署更复杂的网络结构而不会显著增加计算负担。
动态卷积的设计思想突破了传统卷积网络结构的限制通过动态调整和优化计算资源的使用实现了在低FLOPs条件下提升网络性能的目标这对于需要在计算资源受限的设备上运行高效AI模型的应用场景尤为重要。 三、核心代码
本节核心代码的使用方式看章节四
import torch.nn as nn
import torch.nn.functional as F
import torch
from timm.layers import CondConv2d__all__ [C2f_DynamicConv, DynamicConv]def autopad(k, pNone, d1): # kernel, padding, dilationPad to same shape outputs.if d 1:k d * (k - 1) 1 if isinstance(k, int) else [d * (x - 1) 1 for x in k] # actual kernel-sizeif p is None:p k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn pclass Conv(nn.Module):Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation).default_act nn.SiLU() # default activationdef __init__(self, c1, c2, k1, s1, pNone, g1, d1, actTrue):Initialize Conv layer with given arguments including activation.super().__init__()self.conv nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groupsg, dilationd, biasFalse)self.bn nn.BatchNorm2d(c2)self.act self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):Apply convolution, batch normalization and activation to input tensor.return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):Perform transposed convolution of 2D data.return self.act(self.conv(x))class DynamicConv(nn.Module): Dynamic Conv layerdef __init__(self, in_features, out_features, kernel_size1, stride1, padding, dilation1,groups1, biasFalse, num_experts4):super().__init__()# print(, num_experts)self.routing nn.Linear(in_features, num_experts)self.cond_conv CondConv2d(in_features, out_features, kernel_size, stride, padding, dilation,groups, bias, num_experts)def forward(self, x):pooled_inputs F.adaptive_avg_pool2d(x, 1).flatten(1) # CondConv routingrouting_weights torch.sigmoid(self.routing(pooled_inputs))x self.cond_conv(x, routing_weights)return xclass Bottleneck_DynamicConv(nn.Module):# Standard bottleneck with DCNdef __init__(self, c1, c2, shortcutTrue, g1, k(3, 3), e0.5): # ch_in, ch_out, shortcut, groups, kernels, expandsuper().__init__()c_ int(c2 * e) # hidden channelsself.cv1 Conv(c1, c_, k[0], 1)self.cv2 DynamicConv(c_, c2, k[1], 1, groupsg)self.add shortcut and c1 c2def forward(self, x):return x self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))class C2f_DynamicConv(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5): # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()self.c int(c2 * e) # hidden channelsself.cv1 Conv(c1, 2 * self.c, 1, 1)self.cv2 Conv((2 n) * self.c, c2, 1) # optional actFReLU(c2)self.m nn.ModuleList(Bottleneck_DynamicConv(self.c, self.c, shortcut, g, k(3, 3), e1.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))if __name__ __main__:# Generating Sample imageimage_size (1, 64, 224, 224)image torch.rand(*image_size)# Modelmodel C2f_DynamicConv(64, 64)out model(image)print(out.size()) 四、手把手教你添加DynamicConv机制
4.1 修改一
第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。
4.2 修改二
第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。 4.3 修改三
第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)
从今天开始以后的教程就都统一成这个样子了因为我默认大家用了我群内的文件来进行修改
4.4 修改四
按照我的添加在parse_model里添加即可。 到此就修改完成了大家可以复制下面的yaml文件运行。 五、DynamicConv的yaml文件和运行记录
5.1 DynamicConv的yaml文件1 仅替换原先的Conv模块 此版本训练信息YOLOv10n-DynamicConv-1 summary: 385 layers, 2896642 parameters, 2896626 gradients, 7.8 GFLOPs # Ultralytics YOLO , AGPL-3.0 license
# YOLOv10 object detection model. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. modelyolov10n.yaml will call yolov10.yaml with scale n# [depth, width, max_channels]n: [0.33, 0.25, 1024]backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, DynamicConv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, DynamicConv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 1, PSA, [1024]] # 10# YOLOv10.0n head
head:- [-1, 1, nn.Upsample, [None, 2, nearest]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, nearest]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 16 (P3/8-small)- [-1, 1, DynamicConv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 19 (P4/16-medium)- [-1, 1, SCDown, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)5.2 DynamicConv的yaml文件2 替换所有的下采样模块,包括YOLOv10自带的SCDown. 此版本训练信息YOLOv10n-DynamicConv-2 summary: 370 layers, 4898318 parameters, 4898302 gradients, 7.6 GFLOPs # Ultralytics YOLO , AGPL-3.0 license
# YOLOv10 object detection model. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. modelyolov10n.yaml will call yolov10.yaml with scale n# [depth, width, max_channels]n: [0.33, 0.25, 1024]backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, DynamicConv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, DynamicConv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, DynamicConv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, DynamicConv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 1, PSA, [1024]] # 10# YOLOv10.0n head
head:- [-1, 1, nn.Upsample, [None, 2, nearest]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, nearest]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 16 (P3/8-small)- [-1, 1, DynamicConv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 19 (P4/16-medium)- [-1, 1, DynamicConv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)5.3 训练代码
大家可以创建一个py文件将我给的代码复制粘贴进去配置好自己的文件路径即可运行。
import warnings
warnings.filterwarnings(ignore)
from ultralytics import YOLOif __name__ __main__:model YOLO(ultralytics/cfg/models/v8/yolov8-C2f-FasterBlock.yaml)# model.load(yolov8n.pt) # loading pretrain weightsmodel.train(datar替换数据集yaml文件地址,# 如果大家任务是其它的ultralytics/cfg/default.yaml找到这里修改task可以改成detect, segment, classify, posecacheFalse,imgsz640,epochs150,single_clsFalse, # 是否是单类别检测batch4,close_mosaic10,workers0,device0,optimizerSGD, # using SGD# resume, # 如过想续训就设置last.pt的地址ampFalse, # 如果出现训练损失为Nan可以关闭ampprojectruns/train,nameexp,) 5.4 DynamicConv的训练过程截图 五、本文总结 到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv10改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~ 专栏回顾YOLOv10改进系列专栏——本专栏持续复习各种顶会内容——科研必备