YOLOV7详细解读(一)网络架构解读
YOLOV7学习记录之原理+代码介绍
【Make YOLO Great Again】YOLOv1-v7全系列大解析(Backbone篇)
yolov7 图解
深入浅出 Yolo 系列之 Yolov7 基础网络结构详解
我觉得Head、Neck和Head的划分不太对,但因为自己没有重新画图,所以按照图的Backbone和Head进行讲解。
一:工作流程
YOLOv7 网络主要包含了 Input(输入)、Backbone(骨干网络)、Neck(颈部)、Head(头部)这四个部分。首先,图片经过输入部分数据增强等一系列操作进行预处理后,被送入主干网,主干网部分对处理后的图片提取特征;随后,提取到的特征经过 Neck 模块特征融合处理得到大、中、小三种尺寸的特征;最终,融合后的特征被送入检测头,经过检测之后输出得到结果。
二:Backbone
将YOLOv5的预处理卷积(6*6+3*3)换成卷积([3*3,stride1+3*3,stride2]+[3*3,stride1+3*3,stride2]),C3换成E-ELAN,CBS换成MP-1。
1.预处理
在yolov5初版本时,是focus模块,可看为下采样操作。
(1)Focus
在YOLOv5中,Focus模块原本用于在图片进入Backbone之前,对图片进行切片操作,其原理与YOLOv2的passthrough层类似。这种切片操作通过隔列采样+拼接的方式,将高分辨率的图片(特征图)拆分成多个低分辨率的图片或特征图,从而将W、H信息集中到通道空间,输入通道扩充了4倍。以YOLOv5s为例,原始的640x640x3的图像输入Focus结构,经过切片操作后变成320x320x12的特征图,再经过一次拼接(Concat)后,通过一次卷积(CBL,后改为CBS)操作,最终变成320x320x32的特征图。这种操作在YOLOv5中用于增加网络的感受野和特征图的分辨率,提高模型的性能。
【Yolov系列】Yolov5学习(一)补充2:Focus模块详解
(2)Yolov2的passthrough
yolov2其中的一个创新点是采用 passthrough 算法,解决池化信息丢失的问题,增加细粒度特征的检测(小对象)。
passthrough 算法主要是为了解决 pooling(池化)的缺点,不管是最大值池化,还是平均值池化,都会造成信息丢失,passthrough 主要思想是在池化之前,将输入信息进行拆分,一拆为四,经过拆分后的大小就和池化后的输出大小相同,然后叠加,叠加后的结果主要就是维度变化,这样就能解决池化会造成信息丢失的问题。
深度剖析YOLO系列的原理
(3)6*6,步长为2的Conv
在yolov5之后的代码版本,将Focus换成6*6,步长为2的Conv。
计算结果来看,Focus层和6*6步长为2的卷积层等价;
从性能上来看,性能较好的设备上Conv层比Focus层快,尤其是反向传播上;较老的设备上,Conv层比Focus层慢一些。
(4)yolov7的版本
首先最浅的颜色,也就是第一个CBS模块的颜色,它是一个1x1的卷积,stride(步长为1)。
其次稍浅的颜色,也就是第二个CBS模块的颜色,它是一个3x3的卷积,stride(步长为1)。
最后最深的颜色,也就是第三个CBS模块的颜色,它是一个3x3的卷积,stride(步长为2)。
1x1的卷积主要用来改变通道数。
3x3的卷积,步长为1,主要用来特征提取。
3x3的卷积,步长为2,主要用来下采样。
但是为什么,目前还没查到
2.C3换成ELAN
经过 4个 CBS 后,特征图变为 160 * 160 * 128 大小。随后会经过论文中提出的 ELAN 模块,ELAN 由多个 CBS 构成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化, 后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道。
ELAN模块是一个高效的网络结构,它通过控制最短和最长的梯度路径,使网络能够学习到更多的特征,并且具有更强的鲁棒性。ELAN有两条分支:第一条分支是经过一个1x1的卷积做通道数的变化;第二条分支首先经过一个1x1的卷积模块,做通道数的变化,然后再经过四个3x3的卷积模块,做特征提取。如图所示,最后把四个特征叠加在一起得到最后的特征提取结果。
3.CBS换成MP-1
MP 层 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数比的变化。
MP模块有两个分支,作用是进行下采样。第一条分支先经过一个maxpool,也就是最大池化。最大值化的作用就是下采样,然后再经过一个1x1的卷积进行通道数的改变。第二条分支先经过一个1x1的卷积,做通道数的变化,然后再经过一个3x3卷积核、步长为2的卷积块,这个卷积块也是用来下采样的。最后把第一个分支和第二分支的结果加在一起,得到了超级下采样的结果。
4.总结
backbone的基本组件就介绍完了,我们整体来看下 backbone,经过 4 个 CBS 后,接入例如一个 ELAN ,然后后面就是三个 MP1 + ELAN 的输出,对应的就是 C3/C4/C5 的输出,大小分别为 80 * 80 * 512 , 40 * 40 * 1024, 20 * 20 * 1024。 每一个 MP 由 5 层, ELAN 有 8 层, 所以整个 backbone 的层数为 4 + 8 + 13 * 3 = 51 层, 从 0 开始的话,最后一层就是第 50 层。
YOLOv7 网络模型的主干网部分主要由卷积、E-ELAN 模块、MPConv 模块以及SPPCSPC 模 块 构 建 而 成 。其 中 ,E-ELAN(Extended-ELAN) 模块,在原始ELAN 的基础上,改变计算块的同时保持原ELAN 的过渡层构,利用 expand、shuffle、merge cardinality 的思想来实现在不破坏原有梯度路径的情况下增强网络学习的能力。SPPCSPC 模块,在一串卷积中加入并行的多次 MaxPool 操作,避免了由于图像处理操作所造成的图像失真等问题,同时解决了卷积神经网络提取到图片重复特征的难题。MPConv 模块中,MaxPool 操作将当前特征层的感受野进行扩张再与正常卷积处理后的特征信息进行融合,提高了网络的泛化性。
输入的图片首先会在主干网络里面进行特征提取,提取到的特征可以被称作特征层,是输入图片的特征集合。在主干部分,我们获取了三个特征层进行下一步网络的构建,这三个特征层我称它为有效特征层。
三:Neck
FPN+PAN结构
在 Neck 模块,YOLOv7 与 YOLOv5 网络相同,也采用了传统的 PAFPN 结构。FPN是YoloV7的加强特征提取网络,在主干部分获得的三个有效特征层会在这一部分进行特征融合,特征融合的目的是结合不同尺度的特征信息。在FPN部分,已经获得的有效特征层被用于继续提取特征。在YoloV7里依然使用到了Panet的结构,我们不仅会对特征进行上采样实现特征融合,还会对特征再次进行下采样实现特征融合。
四:Head
YOLOV7 head 其实就是一个 **pafpn** 的结构,和之前的YOLOV4,YOLOV5 一样。首先,对于 backbone 最后输出的 32 倍降采样特征图 C5,然后经过 SPPCSP,通道数从1024变为512。先按照 top down 和 C4、C3融合,得到 P3、P4 和 P5;再按 bottom-up 去和 P4、P5 做融合。这里基本和 YOLOV5 是一样的,区别在于将 YOLOV5 中的 SPPF换成SPPCSP,CSP 模块换成了 ELAN-W 模块, 下采样变为了 MP-2 层,Conv2d变成了RepBlock+CBM。
1.SPPF换成SPPCSPC
SPP的作用是能够增大感受野,使得算法适应不同的分辨率图像,它是通过最大池化来获得不同感受野。
我们可以看到在第一条分支中,经过了maxpool的有四条分支。分别是5,9,13,1,这四个不同的maxpool就代表着能够处理不同的对象。也就是说,它这四个不同尺度的最大池化有四种感受野,用来区别于大目标和小目标。
CSP模块,首先将特征分为两部分,其中的一个部分进行常规的处理,另外一个部分进行SPP结构的处理,最后把这两个部分合并在一起,这样子就能够减少一半的计算量,使得速度变得快,精度反而会提升。
SPPCSPC 模块,在一串卷积中加入并行的多次 MaxPool 操作,避免了由于图像处理操作所造成的图像失真等问题,同时解决了卷积神经网络提取到图片重复特征的难题。
2.CSP 换成 ELAN-W
ELAN-W模块跟ELAN模块是非常的相似,不同的是它在第二条分支的时候选取的输出数量不同。ELAN模块选取了三个输出进行最后的相加,而ELAN-W模块选取了五个进行相加。
3.下采样换成MP-2
MP 层 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化
4.Conv2d换成RepBlock+CBM
与之前Yolo系列不同的是,YoloV7在Yolo Head前使用了一个RepConv的结构,这个RepConv的思想取自于RepVGG,基本思想就是在训练的时候引入特殊的残差结构辅助训练,这个残差结构是经过独特设计的,在实际预测的时候,可以将复杂的残差结构等效于一个普通的3x3卷积,这个时候网络的复杂度就下降了,但网络的预测性能却没有下降。
REP模块分为两个,一个是train(训练),一个deploy(推理)。
训练模块,它有三个分支。:最上面的分支是3x3的卷积,用于特征提取;中间的分支是1x1的卷积,用于平滑特征:最后分支是一个Identity,不做卷积操作,直接移过来,最后把它们相加在一起。推理模块,包含一个3x3的卷积,stride(步长为1)。是由训练模块重参数化转换而来。
在训练模块中,因为第一层是一个3x3的卷积,第二层是一个1x1的卷积,最后层是一个Identity。
在模型从参数化的时候,需要把1x1的卷积转换成3x3的卷积,把Identity也转换成3x3的卷积,然后进行一个矩阵的一个加法,也就是一个矩阵融合过程。然后最后将它的权重进行相加,就得到了一个3x3的卷积,也就是说,这三个分支就融合成了一条线,里面只有一个3x3的卷积。它们的权重是三个分支的叠加结果,矩阵,也是三个分支的叠加结果。
有的学者对RepConv的认识:通过分析RepConv与不同架构的结合及其性能,我们发现RepConv中的恒等连接消除了ResNet中的残差和DenseNet中的拼接,为不同的特征映射提供了更多的梯度多样性。
5.总结
检测头部分,本文的基线 YOLOv7 选用了表示大、中、小三种目标尺寸的 IDetect 检测头,RepConv 模块在训练和推理时结构具有一定的区别。具体可以参考RepVGG中的构造,其引入了结构重参数化的思想。
Yolo Head作为YoloV7的分类器与回归器,通过Backbone和FPN,可以获得三个加强过的有效特征层。每一个特征层都有宽、高和通道数,此时我们可以将特征图看作一个又一个特征点的集合,每个特征点上有三个先验框,每一个先验框都有通道数个特征。Yolo Head实际上所做的工作就是对特征点进行判断,判断特征点上的先验框是否有物体与其对应。与以前版本的Yolo一样,YoloV7所用的解耦头是一起的,也就是分类和回归在一个1X1卷积里实现。