暑校


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> &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3add8c1bddba6519e408fbb803969930&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3add8c1bddba6519e408fbb803969930&amp;file=file.png&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <p>&amp;emsp;&amp;emsp;Yolov5的网络结构如下图所示,主要包括输入、Backbone骨干网络、Neck颈部结构和Head头部结构(Prediction)四个模块,分别负责输入图片预处理、特征提取、特征融合、输出检测信息。输入图像尺寸是608x608,特征图变化的规律是:608-&gt;304-&gt;152-&gt;<strong>76-&gt;38-&gt;19</strong>。</p> <p>&lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fc06a883c9ccdf7c90aff8efb14e53b5&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fc06a883c9ccdf7c90aff8efb14e53b5&amp;file=file.png&quot</a>; width=&quot;80%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</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>&amp;emsp;&amp;emsp;输入端主要对输入图片进行预处理,预处理主要是将输入图像缩放至网络的输入大小,并进行归一化等操作。v5与v4网络一样输入图像大小为608x608在网络训练阶段,Yolov5与Yolov4同样使用了<strong>Mosaic数据增强操作</strong>以提升模型的训练速度和网络精度;并提出了一种自适应锚框计算与自适应图片缩放方法。</p> <h4>copy_paste 分割填补</h4> <p>&amp;emsp;&amp;emsp;分割填补也是选取一对图片,将第一张图片的目标分割出来后,计算该目标边框与第二张图片(也就是被填补的图片)的所有目标边框的IoU值。在V5中两个边框IoU值 &gt; 0.3就会被直接删除,只留下IoU &lt; 0.3的分割边框。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6d2fc11aeb335e91ef28905b9ea74e8a&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6d2fc11aeb335e91ef28905b9ea74e8a&amp;file=file.jpg&quot</a>; width=&quot;65%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h4>自适应锚框计算</h4> <h6>目的</h6> <p>根据不同的数据集设置不同的anchor尺寸。</p> <h6>V4</h6> <p>&amp;emsp;&amp;emsp;对于不同的数据集,是使用<strong>单独的脚本进行初始anchor的计算</strong>。然后在训练时,网络会在anchor的基础上进行预测,输出预测框,再和标签框进行对比,最后就进行梯度的反向传播。</p> <h6>V5</h6> <p>&amp;emsp;&amp;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>&amp;emsp;&amp;emsp;Focus模块在YOLOv5中是图片进入Backbone前,对图片进行切片操作,具体操作与v2的passthrough层的操作差不多(隔行隔列),也没有信息丢失,也可以将W(宽)、H(高)信息就集中到了通道空间。并且将输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。</p> <h6>目的</h6> <p>&amp;emsp;&amp;emsp;可以使信息在不丢失的情况下提高计算力</p> <h6>例子</h6> <p>&amp;emsp;&amp;emsp;以YOLOv5s为例,原始的608x608x3的图像输入Focus结构(Focus的输入tensor的形状是(b,c,w,h)),采用切片操作,先变成304x304x12的特征图,再经过一次卷积操作最终变成304x304x32的特征图。 切片操作如下: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ce5d1ed53cd07ce3c5ef188441a2d9a9&amp;file=file.jpg&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ce5d1ed53cd07ce3c5ef188441a2d9a9&amp;file=file.jpg&quot</a>; width=&quot;65%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <p>&amp;emsp;&amp;emsp;这一段是代码里如何实现隔行隔列切分的: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3322aa5cbaf1e6f9992c38855b0e3d76&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3322aa5cbaf1e6f9992c38855b0e3d76&amp;file=file.png&quot</a>; width=&quot;65%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h4>升级CSP结构</h4> <h6>v4</h6> <p>YOLOv4中只有在backbone中使用了CSP结构。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=764c4ceb6949b526cd69d769d30c3a3e&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=764c4ceb6949b526cd69d769d30c3a3e&amp;file=file.png&quot</a>; width=&quot;55%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</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。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1ca868fded251a1268286b45a6a721e5&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1ca868fded251a1268286b45a6a721e5&amp;file=file.png&quot</a>; width=&quot;65%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</li> </ul> <h2>Neck</h2> <h4>升级FPN+PAN结构</h4> <h6>v4</h6> <p>&amp;emsp;&amp;emsp;YOLOv5现在的Neck和YOLOv4中一样,都采用FPN+PAN的结构。但是在它的基础上做了一些改进操作:YOLOV4的Neck结构中,采用的都是普通的卷积操作</p> <h6>v5</h6> <p>&amp;emsp;&amp;emsp;YOLOv5现在的Neck和YOLOv4中一样,都采用FPN+PAN的结构。但YOLOV5的Neck中,采用CSPNet设计的CSP2_x结构,从而加强了网络特征融合能力。 &amp;emsp;&amp;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模块。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c9784a4c06e63e39d9965b1a4ca5833e&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c9784a4c06e63e39d9965b1a4ca5833e&amp;file=file.png&quot</a>; width=&quot;75%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</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&amp;vd_source=1849d2ee495d14dd1f599261fc7679e3">https://www.bilibili.com/video/BV1JR4y1g77H?p=2&amp;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>

页面列表

ITEM_HTML