2、yolo系列-yolo v5
<p>V5并没有发表论文,所以只能根据代码来看看新增了什么细节。</p>
<h1>V5改进目标</h1>
<p>让模型速度变小、变快,适合在移动端部署。</p>
<h1>网络结构</h1>
<p>YOLOv5有YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本。这几个模型的结构基本一样,不同的是depth_multiple模型深度和width_multiple模型宽度这两个参数。</p>
<ul>
<li>YOLOv5s:这是 YOLOv5 系列中最小的模型。“s” 代表 “small”(小)。该模型是YOLOv5系列中深度最小、特征图的宽度最小的网络。其他三种都是在此基础上不断加深,不断加宽。</li>
<li>YOLOv5m:这是 YOLOv5 系列中一个中等大小的模型。</li>
<li>YOLOv5l:这是 YOLOv5 系列中一个较大的模型。YOLOv5l 的准确度相对较高,但检测速度较慢。适用于需要较高准确度,且具有较强计算能力的设备。</li>
<li>YOLOv5x:这是 YOLOv5 系列中最大的模型。YOLOv5x 在准确度方面表现最好,但检测速度最慢。适用于需要极高准确度的任务,且具有强大计算能力(如 GPU)的设备。</li>
<li>YOLOv5n:这是 YOLOv5 系列中的一个变体,专为 Nano 设备(如 NVIDIA Jetson Nano)进行优化。YOLOv5n 在保持较快速度的同时,提供适用于<strong>边缘设备</strong>的准确度。</li>
</ul>
<p><strong>下面我们主要以yolo v5s网络来介绍。</strong>
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3add8c1bddba6519e408fbb803969930&file=file.png"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3add8c1bddba6519e408fbb803969930&file=file.png"</a>; width="60%" height="auto"></center></p>
<p>&emsp;&emsp;Yolov5的网络结构如下图所示,主要包括输入、Backbone骨干网络、Neck颈部结构和Head头部结构(Prediction)四个模块,分别负责输入图片预处理、特征提取、特征融合、输出检测信息。输入图像尺寸是608x608,特征图变化的规律是:608->304->152-><strong>76->38->19</strong>。</p>
<p><center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fc06a883c9ccdf7c90aff8efb14e53b5&file=file.png"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fc06a883c9ccdf7c90aff8efb14e53b5&file=file.png"</a>; width="80%" height="auto"></center></p>
<ul>
<li>
<p>CBL:由Conv+Bn+Leaky relu激活函数三者组成。</p>
</li>
<li>
<p>Focus:类似YOLO v2的passthrough,首先将多个slice结果Concat起来,然后将其送入CBL模块中。</p>
</li>
<li>
<p>Res unit-借鉴ResNet网络中的残差结构,用来构建深层网络。</p>
</li>
<li>
<p>CSP1 X:借鉴CSPNet网络结构,由CBL模块和X个Res unint模块Concate组成。</p>
</li>
<li>
<p>CSP2 X:不再用Res unint模块,而是改为CBL。</p>
</li>
<li>SPP:采用1x1,5x5,9x9,13x13的最大池化的方式,进行多尺度融合。</li>
</ul>
<h1>改进细节</h1>
<h2>1、 输入</h2>
<p>&emsp;&emsp;输入端主要对输入图片进行预处理,预处理主要是将输入图像缩放至网络的输入大小,并进行归一化等操作。v5与v4网络一样输入图像大小为608x608在网络训练阶段,Yolov5与Yolov4同样使用了<strong>Mosaic数据增强操作</strong>以提升模型的训练速度和网络精度;并提出了一种自适应锚框计算与自适应图片缩放方法。</p>
<h4>copy_paste 分割填补</h4>
<p>&emsp;&emsp;分割填补也是选取一对图片,将第一张图片的目标分割出来后,计算该目标边框与第二张图片(也就是被填补的图片)的所有目标边框的IoU值。在V5中两个边框IoU值 > 0.3就会被直接删除,只留下IoU < 0.3的分割边框。
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6d2fc11aeb335e91ef28905b9ea74e8a&file=file.jpg"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6d2fc11aeb335e91ef28905b9ea74e8a&file=file.jpg"</a>; width="65%" height="auto"></center></p>
<h4>自适应锚框计算</h4>
<h6>目的</h6>
<p>根据不同的数据集设置不同的anchor尺寸。</p>
<h6>V4</h6>
<p>&emsp;&emsp;对于不同的数据集,是使用<strong>单独的脚本进行初始anchor的计算</strong>。然后在训练时,网络会在anchor的基础上进行预测,输出预测框,再和标签框进行对比,最后就进行梯度的反向传播。</p>
<h6>V5</h6>
<p>&emsp;&emsp;在 YOLOv5 中,则是将anchor的计算嵌入到整个训练代码里中。所以在每次训练开始之前,它都会<strong>根据不同的数据集来自适应计算 anchor</strong>。主要思想是将图像转化到resize640大小的长宽比下,再进行kmeans 聚类,得到9个聚类中心,每个聚类中的包含(x,y)坐标就是需要的anchor。</p>
<h6>自适应的计算过程</h6>
<ol>
<li>获取数据集中所有目标的宽和高。</li>
<li>将每张图片中按照等比例缩放的方式到 resize 指定大小(一般都是640),这里保证宽高中的最大值符合指定大小。</li>
<li>将 bboxes 从相对坐标改成绝对坐标,这里乘以的是缩放后的宽和高</li>
<li>筛选 bboxes,保留宽高都大于等于两个像素的 bboxes(太小的不要)。</li>
<li>使用 k-means 聚类三方得到n个 anchors,与YOLOv3、YOLOv4 操作一样。</li>
<li>使用遗传算法随机对 anchors 的宽高进行变异。倘若变异后的效果好(使用anchor_fitness方法计算得到的fitness(适应度)进行评估),就将变异后的结果赋值给anchor;如果变异后效果变差就跳过,默认变异1000次。</li>
</ol>
<h2>backbone</h2>
<h4>Focus结构</h4>
<p>&emsp;&emsp;Focus模块在YOLOv5中是图片进入Backbone前,对图片进行切片操作,具体操作与v2的passthrough层的操作差不多(隔行隔列),也没有信息丢失,也可以将W(宽)、H(高)信息就集中到了通道空间。并且将输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。</p>
<h6>目的</h6>
<p>&emsp;&emsp;可以使信息在不丢失的情况下提高计算力</p>
<h6>例子</h6>
<p>&emsp;&emsp;以YOLOv5s为例,原始的608x608x3的图像输入Focus结构(Focus的输入tensor的形状是(b,c,w,h)),采用切片操作,先变成304x304x12的特征图,再经过一次卷积操作最终变成304x304x32的特征图。
切片操作如下:
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ce5d1ed53cd07ce3c5ef188441a2d9a9&file=file.jpg"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ce5d1ed53cd07ce3c5ef188441a2d9a9&file=file.jpg"</a>; width="65%" height="auto"></center></p>
<p>&emsp;&emsp;这一段是代码里如何实现隔行隔列切分的:
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3322aa5cbaf1e6f9992c38855b0e3d76&file=file.png"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3322aa5cbaf1e6f9992c38855b0e3d76&file=file.png"</a>; width="65%" height="auto"></center></p>
<h4>升级CSP结构</h4>
<h6>v4</h6>
<p>YOLOv4中只有在backbone中使用了CSP结构。
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=764c4ceb6949b526cd69d769d30c3a3e&file=file.png"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=764c4ceb6949b526cd69d769d30c3a3e&file=file.png"</a>; width="55%" height="auto"></center></p>
<h6>v5</h6>
<p>v5中有两种CSP结构,以YOLOv5s网络为例,CSP1_X结构应用于Backbone,另一种CSP2_X结构则应用于Neck中。</p>
<ul>
<li>CSP1 X:借鉴CSPNet网络结构(不懂的去看v4),由CBL模块和X个Res unint模块Concate组成。</li>
<li>CSP2 X:不再用Res unint模块,而是改为CBL。
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1ca868fded251a1268286b45a6a721e5&file=file.png"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1ca868fded251a1268286b45a6a721e5&file=file.png"</a>; width="65%" height="auto"></center></li>
</ul>
<h2>Neck</h2>
<h4>升级FPN+PAN结构</h4>
<h6>v4</h6>
<p>&emsp;&emsp;YOLOv5现在的Neck和YOLOv4中一样,都采用FPN+PAN的结构。但是在它的基础上做了一些改进操作:YOLOV4的Neck结构中,采用的都是普通的卷积操作</p>
<h6>v5</h6>
<p>&emsp;&emsp;YOLOv5现在的Neck和YOLOv4中一样,都采用FPN+PAN的结构。但YOLOV5的Neck中,采用CSPNet设计的CSP2_x结构,从而加强了网络特征融合能力。
&emsp;&emsp;下图展示了YOLOv4与YOLOv5的Neck网络的具体细节,通过比较我们可以发现:(1)灰色区域表示第1个不同点,YOLOv5不仅利用CSP2_1结构代替部分CBL模块,而且去掉了下方的CBL模块;(2)绿色区域表示第2个不同点,YOLOv5不仅将Concat操作之后的CBL模块更换为CSP2_1模块,而且更换了另外一个CBL模块的位置;(3)蓝色区域表示第3个不同点,YOLOv5中将原始的CBL模块更换为CSP2_1模块。
<center><img src="<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c9784a4c06e63e39d9965b1a4ca5833e&file=file.png"">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c9784a4c06e63e39d9965b1a4ca5833e&file=file.png"</a>; width="75%" height="auto"></center></p>
<h1>参考文献</h1>
<p>1、论文:没发表
2、项目代码:<a href="https://github.com/ultralytics/yolov5">https://github.com/ultralytics/yolov5</a>
数据增强jupyter代码:<a href="https://github.com/yyccR/yolov5_in_tf2_keras/blob/master/data/arguments_jupyter.ipynb">https://github.com/yyccR/yolov5_in_tf2_keras/blob/master/data/arguments_jupyter.ipynb</a>
3、哔哩哔哩讲解:<a href="https://www.bilibili.com/video/BV1JR4y1g77H?p=2&vd_source=1849d2ee495d14dd1f599261fc7679e3">https://www.bilibili.com/video/BV1JR4y1g77H?p=2&vd_source=1849d2ee495d14dd1f599261fc7679e3</a>
4、博客:<a href="https://cloud.tencent.com/developer/article/2406045">https://cloud.tencent.com/developer/article/2406045</a>
<a href="https://blog.csdn.net/xu1129005165/article/details/134076266">https://blog.csdn.net/xu1129005165/article/details/134076266</a>
<a href="https://blog.csdn.net/weixin_43334693/article/details/129312409">https://blog.csdn.net/weixin_43334693/article/details/129312409</a>
<a href="https://www.cnblogs.com/tian777/p/15352504.html">https://www.cnblogs.com/tian777/p/15352504.html</a>
<a href="https://blog.csdn.net/flyfish1986/article/details/115634582">https://blog.csdn.net/flyfish1986/article/details/115634582</a></p>