YOLOv7目前是YOLO系列最先进的算法,在准确率和速度上超越了以往的YOLO系列。
利用金字塔池化结构和CSP结构得到的模块。总的输入会被分成两个不同的分支。中间的3×3卷积并未进行分组,依旧是标准卷积,右侧则为一个point conv,最后将所有分支输出的信息流进行concat。
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))
从内存访问成本的特点出发,Ma等人还分析了输入/输出通道比、体系结构分支的数量和元素智能操作对网络推理速度的影响。Dollár等在 (Fast and accurate model scaling)进行模型缩放时还考虑了激活,即更多地考虑卷积层输出张量中的元素数量。CSPVoVNet的体系结构除了考虑上述的基本设计问题外,还分析了梯度路径,以使不同层的权重学习到更多不同的特征。上述梯度分析方法使推理速度更快、更准确。
DownC模块会用到三种最基本的结构,包括1×1的point conv,3×3的standard conv,以及mp操作的MaxPool,使用这三种基础模块组装成DownC大模块.
class DownC(nn.Module):
# Spatial pyramid pooling layer used in YOLOv3-SPP
def __init__(self, c1, c2, n=1, k=2):
super(DownC, self).__init__()
c_ = int(c1) # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_, c2//2, 3, k)
self.cv3 = Conv(c1, c2//2, 1, 1)
self.mp = nn.MaxPool2d(kernel_size=k, stride=k)
def forward(self, x):
return torch.cat((self.cv2(self.cv1(x)), self.cv3(self.mp(x))), dim=1)