yolov7论文学习——创新点解析、网络结构图

创新点

1、提出了E-ELAN,但是只在yolov7-e6e中使用到。
2、yolov7基于拼接模型的缩放方法,在yolov7x中使用到。
3、将重参数化卷积应用到残差模块中或者用到基于拼接的模块中去。RepConvN
4、提出了两种新的标签分配方法

一、ELAN和E-ELAN

1、 ELAN

yolov7使用大量的ELAN作为基础模块。
yolov7论文学习——创新点解析、网络结构图_第1张图片

   [-1, 1, Conv, [64, 1, 1]],
   [-2, 1, Conv, [64, 1, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1]],  # 11

2、E-ELAN

2分组的卷积,本质上就是ELAN的拓展 。只在yolov7-e6e中提到,是将yolov7-e6中的ELAN并行处理后得到的。
yolov7论文学习——创新点解析、网络结构图_第2张图片
yolov7论文学习——创新点解析、网络结构图_第3张图片

二、模型缩放

设计了同时改变深度和宽度的模型缩放方法,yolov7x是对yolov7进行了缩放。
增加了两个卷积层,增加了深度,并且输入数量,拼接后输出数量,以及卷积层输出的通道数量都是原来的1.25倍,从这个角度考虑增加了宽度。
yolov7论文学习——创新点解析、网络结构图_第4张图片

三、重参数化卷积的改进 RepConvN

1、RepConv

重参数化卷积,使用3个不同的卷积层训练完成后,进行合并。重参数化卷积虽然在VGG上取得较好的成果,但是在残差网络中并没有取得很好的成果 。
yolov7论文学习——创新点解析、网络结构图_第5张图片

2、RepConvN

而RepConvN是在重参数化卷积的基础上去掉了恒等连接。将重参数化卷积应用到残差模块或者用到基于拼接的模块中去。但是在代码中使用了最简单的重参数化卷积,并没有使用提出的这个结论。

为什么要去掉恒等连接?
因为残差网络本身存在恒等连接,而原本的重参数化卷积RepConv也有恒等连接,两者之间起了冲突,所以要去掉原本重参数化卷积RepConv中的恒等连接,成为RepConvN。

yolov7论文学习——创新点解析、网络结构图_第6张图片

四、软标签和硬标签

yolov7论文学习——创新点解析、网络结构图_第7张图片
硬标签是yolov5所采用的方式,将目标值和预测值一起计算损失值;软标签是yolov7所使用的方式,将目标值的预测值通过分配器得到新的目标值,再和预测值一起计算损失值。

五、两种新的标签分配方法

yolov7论文学习——创新点解析、网络结构图_第8张图片
粗粒度和细粒度。粗标签是5个网格,细标签是3个网格。

六、yolov7网络结构图

yolov7论文学习——创新点解析、网络结构图_第9张图片
yolov7中将neck划分到了head里。
yolov7论文学习——创新点解析、网络结构图_第10张图片
池化层和卷积。输出的通道数相较于输入没有改变,但是尺寸减半了,相当于复杂版的最大池化层。
yolov7论文学习——创新点解析、网络结构图_第11张图片

class SPPCSPC(nn.Module):
    # CSP https://github.com/WongKinYiu/CrossStagePartialNetworks
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=(5, 9, 13)):
        super(SPPCSPC, self).__init__()
        c_ = int(2 * c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(c_, c_, 3, 1)
        self.cv4 = Conv(c_, c_, 1, 1)
        self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])
        self.cv5 = Conv(4 * c_, c_, 1, 1)
        self.cv6 = Conv(c_, c_, 3, 1)
        self.cv7 = Conv(2 * c_, c2, 1, 1)

    def forward(self, x):
        x1 = self.cv4(self.cv3(self.cv1(x)))
        y1 = self.cv6(self.cv5(torch.cat([x1] + [m(x1) for m in self.m], 1)))
        y2 = self.cv2(x)
        return self.cv7(torch.cat((y1, y2), dim=1))

yolov7论文学习——创新点解析、网络结构图_第12张图片
yolov7论文学习——创新点解析、网络结构图_第13张图片
yolov7论文学习——创新点解析、网络结构图_第14张图片

七、yolov7x的网络结构图

yolov7论文学习——创新点解析、网络结构图_第15张图片yolov7论文学习——创新点解析、网络结构图_第16张图片

八、检测模块

测试中用的都是detect模块,在训练中,使用的是Idetect和Iauxdetect模块。I的意思是implicit隐式的意思。对于隐式内容可以通过学习yolo-R来了解。
yolov7论文学习——创新点解析、网络结构图_第17张图片
IDetect
yolov7论文学习——创新点解析、网络结构图_第18张图片

yolov7论文学习——创新点解析、网络结构图_第19张图片

九、文件之间的关系

yolov7论文学习——创新点解析、网络结构图_第20张图片

1、yolov7和yolov7x是常规GPU的模型。yolov7x是在yolov7的基础上在颈部进行堆栈缩放,并使用所提出的复合缩放方法对整个模型的深度和宽度进行缩放得到的。
2、yolov7-d6、yolov7-e6、yolov7-e6e和yolov7-w6是云GPU的模型。对于yolov7-w6,我们使用新提出的复合缩放方法来获得yolov7-e6和yolov7-d6。此外,我们将所提出的E-ELAN用于yolov7-e6,从而完成yolov7-e6e
3、yolov7-tiny和yolov7-tiny-silu是边缘GPU的模型。它们的区别只在于所使用的激活函数不同。yolov7-tiny它将使用Leaky ReLU作为激活函数。对于其他模型,我们使用SiLU作为激活函数。

你可能感兴趣的:(yolo,YOLO)