赞
踩
(1)为了提取信息更丰富的特征,提出了整合全局注意力机制(GAM)。 该机制有效地捕获了特征的通道和空间方面,并增加了跨维交互的重要性。
(2)为了进一步提高网络的性能,引入了ACMIX(一种结合自关注和卷积优点的混合模型)。
(3)Yolov7-AC中ResNet-ACMIX模块的设计旨在增强骨干网的特征提取能力,并通过捕获更多信息特征来加速网络的收敛。
(4)对Yolov7网络中的E-ELAN模块进行了优化,在模块间引入了跳过连接和1×1卷积结构,并用ACMIXBLOCK取代了3×3卷积层。 这提高了特征提取能力,提高了推理速度。

在Yolov7的主干组件中引入ResNet-ACMIX模块,有效地保持了提取特征信息的一致性。 该模块基于ResNet的瓶颈结构,其中3x3卷积被ACMIX模块所取代,从而能够对不同区域进行自适应聚焦,并捕获更多信息特征,如图所示。 将输入分为主输入和残差输入,这有助于防止信息丢失,同时减少了参数数量和计算要求。 RESNet-ACMIX模块使网络能够在不遇到梯度消失的情况下获得更深的深度,并且学习结果对网络权值的波动更敏感。
ACmixblock代码如下:
- class ACmixblock(nn.Module):
- # Standard convolution
- def __init__(self, in_planes, out_planes, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
- super(ACmixblock, self).__init__()
- self.conv = ACmix(in_planes, out_planes, kernel_att=7, head=4, kernel_conv=3, stride=1, dilation=1)
- self.bn = nn.BatchNorm2d(out_planes)
- self.act = nn.ReLU(inplace=True) if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
-
- def forward(self, x):
- return self.act(self.bn(self.conv(x)))
-
- def fuseforward(self, x):
- return self.act(self.conv(x))
ResNet-ACmix代码如下:
- #ResNet-ACmix
- class ResNet_ACmix(nn.Module):
- # ResNet bottleneck
- def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion
- super(ResNet_ACmix, self).__init__()
- c_ = int(c2 * e) # hidden channels
- self.cv1 = Conv(c1, c_, 1, 1)
- self.cv2 = ACmixblock(c_, c_, kernel_att=7, head=4, kernel_conv=3, stride=1, dilation=1)
- self.cv3 = Conv(c_, c2, 1, 1)
- self.add = shortcut and c1 == c2
-
- def forward(self, x):
- return x + self.cv3(self.cv2(self.cv1(x))) if self.add else self.cv3(self.cv2(self.cv1(x)))

Yolov7中E-ELAN组件的特征提取模块通过加入REPVGG结构中的残差结构(即1×1卷积分支和跳转连接分支)得到了进一步的改进。 这导致了AC-E-ELAN结构的发展,如图所示,它集成了ACMIXBlock,由3x3卷积块组成,在ACMIXBlocks之间具有跳转连接和1x1卷积结构。 这种组合使网络既能从多分支模型训练过程中获得的丰富特征中获益,又能从单路径模型中获得快速、有效的记忆推断。
- # AC-E-ELAN
- class RepACmixblock(nn.Module):
-
- def __init__(self, c1, c2, k=3, s=1, p=None, g=1, act=True, deploy=False,kernel_att=7, head=4, dilation=1):
- super(RepACmixblock, self).__init__()
-
- self.deploy = deploy
- self.groups = g
- self.in_channels = c1
- self.out_channels = c2
- self.act = nn.ReLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
-
- if deploy:
- self.rbr_reparam = ACmixblock(c1, c2)
-
- else:
- self.rbr_identity = (nn.BatchNorm2d(num_features=c1) if c2 == c1 and s == 1 else None)
-
- self.rbr_dense = ACmixblock(c1, c2)
-
- self.rbr_1x1 = nn.Sequential(
- ACmix( c1, c2),
- nn.BatchNorm2d(num_features=c2),
- )
- def forward(self, inputs):
- if hasattr(self, "rbr_reparam"):
- return self.rbr_reparam(inputs)
-
- if self.rbr_identity is None:
- id_out = 0
- else:
- id_out = self.rbr_identity(inputs)
-
- return self.rbr_dense(inputs) + self.act(self.rbr_1x1(inputs) + id_out)

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。