1、提出了E-ELAN,但是只在yolov7-e6e中使用到。
2、yolov7基于拼接模型的缩放方法,在yolov7x中使用到。
3、将重参数化卷积应用到残差模块中或者用到基于拼接的模块中去。RepConvN
4、提出了两种新的标签分配方法
[-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分组的卷积,本质上就是ELAN的拓展 。只在yolov7-e6e中提到,是将yolov7-e6中的ELAN并行处理后得到的。
设计了同时改变深度和宽度的模型缩放方法,yolov7x是对yolov7进行了缩放。
增加了两个卷积层,增加了深度,并且输入数量,拼接后输出数量,以及卷积层输出的通道数量都是原来的1.25倍,从这个角度考虑增加了宽度。
重参数化卷积,使用3个不同的卷积层训练完成后,进行合并。重参数化卷积虽然在VGG上取得较好的成果,但是在残差网络中并没有取得很好的成果 。
而RepConvN是在重参数化卷积的基础上去掉了恒等连接。将重参数化卷积应用到残差模块或者用到基于拼接的模块中去。但是在代码中使用了最简单的重参数化卷积,并没有使用提出的这个结论。
为什么要去掉恒等连接?
因为残差网络本身存在恒等连接,而原本的重参数化卷积RepConv也有恒等连接,两者之间起了冲突,所以要去掉原本重参数化卷积RepConv中的恒等连接,成为RepConvN。
硬标签是yolov5所采用的方式,将目标值和预测值一起计算损失值;软标签是yolov7所使用的方式,将目标值的预测值通过分配器得到新的目标值,再和预测值一起计算损失值。
yolov7中将neck划分到了head里。
池化层和卷积。输出的通道数相较于输入没有改变,但是尺寸减半了,相当于复杂版的最大池化层。
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))
测试中用的都是detect模块,在训练中,使用的是Idetect和Iauxdetect模块。I的意思是implicit隐式的意思。对于隐式内容可以通过学习yolo-R来了解。
IDetect
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作为激活函数。