赞
踩
该模块是由KCPNet from IEEE Transactions on Geoscience and Remote Sensing中提出。具体来说,输入特征图将经过三个不同空洞率(2,4,8)的空洞卷积,并依次进行通道拼接。该模块的优势在于,能够有效地捕获平衡的非局部上下文特征和局部目标特征,解决小目标局部语义缺失。如果F的分辨率是62*62,且感受野为1,那么R1、R2、R3、P的感受野分别是5、13、29、29。P的感受野达到F的一半大小,这将使得输出特征图包含足够的非局部背景信息。
RFEM模块已经由充足的研究,如:YOLO-FACEV2中的RFEM,其使用三个并联的空洞卷积融合不同尺度的特征信息。然而,KCPNet中提出的RFEM模块通过密集连接金字塔结构将原始的感受野与其他三个尺度的感受野进行叠加(concat)与重用(后续进一步的DConv和Conv),相比于ASPP中的RFEM,缓解了网络的退化问题。此外,其他的RFEM忽视了不同感受野的特征的主导地位与层次关系,导致初始特的泛滥,而KCPNet提出的RFEM保证了初始信息的明显优势。最后,其余的RFEM的通常只是串联或并联,对于串联结构而言,原始的特征将随着级联的卷积被不断稀释;对于并联结构,KCPNet提出的RFEM可以仅在空洞率为8的情况下,将感受野提高到29;而其余的RFEM要想达到相同的感受野尺寸,需要高达14的空洞率。
class RFEM_KCPNet(nn.Module): def __init__(self, c1, c2): super(RFEM_KCPNet, self).__init__() self.dconv1 = nn.Conv2d(in_channels=c1, out_channels=c1 // 2, kernel_size=3, dilation=2, padding=2) self.dconv2 = nn.Conv2d(in_channels=c1 // 4, out_channels=c1 // 4, kernel_size=3, dilation=4, padding=4) self.dconv3 = nn.Conv2d(in_channels=c1 // 4, out_channels=c1 // 4, kernel_size=3, dilation=8, padding=8) self.conv1 = nn.Conv2d(in_channels=3 * c1 // 2, out_channels=c1 // 4, kernel_size=1) self.conv2 = nn.Conv2d(in_channels=7 * c1 // 4, out_channels=c1 // 4, kernel_size=1) self.conv3 = nn.Conv2d(in_channels=2 * c1, out_channels=c2, kernel_size=1) def forward(self, x): out = torch.cat((x, self.dconv1(x)), dim=1) out = torch.cat((out, self.dconv2(self.conv1(out))), dim=1) out = torch.cat((out, self.dconv3(self.conv2(out))), dim=1) out = self.conv3(out) return out
该类只有两个参数c1和c2,其中c1是输入特征图的通道数,c2是输出特征图的通道数。代码的具体含义可以结合上面的结构图理解,总体而言,代码不算难。
将class RFEM_KCPNet
放到common.py
文件中,然后,在yolo.py
文件中,添加RFEM_KCPNet
即可
if m in {Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, nn.ConvTranspose2d, DWConvTranspose2d, C3x, C3RFEM,
RFEM_KCPNet}:
... ...
在yaml
文件中添加:
# YOLOv5 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/93932
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。