YOLO改进:添加多尺度特征提取模块Scale-Aware RFE Model

本文介绍在YOLOv5中添加多尺度特征提取模块Scale - Aware RFE Model。该模块来自YOLO - FaceV2,使用空洞卷积提取多尺度信息,有减少参数量、防止梯度爆炸等特点。文中给出RFEM代码及在YOLOv5中的使用方法,最后在VisDrone数据集测试,添加模块后mAP未提升。

YOLOv5中添加多尺度特征提取模块Scale-Aware RFE Model

Scale-Aware RFE Model

该模块来自于论文:YOLO-FaceV2

RFEM结构
RFEM的结构很简单,该结构使用了三个不同空洞率(1、2、3)的空洞卷积提取特征以提取多尺度信息;此外,不同分支共享权重减少参数量;另外,使用残差连接防止梯度爆炸的问题;最后,将四个分支的特征相加得到输出的特征层。

RFEM代码

YOLO-Facev2
yolov5s_v2_RFEM_MultiSEAM.yaml中可以找到C3RFEM模块,在YOLO-Facev2中,输入特征将经过两个分支,左侧分支由一个1*1的卷积组成,该卷积用于调整输入通道,将输入特征的通道数调整为输出通道数的一半。右侧分支由一个1*1的卷积和RFEM模块组成,1*1的卷积的作用也是将原有输入特征的通道数调整为输出通道数的一半,RFEM模块的输入通道和输出通道一致。两个分支的进行通道拼接torch.cat,最后使用一个1*1的卷积调整通道。

class C3RFEM(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=True, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # act=FReLU(c2)
        # self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
        # self.rfem = RFEM(c_, c_, n)
        self.m = nn.Sequential(*[RFEM(c_, c_, n=1, e=e) for _ in range(n)])
        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

接下来看一下RFEM的代码,结构大部分由TridentBlock函数封装好了

class RFEM(nn.Module):
    def __init__(self, c1, c2, n=1, e=0.5, stride=1):
        super(RFEM, self).__init__()
        c = True
        layers = []
        layers.append(TridentBlock(c1, c2, stride=stride, c=c, e=e))
        c1 = c2
        for i in range(1, n):
            layers.append(TridentBlock(c1, c2))
        self.layer = nn.Sequential(*layers)
        # self.cv = Conv(c2, c2)
        self.bn = nn.BatchNorm2d(c2)
        self.act = nn.SiLU()

    def forward(self, x):
        out = self.layer(x)
        out = out[0] + out[1] + out[2] + x
        out = self.act(self.bn(out))
        return out

继续看一下TridentBlock,YOLO-Facev2中说RFEM结构受到Trident Networks的启发,Trident Networks,可以看出RFEM确实和TridentBlock十分相似。
trident block
trident block的代码也非常清晰,不做过多解释。

class TridentBlock(nn.Module):
    def __init__(self, c1, c2, stride
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值