暑校


2、yolo系列-yolov4

<p>YOLOv4是2020年Alexey Bochkovskiy等人发表在CVPR上的一篇文章,并不是Darknet的原始作者Joseph Redmon发表的。</p> <h1>V4改进目标</h1> <p>(1)开发一个高效、强大的目标检测模型。它使每个人都可以使用1080ti或2080ti GPU来训练一个非常快速和准确的目标检测器。 (2)验证了最先进的 Bag-of-Freebies和 Bag-of-Specials对象检测在检测器训练时的影响。 (3)更适合于单个GPU的训练,包括CBN,PAN,SAM等。</p> <h1>网络结构</h1> <p>yolo v4整体网络结构如下图所示,可以看到由以下四个部分组成:</p> <h6>输入端: 训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练</h6> <h6>BackBone主干网络: 包括:CSPDarknet53、Mish激活函数、Dropblock</h6> <h6>Neck: SPP模块、FPN+PAN、SAM结构</h6> <h6>Head: 其他与yolo v3相同,主要改进的是训练时的回归框位置损失函数CIOU Loss取代原先的Iou Loss,以及预测框筛选的nms变为DIOU nms</h6> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1d3d1279bb3750f129f4b141d2a12cde&amp;amp;file=file.png" alt="" /></p> <ul> <li> <p>CBM:Yolov4网络结构中的最小组件,由Conv+Bn+<strong>Mish</strong>(不再是v3的ReLU)激活函数三者组成。</p> </li> <li> <p>CBL:由Conv+Bn+Leaky_relu激活函数三者组成。</p> </li> <li> <p>Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。</p> </li> <li> <p>CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。</p> </li> <li>SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。</li> </ul> <h1>改进细节</h1> <h2>1、输入</h2> <p>&amp;emsp;&amp;emsp;Yolov4对训练时的输入端进行改进,比如数据增强Mosaic、cmBN、SAT自对抗训练。将大小从416x416x3变成608x608x3。</p> <h4>Mosaic数据增强</h4> <p>&amp;emsp;&amp;emsp;Yolov4中使用的Mosaic数据增强是参考2019年底提出的CutMix(不懂的可以看数据增强那一小节)的方式,但CutMix只使用了两张图片(一对)进行拼接,而Mosaic数据增强则采用了4张图片,使用随机缩放、随机裁剪、随机排布的方式进行拼接。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=70f5e6f81244b23254843015b7909005&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=70f5e6f81244b23254843015b7909005&amp;file=file.png&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>流程:</h6> <ol> <li>初始化整个背景图,也就是初始化一张空白的画布。大小为(2 x imagesize(查资料说imagesize是640),2 x imagesize,3)。</li> <li>在背景图上随机读取一个中心点。</li> <li>从数据集中随机读取四张图片。分别对四张图片进行翻转(对原始图片进行左右的翻转)、缩放(对原始图片进行大小的缩放)、色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作。</li> <li>基于中心点分别将四张图片放到中心点的左上,右上,左下,右下,但是中心点是随机生成的,所以拼接的时候可能需要裁剪。</li> <li>根据偏移量来删掉被裁减掉的标签和重新打标签。</li> </ol> <h6>优点:</h6> <p>(1)丰富数据集: 随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。 (2)增加数据的多样性: 混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。 (3)batch不需要很大: Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果 (4)有利于提升小目标检测性能: Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力。</p> <h4>cmBN(Cross mini-Batch Normalization)</h4> <p>&amp;emsp;&amp;emsp;CmBN,是一种深度学习中用于提高模型性能和稳定性的<strong>归一化技术</strong>。它是由YOLOv4的作者提出,并在论文中进行了详细描述15。</p> <h5>BN</h5> <p>&amp;emsp;&amp;emsp;BN是通过对每个小批量(mini-batch)数据进行归一化处理来加速模型训练并提高模型稳定性。在BN中,无论整个批次(batch)被分割成多少个mini-batch,每个mini-batch的前向传播过程中都会独立地计算并使用该mini-batch的激活值的局部均值和方差进行归一化。然而,当mini-batch的大小较小,其计算得到的均值和方差可能因为样本量不足而不准确,从而影响模型性能。</p> <h5>cmBN</h5> <p>&amp;emsp;&amp;emsp;CmBN的核心思想是在单个批次(batch)中的多个小批量(mini-batch)之间收集统计信息,而不是仅在单个小批量内部进行归一化。</p> <h6>优点</h6> <ul> <li>提高模型稳定性和性能:CmBN能够利用更多的数据来估计均值和方差,从而提高模型在小批量训练设置下的稳定性和性能。</li> <li>减少模型对大批量大小的依赖:CmBN还有助于减少模型对大批量大小的依赖,使得模型在不同硬件配置下都能保持较好的性能</li> </ul> <h4>SAT自对抗训练(没懂)</h4> <p>自对抗训练也是一种数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。</p> <ul> <li>第一阶段,CNN通过反向传播改变图片信息,而不是改变网络权值。通过这种方式,CNN可以进行对抗性攻击,改变原始图像,造成图像上没有目标的假象。</li> <li>第二阶段,对修改后的图像进行正常的目标检测。</li> </ul> <h2>2、backbone</h2> <p>&amp;emsp;&amp;emsp;在yolo v4中,作者基于CSPNet(Cross Stage Partial Network)和Darknet53。将这两个进行融合,构建了一个全新的backbone: <strong>CSPDarknet53</strong>。</p> <h4>CSPNet</h4> <p>&amp;emsp;&amp;emsp;CSPNet的核心思想是,将输入特征Part 1和Part 2两部分。Part 1保持不变或者之作恒等映射。Part 2通过dense block(诸如残差模块等常见的模块)进行处理,接着将两个分支的信息在通道方向进行Concat拼接,最后再通过Transition层进一步融合。下面是表示了原始的残差网络结构以及经过CSPNet改进残差网络结构: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c9de542f1190853cea36fd792f59f16d&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c9de542f1190853cea36fd792f59f16d&amp;file=file.jpg&quot</a>; width=&quot;70%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>方法</h6> <p>①用 Concat 代替 Add,提取更丰富的特征。 ②引入 transition layer(上图中绿色的部分) (1 x 1conv + 2 x 2pooling(暂且不知道是maxpool还是avgpool)),提取特征,降低计算量,提升速度。</p> <pre><code class="language-c">为什么引入 1 * 1conv,能够降低计算量,提升速度 ?</code></pre> <p>下面举一个例子,输入图片大小是 56 x 56 x 256,要求得到输出大小是 28 x 28 x 512,方法一是使用普通3x3的卷积,方法二是使用1 x 1的卷积,计算两个方法的参数量(具体计算方法可以看mobilenet章节): &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c496619525a1d56d3e78282fbfa224d6&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c496619525a1d56d3e78282fbfa224d6&amp;file=file.jpg&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <p>③将Base layer分为两部分进行融合,提取更丰富的特征。</p> <h4>Mish激活函数</h4> <p>&amp;emsp;&amp;emsp;在yolo v4将激活函数替换成一个新的激活函数:Mish。他的数学公式如下图所示: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=efdfa51698f0f1def94e8ba7b485934b&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=efdfa51698f0f1def94e8ba7b485934b&amp;file=file.png&quot</a>; width=&quot;40%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt; &amp;emsp;&amp;emsp;Mish和Leaky_relu激活函数的图形对比如下: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f8fd8dd8251a46a485231510a533f1b0&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f8fd8dd8251a46a485231510a533f1b0&amp;file=file.png&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>优点:</h6> <p>(1)从图中可以看出Mish,在负值时并不是完全截断,而允许比较小的负梯度流入(即使输入值是负数,Mish 函数也能产生一个非零的梯度,从而允许误差梯度反向传播回网络的前层)从而保证了信息的流动。 (2)Mish激活函数无边界,这让他避免了饱和(有下界,无上界)且每一点连续平滑且非单调性,从而使得梯度下降更好。</p> <h4>Dropblock正则化</h4> <h6>v1:</h6> <p>&amp;emsp;&amp;emsp;v1在最后的全连接层添加了Dropout来防止网络过拟合,但是传统的Dropout是一个非常简单粗暴的方式,有疑问的可以去看v2中的归一化部分。并且Dropout虽然在全连接层上效果好但是在卷积层上的效果不好。</p> <h6>v4:</h6> <p>&amp;emsp;&amp;emsp;v4作者说他毫不犹豫地选择了DropBlock作为他们的正则化方法,因为他看了DropBlock与其他正则化方法的对比。 <strong>DropBlock技术在称为块的相邻相关区域中丢弃特征。</strong>Dropblock方法的引入是为了克服Dropout随机丢弃特征的主要缺点,Dropout主要作用在全连接层,而Dropblock可以作用在<strong>任何卷积层之上</strong>。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。 传统的Dropout与Dropblock的对比,左边是传统的Dropout,右边是Dropblock: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4437e3ba9d8c70e7149bf6dce83d0224&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4437e3ba9d8c70e7149bf6dce83d0224&amp;file=file.jpg&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h2>3、Neck</h2> <h4>SPP(Spatial Pyramid Pooling Networks)</h4> <p>&amp;emsp;&amp;emsp;在传统的CNN中,全连接层要求输入数据具有固定的尺寸。但是,由于特征图可能具有不同的尺寸,直接将它们传递到全连接层是不可取的。SSP通过使用不同尺寸的池化窗口对特征图进行池化,生成固定尺寸的特征向量。这样,无论原始特征图的尺寸如何,SSP都能将它们转换成适合全连接层的格式。然后在网络的最后一层concat所有特征图,后面能够继续接CNN模块。总而言之,SSP用来解决不同尺寸的特征图如何进入全连接层的一种方法。 &amp;emsp;&amp;emsp;下面看使用v4spp模块来处理一个特征图为13x13x256大小的例子: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3dd6ed286bf1421b096fb839da10d4af&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3dd6ed286bf1421b096fb839da10d4af&amp;file=file.jpg&quot</a>; width=&quot;50%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h4>PAN</h4> <h6>v3:</h6> <p>&amp;emsp;&amp;emsp;在v3中只使用了自顶向下的FPN,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。</p> <h6>v4:</h6> <p>&amp;emsp;&amp;emsp;Yolov4中Neck这部分除了使用FPN外,还在此基础上使用了PAN结构。PAN(Path Aggregation Network)结构其实就是在FPN(从顶到底信息融合)的基础上加上了从底到顶的信息融合。和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a0e5bd55c1b53fa05d70961c2a4aad4c&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a0e5bd55c1b53fa05d70961c2a4aad4c&amp;file=file.png&quot</a>; width=&quot;50%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt; &amp;emsp;&amp;emsp;但YOLOv4的PAN结构和原始论文的融合方式又略有差异,如下图所示。图(a)是原始论文中的融合方式,即特征层之间融合时是直接通过相加的方式进行融合的,但在YOLOv4中是通过在通道方向Concat拼接的方式进行融合的。 &amp;emsp;&amp;emsp;但是v4在原始PAN结构上进行了一点改进,图(a)是在原本的PANet网络的PAN结构中,特征层之间融合时是直接通过addition的方式进行融合的,而图(b)Yolov4中则采用在通道方向concat拼接操作融合的,如下图所示: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=606cdf85a3c57eed0d07ecc0f6c4d7be&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=606cdf85a3c57eed0d07ecc0f6c4d7be&amp;file=file.png&quot</a>; width=&quot;50%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>为什么要把add改为concat?:</h6> <ul> <li><strong>add-特征图相加,通道数不变</strong>: 将两个特征图直接相加,是ResNet中的融合方法,基于这种残差堆叠相加,可以有效地减小因为网络层数加深而导致的cnn网络退化问题。add不增加图像的维度,只增加图像每一维的特征信息量这显然是对最终的图像的分类是有益的。深层特征图在卷积过程中丢失了许多细节信息,通过add的方式得以补全,是在二维的平面上对特征图的增强。因此add在进行图像特征增强时使用最佳。</li> <li><strong>concat-通道数的增加</strong>: 将两个特征图在通道数方向叠加在一起,原特征图信息完全保留下来,再对原特征图增加一些我们认为是较好的特征图,丰富了特征图的多样性,是在空间上对原特征图的增强,这样在下一次卷积的过程中我们能得到更好的特征图。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7c2d768e2b48f4979094f772a452a756&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7c2d768e2b48f4979094f772a452a756&amp;file=file.png&quot</a>; width=&quot;50%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</li> </ul> <h4>SAM(Spatial Attention Mechanism)</h4> <p>&amp;emsp;&amp;emsp;通过对特征图空间内部的关系来产生空间注意力特征图。不同于通道注意力,SAM聚焦于特征图上的有效信息在&quot;哪里&quot;(where)。SAM结构如下图所示: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8e9a48f119329307587c52376837197d&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8e9a48f119329307587c52376837197d&amp;file=file.jpg&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt; &amp;emsp;&amp;emsp;空间注意力的思路流程是:</p> <ul> <li>1、对一个尺寸为 H×W×C的输入特征图F进行<strong>通道维度</strong>的全局最大池化和全局平均池化,得到两个 H×W×1 的特征图;(在通道维度进行池化,压缩通道大小,便于后面学习空间的特征)</li> <li>2、将全局最大池化和全局平均池化的结果,按照通道拼接(concat),得到特征图尺寸为HxWx2,</li> <li>3、对拼接的结果进行7x7的卷积操作,得到特征图尺寸为 HxWx1,接着通过Sigmoid激活函数 ,得到空间注意力权重矩阵Ms。 &amp;emsp;&amp;emsp;但是v4在原始将SAM从空间注意修改为点注意,<strong>不应用最大值池化和平均池化</strong>,而是直接接一个7X7的卷积层,这样使速度相对快一些。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=dd7fb01129bc5b555f22e28ade193581&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=dd7fb01129bc5b555f22e28ade193581&amp;file=file.png&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</li> </ul> <h2>4、Head</h2> <h4>CIoU loss</h4> <h6>IOU loss:</h6> <p>&amp;emsp;&amp;emsp;IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a38a8dfc2b3f6f9f9b36a7820222e47a&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a38a8dfc2b3f6f9f9b36a7820222e47a&amp;file=file.jpg&quot</a>; width=&quot;70%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>GIOU loss:</h6> <p>&amp;emsp;&amp;emsp;使用GIoU可以解决预测框与真实框无重叠区域造成的梯度消失问题,可以得到比MSE和IoU损失函数更高精度的预测框,但是存在迭代速度慢和边界框回归错误的问题。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e89542026acf1a9cc4af9804f4cede65&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e89542026acf1a9cc4af9804f4cede65&amp;file=file.jpg&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>DIOU loss:</h6> <p>&amp;emsp;&amp;emsp;DIoU考虑到GIoU的缺点,也是增加了最大矩形检测框,将真实框和预测框都包含了进来,但是DIoU计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU包含出现的问题。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=bb7462a9a99f0cef5d62af4ac1dd56ae&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=bb7462a9a99f0cef5d62af4ac1dd56ae&amp;file=file.jpg&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h6>CIOU loss:</h6> <p>&amp;emsp;&amp;emsp;v4中提到一个优秀的回归定位损失需要考虑到三种因素:两个框的重叠面积、两个框中心点的举例,两个框的长宽比。所以V4中使用的CIOU lossCIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=202abd35a4ff93e4e665cb1e3ab1eae8&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=202abd35a4ff93e4e665cb1e3ab1eae8&amp;file=file.jpg&quot</a>; width=&quot;40%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h1>参考文献</h1> <p>1、论文原文:<a href="https://arxiv.org/pdf/2004.10934">https://arxiv.org/pdf/2004.10934</a> 2、源代码:<a href="https://github.com/AlexeyAB/darknet">https://github.com/AlexeyAB/darknet</a> 3、哔哩哔哩:<a href="https://www.bilibili.com/video/BV1yi4y1g7ro?p=4&amp;vd_source=48258d61722fcea384d1c05707db8963">https://www.bilibili.com/video/BV1yi4y1g7ro?p=4&amp;vd_source=48258d61722fcea384d1c05707db8963</a> <a href="https://www.bilibili.com/video/BV1NF41147So/?spm_id_from=333.880.my_history.page.click">https://www.bilibili.com/video/BV1NF41147So/?spm_id_from=333.880.my_history.page.click</a> 4、博客:<a href="https://blog.csdn.net/qq_37541097/article/details/123229946">https://blog.csdn.net/qq_37541097/article/details/123229946</a> <a href="https://www.cnblogs.com/further-further-further/p/14115515.html">https://www.cnblogs.com/further-further-further/p/14115515.html</a> <a href="https://blog.csdn.net/weixin_43334693/article/details/129248856">https://blog.csdn.net/weixin_43334693/article/details/129248856</a> <a href="https://blog.csdn.net/m0_37605642/article/details/135980263">https://blog.csdn.net/m0_37605642/article/details/135980263</a> <a href="https://blog.csdn.net/xys430381_1/article/details/88355956">https://blog.csdn.net/xys430381_1/article/details/88355956</a></p>

页面列表

ITEM_HTML