YOLOv5中添加多尺度特征提取模块Scale-Aware RFE Model
Scale-Aware RFE Model
该模块来自于论文:YOLO-FaceV2

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的代码也非常清晰,不做过多解释。
class TridentBlock(nn.Module):
def __init__(self, c1, c2, stride

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

被折叠的 条评论
为什么被折叠?



