暑校


2、yolo系列-yolov1

<h1>目标识别</h1> <p>目标识别是一种常见的计算机视觉技术,一般用于在图片中识别并定位特定类别的物体。简单来说目标识别就是在解决这样的问题:</p> <ul> <li>图片中有什么物体?</li> <li>它们在哪里? <h2>名字由来</h2> <p>YOLO (You Only Look Once: Unified, Real-Time Object Detection),是Joseph Redmon和AliFarhadi等人于2015年提出的基于单个神经网络的目标检测系统。 (1)YOLO系列模型特点 &amp;emsp;&amp;emsp;YOLO系列模型主要特点就是快。这也为YOLO模型限定了应用场景,在很多对实时性要求高的场景下,显然YOLO系列模型是一个十分不错的选择。模型的速度与性能,也是两个难以同时兼顾的目标。YOLO模型很快,但是相对于很多two-stage(就是需要经过预选的)模型来说,其性能就会差一些,在对模型性能要求极高的场景中,YOLO模型就不一定适合了;同样在很多实时性要求高的场景中,two-stage模型也不一定适合。 (2)YOLO时间线 &amp;emsp;&amp;emsp;截至现在已经诞生了许多版本的YOLO,包括YOLO V1、YOLO 9000、YOLO V2、YOLO V3、YOLO V4、Scaled YOLO V4、PP-YOLO、YOLO V5、YOLO V6、YOLOX、YOLOR、PP-YOLO V2、DAMO YOLO、PP-YOLOE、YOLO V7、YOLO V6、YOLO V8、YOLO-NAS、YOLO V9以及YOLO v10。</p> <pre><code class="language-c">什么是two-stage和one-stage? two-stage:先提取出可能包含目标的区域(定位),再依次对每个区域进行识别,最终经过处理得到最终的检测结果; two-stage:提取候选区域(定位)和逐一识别可以在一个网络内完成,不需要分开。</code></pre> <h2>YOLO算法的核心思想</h2> <p>YOLO系列的核心思想就是把目标检测转变为一个回归问题,利用整张图片作为网络的输入,通过神经网络,得到边界框的位置及其所属的类别。算法的步骤可以分为以下几步: (1)划分图像:YOLO将输入图像划分为一个固定大小的网格。 (2)预测边界框和类别:对于每个网格,YOLO预测出固定数量(通常为5个或3个)的边界框。每个边界框由5个主要属性描述:边界框的位置(中心坐标和宽高)和边界框包含的目标的置信度(confidence)。此外,每个边界框还预测目标的类别。 (3)单次前向传递:YOLO通过一个卷积神经网络(CNN)进行单次前向传递,同时预测所有边界框的位置和类别。相比于其他目标检测算法,如基于滑动窗口或区域提议的方法,YOLO具有更快的速度,因为它只需要一次前向传递即可完成预测。 (4)损失函数:YOLO使用多任务损失函数来训练网络。该损失函数包括位置损失、置信度损失和类别损失。位置损失衡量预测边界框和真实边界框之间的位置差异。置信度损失衡量边界框是否正确地预测了目标,并惩罚背景框的置信度。类别损失衡量目标类别的预测准确性。 (5)非最大抑制(Non-Maximum Suppression):在预测的边界框中,可能存在多个相互重叠的框,代表同一个目标。为了消除冗余的边界框,YOLO使用非最大抑制算法,根据置信度和重叠程度筛选出最佳的边界框。</p></li> </ul> <h1>YOLO v1</h1> <h2>1、目标</h2> <p>提高检测速度</p> <h2>2. <strong>网络结构</strong>:</h2> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2b243cf9fee07b0c9e20aa1194e409ed&amp;amp;file=file.png" alt="" /></p> <ul> <li>输入:448x448x3的彩色图片</li> <li>中间层(backbone):由24个卷积层和最大池化层组成,用于提取图片的抽象特征</li> <li>全连接层:由两个全连接层组成,用来预测目标的位置和类别的概率值</li> <li>输出:7x7x30大小的张量</li> </ul> <h2>3. <strong>实现细节</strong>:</h2> <ol> <li>YOLO将目标检测问题作为回归问题。将输入图像分成S×S个网格,如果一个物体的中心点落入到一个网格中,那么该网格就要负责预测该物体,一个格子只能预测一个物体,一个格子会生成两个预测框。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b7766154d18ef35b4e30c97f851f232f&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b7766154d18ef35b4e30c97f851f232f&amp;file=file.png&quot</a>; width=&quot;60%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</li> </ol> <p>这里需要穿插几个概念: (1) <strong>grid cell:</strong>就相当于划分好的网格,比如说YOLOv1是将图片分成7x7的网格,然后这49个网格的每一个就是一个grid cell。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=14b511c4dd3e562e4f97b9a789baf1a9&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=14b511c4dd3e562e4f97b9a789baf1a9&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <p>(2)<strong>bounding box:</strong>一个gird cell为中心在上面生成的两个预测框,这两个黄色预测框就是bounding box。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ee144f323f267c9dccef38eaa73e4a3b&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ee144f323f267c9dccef38eaa73e4a3b&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h4>具体实现过程可以分为以下几步:</h4> <h6>v1会输出一个<em>S x S x (B x (x,y,w,h,c) + C)</em>大小的张量</h6> <p>(1)将一幅图像分成SxS个网格(grid cell),如果某个物体(object)的中心落在这个网格中,则这个网络就负责预测这个物体。</p> <p>(2)每个网格都要预测B个预测框,每个预测框都包含五个元素(x,y,w,h,c)。也就是两个坐标、宽、高和置信度。<strong>这里要注意的是x,y不是具体的坐标,而是经过归一化以后相较于整幅图像的值,取值一般是0-1之间。</strong></p> <ul> <li> <p>x,y:是指预测框的中心坐标(红点和蓝点)相较于该预测框归属的网格左上角(绿点)的偏移量,<em>在0-1之间</em>。在下面这张图中绿色虚线框代表一个网格,绿点表示该网格的左上角坐标,为(0,0)。红色和蓝色框代表该grid cell包含的两个bounding box,红点和蓝点表示这两个bounding box的中心坐标。这里还需要注意一点的是bounding box的中心坐标一定在它归属grid cell内部,也就是这个绿色框框的内部。因此,红点和蓝点的坐标可以归一化在0-1之间。在上图中,红点的坐标为(0.5,0.5),即x=y=0.5,蓝点的坐标为(0.9,0.9),即x=y=0.9。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=aa6a8eed59f095909e20bfc404e0b602&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=aa6a8eed59f095909e20bfc404e0b602&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> </li> <li> <p>w,h:就是预测框的宽和高,但也归一化到了0-1之间,表示相较于原始图像的宽和高(这里以448 x 448大小的图像举例)。比如下面右边这张图bounding box预测的框宽是44.8个像素,高是89.6个像素,则w=0.1,h=0.2。(存疑) &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6b577abc84d2658547ee00d4c2a1d4da&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6b577abc84d2658547ee00d4c2a1d4da&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> </li> <li>c:这个c其实就是confidence(置信度),这个置信度有两重含义:1、所预测的box中含有是否含有物体的置信度(其中如果有ground true box(人工标记的边界框)的中心点落在一个网格里,第一项取1,否则取0。)2、预测框与ground true box(人工标记的物体)之间的IoU值。具体公式如下面图片所示: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3fed07c3f71da87cd390227a89e29aaa&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3fed07c3f71da87cd390227a89e29aaa&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</li> </ul> <p>(3)不管框B(也就是预测框)的数量是多少,每个预测框只负责预测一个目标。</p> <p>(4)预测C个条件概率类别(物体属于每一种类别的可能性),在YOLO V1里只预测20中类别。</p> <p>(5)所以YOLO V1的输出如下图所示,可以表示成7×7×(5×2+20),具体解释是一共划分成7×7个网格,5是每个网格都有的五个参数也就是(x,y,w,h,c),2是两个预测的预测框,20是分类的类别数。所以输出的特征图经过reshape以后刚好就是1470. &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7a7b12c9cf0ebf720eda50dcd7796461&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7a7b12c9cf0ebf720eda50dcd7796461&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt;</p> <h2>3. <strong>目标损失函数</strong>:</h2> <p>损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失。具体函数如下图所示: &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a305f915eb84def11615a020e46ad414&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a305f915eb84def11615a020e46ad414&amp;file=file.png&quot</a>; width=&quot;50%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt; <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f32ba0e9c28978f28b27879ea39d1c79&amp;amp;file=file.png" alt="" /> (1)首先我们先看坐标预测损失也就是上面图中的黑色部分,首先黑色第一行是负责检测物体的框中心点(x, y)定位误差。第二行是负责检测物体的框的高宽(w,h)定位误差。<strong>这里需要注意的是w,h加了一个根号</strong>,因为bounding box会有大小的分别。如下图所示大框和小框的bounding box(红色的框)和实际上真实的目标区域(蓝色的框)都是只差了一点,但对于实际预测来讲,大框(大目标)差的这一点也许没啥事儿,而小框(小目标)差的这一点可能就会导致bounding box的方框和目标差了很远。而如果还是使用第一项那样直接算平方和误差,就相当于把大框和小框一视同仁了,这样显然不合理。而如果使用开根号处理,就会一定程度上改善这一问题。 &lt;center&gt;&lt;img src=&quot;<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4913b12911a58f07731aeccf1b99acbf&amp;file=file.png&quot">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4913b12911a58f07731aeccf1b99acbf&amp;file=file.png&quot</a>; width=&quot;30%&quot; height=&quot;auto&quot;&gt;&lt;/center&gt; (2)置信度损失也是分为两部分,也就是上面图中的红色部分公式。首先是第一行是负责检测物体的那个框的置信度误差,图中的绿色部分第i个grid cell的第j个bounding box负责预测目标时,这个值就为1,否则就为0。第二行就是不负责检测物体的那个框的置信度误差。在每个图像中,许多网格单元不包含任何目标值。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,所以需要减少了不包含目标的框的置信度预测的损失,比第一行新加了一个权重。 (3)图中最后一个黄色部分的函数是负责检测物体的grid cell分类的误差。</p> <h2>3. <strong>NMS非极大值抑制</strong>:</h2> <p>NMS算法主要解决的是一个目标被多次检测的问题,意义主要在于在一个区域里交叠的很多框选一个最优的。 NMS算法可以被简要描述成这样:首先先从所有的bounding box中拿出置信度最大的那个框,剩下的每一个框都与它做比较,如果两者的IoU大于某个阈值,则认为这俩框重复识别了同一个物体,就将其中低概率的重置成0;然后对然后对剩余的检测框重复上述过程,直到处理完所有的检测框。(这里介绍一下IOU: IOU是两个区域重叠的部分除以两个区域的集合部分得出的结果)</p> <h2>4. <strong>性能表现</strong>:</h2> <p>(1)YOLO V1划分为7x7的网格,当两个物体靠的很近时(挨在一起且中点都落在同一个格子上的情况),效果比较差 (2)每个网格只对应两个bounding box,当物体的长宽比不常见,也就是训练数据集覆盖不到时,效果就会比较差。 (3)最终每个网格只对应一个类别,容易出现物体没有被识别到的情况。</p> <h2>4. <strong>参考文献</strong>:</h2> <p>(1)YOLO V1论文:<a href="https://arxiv.org/abs/1506.02640">https://arxiv.org/abs/1506.02640</a> (2)腾讯云开发者社区:<a href="https://cloud.tencent.com/developer/article/2406045">https://cloud.tencent.com/developer/article/2406045</a> (3)Github源码地址:mirrors / alexeyab / darknet · GitCode</p>

页面列表

ITEM_HTML