YOLOv7改进详解

简介

YOLOv7目前是YOLO系列最先进的算法,在准确率和速度上超越了以往的YOLO系列。
在这里插入图片描述

SPPCSPC模块

利用金字塔池化结构和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))

在这里插入图片描述

CSPVoVNet模块

从内存访问成本的特点出发,Ma等人还分析了输入/输出通道比、体系结构分支的数量和元素智能操作对网络推理速度的影响。Dollár等在 (Fast and accurate model scaling)进行模型缩放时还考虑了激活,即更多地考虑卷积层输出张量中的元素数量。CSPVoVNet的体系结构除了考虑上述的基本设计问题外,还分析了梯度路径,以使不同层的权重学习到更多不同的特征。上述梯度分析方法使推理速度更快、更准确。
在这里插入图片描述

E-ELAN模块

  • 如何设计一个高效的网络?
    ELAN得出了一个结论:通过控制最短最长的梯度路径,一个更深层次的网络可以有效地学习和收敛。在大规模的ELAN中,无论梯度路径长度和计算块的堆叠数量如何,它都达到了一个稳定的状态。如果无限制地堆叠更多的计算块,则可能破坏这种稳定状态,参数利用率下降。
  • E-ELAN做了什么?
    E-ELAN使用扩展、洗牌、合并基数来实现在不破坏原有梯度路径的情况下不断增强网络学习能力的能力,引导不同的计算块组学习更多不同的特性。
    在这里插入图片描述## ##

DownC模块

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)

在这里插入图片描述
资料来源于网络

猜你喜欢

转载自blog.csdn.net/lijiahao1212/article/details/128159157