(注意:本篇内容基于Bilibili 作者 coward咿呀咿的《这才是科研人该学的【YOLO算法全系列】,一口气学完目标检测yolov1-v11,100集算法原理+项目实战,通俗易懂,草履虫都能轻松学会!机器学习|深度学习》(BV1QcmdYiEce),本篇中涉及的图片大部分为其中视频截取,包括在论文中截取。不涉及盈利目的仅供共同学习,由于本篇作者也是初学者,如在概念中,内容中出现问题的以原课程视频或原论文为基准,也请大家多多指教,后边也会慢慢更新学习的内容。)
一、YOLO 基础指标概念和计算
传统算法(如Fast R-CNN 及其类似改良的模型,学习课程中提到了一个实用通用框架 MaskRCNN后续可以了解一下)属于two-stage类型,速度相对较慢, 相对于YOLO来说多了一个去划分候选区域的步骤(RPN,全称Region Proposal Network )。而YOLO属于one-stage类型(或称end-to-end model),这种特性使得YOLO能够较大程度的提高了速度,适合实时检测,而相对降低了准确的程度。
指标分析
(1)mAP:综合衡量检测效果。需结合精度和召回率进行计算。
(2)IoU:交并比==区域交集/区域并集。
(3)Precision(精度),Recall(召回率/查全率):
其中TP FP分别对应True Positives(正类判定为正类)/False Positives(负类判定为正类)
FN TN 分别对应 False Negatives(正类判定为负类)/True Negatives(负类判定为负类)
(4)置信度:该框内为某物体的概率,设置置信度阈值后,低于该阈值的候选框直接被忽视,相对应会降低Recall也就是查全率,因为忽视会提高FN的数值。
通常来说,精度越高,召回率会相对越低,而当我们绘制出精度和查重率的关系图之后,计算曲线下方的面积就可以得到mAP值(即下方右边图片,计算的是区域最大的值),理想的mAP值应该接近于1。
二、YOLO-V1整体思想和网络架构
图为早期的各模型的比较,YOLO相较于R-CNN及衍生的模型来说,FPS值得到明显的提高,其在实时检测方面具有很大优势。
1.YOLO的核心思想
先将图片划分为S*S个单元格(图中演示预设S=7),然后在每个格子处对可能存在的物体进行预测,产生两种候选框(图中画出的两个黄色方框),我们要通过计算得到这个框对应的(x,y,w,h)即为Bounding Boxes 。后边图中Confidence指置信度,即对于这个预测产生的候选框,表示其包围的区域中对象是物体的可能性。过滤低置信度的候选框,选择高置信度的候选框并且进行一些微调后,计算出最终的候选框对应的(x,y,w,h),最后得到如最右边图片的形式。
2.YOLO-V1网络架构
(注意:输入图像的格式为什么受限?是因为全连接层的特性,其输入必须为固定的大小,在后边改良的YOLO版本中问题得以解决,目前学习是针对V1。)
图中红色框选的部分当下不需太重视,将其视作统一的卷积神经网络整体就行,经过这个卷积神经网络可以提取出一个特征图。特征图经过全连接层得到了一个7*7*30的结果,详细分析一下这个结果各个数字的来源:
7*7为最初我们提到的图片,将其分割成为了7*7个单元格,然后我们对于每个单元格进行了两种预测,即划分了两个候选框B1,B2,那么其中B1包含了五个属性x1,y1,w1,h1,c1,前面四个为相对位置(后面会讲,是经过归一化算出来的表示在图片中所处相对位置的属性),c则指confidence,即置信度。从而加上B2包含的这五种属性后一共得到了10种属性,那30去掉这10个后剩余的20个属性又是什么?其实是指20个类别,类别比如说图中狗为一个类别,自行车为一个.类别,是这个候选框属于20个类别分别的概率。以上的属性构成了这个30。
我们如何让计算机给予我们想要的结果?(如例子中的7*7*20的结果)--->>
3.损失函数
(1)位置误差方面:S²表示每个位置,B表示的是每个位置产生的bounding box(在当前讲述的版本中指两个)(画红框的符号指的是在i这个位置,选取那个IoU值较大的即第j个bounding box),相减部分是指真实值减去预测值,而为什么在w,h求差的时候要套上根号,原因是在现实情况中,图片中对象有大有小,对于大的对象,预测的框与实际的框之间若假设只有一单位的差距,相对于大的对象就不会造成很大影响,而如果针对整个w或h只有两单位的小对象,那么这个差距就会显得很大。对于带根号的变量,当变量较小时,大小的变化对于整体值的变化影响比较大,而当变量处于较大值时,大小的变化相对来说对于整体值的变化影响就变小了,符合前面提到的大小对象的影响变化趋势。
(2)置信度误差:同样是针对超过所设置阈值且置信度较高的候选框,使其与我们理想的置信度(如1,0,依据我们计算的是含有/不含有object进行调整)进行作差。在不含object部分的表达式前面还加上了一个权重,是因为在实际情况中,不含有object的情况要远多于含有的情况,所以应该调整一下其权重避免过度影响整体。
(3)分类误差:与以上同理,采用的是实际的概率和我们预测出来的概率。
最后将以上几个加起来就得到了我们YOLO-v1的整体loss。
(小补充:NMS,即非极大值抑制,选择超过置信度阈值的置信度最高的框,其他的忽视)
总结整体问题:对于每个位置仅预测两个bbox,长宽设定有限,无法解决识别重叠且具有多个标签的对象的问题。
三、YOLO-V2的改进细节详解
1.概述
YOLO-V2版本舍弃了Dropout(一种防止过拟合的正则化技术),卷积后全部加入Batch Normalization(批量归一化),网络每一层的输入都做了归一化处理,这使得收敛相对更容易。提升了模型的mAP值。
关于分辨率方面,V1模型可能考虑到当时计算机性能的问题,训练时使用224*224,测试时使用448*448,可能导致模型水土不服出现问题。而在V2版本训练时,前期可以使用224*224的但在最后会额外进行10次448*448的微调。使用高分辨率分类器后使得模型的mAP值得以提升。
网络结构中没有全连接层,经历了五次池化降采样(图中Maxpool),故假设实际大小为416*416(Darknet实际输入),经过五次后应让h,w都除以2的五次方即32,最终得到实际特征图的结果为13*13。为什么是416*416,首先希望这个大小能够被32整除,再一个希望除出来的结果是一个奇数,以便使其实际拥有一个中心位置。
其中1*1的卷积节省了很多参数。
卷积核比较小,感受野比较大。
2.聚类先验框
在Faster R-CNN中,先验框的比例是固定的,人为划分了例如1:1,2:1等等的比例,这会导致和数据集的拟合程度低。
故在YOLO-V2中采用了聚类先验框的方法,一般规定K=5,然后对数据集中的实际框进行聚类划分划分为5类。
K=5的来源如左图,理论上划分的类越多,平均IoU会越高,但是考虑到实际应用问题,就取用一个折中的K=5。(相较于V1的B=2有了提高)
K-means聚类中的距离公式:
(公式中的centroids意为中心点)
采用anchor boxes之后虽然mAP值不会得到明显的提升,但是其recall值即查全率会得到提高,总体来说效果仍是不错的。
3.偏移量计算方法
最初的版本计算偏移量方法:令中心为(xp,yp);宽和高为(wp,hp),则
若tx=1,则使候选框向右平移wp,若tx=-1,则向左平移wp。
这种方法会对收敛造成影响,模型不稳定,模型中最初的权重和参数如果来源随机,则会导致偏移得过分随机。对此V2选择了另一种方法 即Directed Location Prediction。公式如下
(图中带红色框的符号指的是sigmoid符号 大意为一个值域为(0,1)的函数)
结合此图可知,这个做法使得偏移的量不超过一个网格的大小,从而使得偏移更加可控,注意该公式算出来的是在特征图中的相对位置,若要算出在实际输入图像中的位置的话需要再将算出来的每个参数去乘上32。
4.感受野
概括地说,感受野就是指特征图上的一个点能看到原始图像多大的区域。
图示为输入图像经过两个3*3的卷积核 使得特征图1*1的大小可以看到原始图像5*5的大小。
思考一个问题:那么假设我使用三个3*3的卷积核和使用一个7*7的卷积核最后得到的结果是相同的,那为什么我们还要堆叠三个卷积核呢?
解决这个问题的关键在于我们去量化这两个方法所需要的参数量:
假设我们的输入大小都是h*w*c,都经过c个卷积核(即生成c个特征图),那么我们分别使用以上提到的两个方法计算参数值:
3*C*(3*3*C)=27C² C*(7*7*C)=49C²
从上面的计算可以发现堆叠小的卷积核所需要的参数较少,且堆叠的卷积核更多可以更好地提取特征,这就是VGG网络的基本出发点,用小的卷积核来完成提特征提取过程。
到这里我们再去思考一个问题:直到我们得到了这个最后的特征图后,我们选取图上的一个小点都可能代表着原始图像上很大的一个区域,那么我们如果这个时候想要提取原始图像上一个较小的物体目标,是不是不太方便呢?
那么我们就引进一个V2的改进措施,称为Fine-Grained Features
大体过程如上图所示,我们可以知道未经过卷积的原始输入大小为26*26*512,经过卷积后得到了13*13*1024大小的特征图,此时这个特征图就存在着我们上面所提出的问题,这时为了解决这个问题,我们在未卷积时便进行分割,得到了4*13*13*512的图像,再通过与卷积后的结果进行叠加最终得到了一个13*13*3072的特征图,这个特征图就相较于原来我们卷积得到的结果更加全面,能够更好地得到原始图像中小对象的特征。
5.Multi-Scale
前面提到,因为在YOLO-V1中,我们的网络结构中仍存在着全连接层,全连接层限制了我们输入的大小。而在V2版本中我们去除了全连接层,理论上不需要受到限制。于是我们可以改变输入图像的大小。举例最初最小的大小为320*320,经过几次迭代后我们可以到达352*352...最大到达608*608(尺寸严格遵循长宽都可以整除32)
四、YOLO-V3改进详解
1.多Scale
前面我们提到,YOLOv1对于一个位置会产生两个候选框,而到了YOLOv2为了提高候选框的适配性,我们进行了聚类先验框,将候选框数量提高到了五个。到了YOLOv3,将这个数量提高到了九个,即分为三个比例scale,按特征图感受野从小到大为52*52,26*26,13*13,并且对于每个Scale再分为三个大小,使得候选框数量进一步提高,准确性匹配性得以提高。
但是问题来了,难道我们使用的三个大小是直接从卷积网络中提取对应大小的特征图来使用吗?
当然不合适,因为相较于卷积网络中直接的26*26的特征图,可能其特征提取还处于一个模糊的状态,对于52*52更是如此,可能会很大程度影响我们的匹配过程。于是我们便引入一种特征融合的变换方法。如图所示,我们将对应大小的特征图提取出来之后,需要将13*13即感受野最大的特征图进行上采样,然后再与26*26的特征图进行融合。
2.残差连接方法
YOLO-v3使用了resnet的思想,由于当时人们试图通过不断堆叠卷积层从而不断提升准确率,但经过实验发现了到达19层,20层左右时就已经达到了一个“极限”,即再往上增加堆叠的层数量可能还反而导致了准确率的下降。故该残差连接思想应运而生,简单来说就是在保留原来的结果后,继续进行激活并且卷积,最后将卷积得到的结果同原来的结果进行连接,这样就会使得结果即使经过卷积后并不比原来好,但是仍然保留了原有的基础。
3.整体网络架构
前面我们提到了在v2版本中我们舍弃了全连接层,在v3版本中我们不再使用池化层(Maxpool),下采样操作转而使用Stride=2来实现。实现了更多的先验框,并且引入了当时最先进的一些思想,包括图中的Residual,也就是残差连接。以及前面提到的对于多scale的特征融合方法,如图中concat(连接)的部分。
4.先验框设计改进
这部分跟上面的scale内容基本一致,一图解决。
5.softmax层的改进
在原本版本的softmax层,我们通常只能锁定一个最大的类别,但是现实中一个物体可能有多个类别多个标签,于是在v3中采用了logistic激活函数来进行改进,这样能够预测每个类别是或不是,大概的原理就是通过设定一个阈值,对于每个类别的概率进行比较,如果大于这个阈值则可以被选为标签。
--------------------------------以上则为最初的概念部分,下面过渡到实战部分----------------------------------