YOLO_v2讲解

一:YOLO_v2的改进

在这里插入图片描述
YOLO V2是YOLO系列的第二版,在YOLO V1的基础上加以改进,改善了YOLO V1定位不准的问题,以及对于重叠的物体极差的检测能力。同时,又保证了检测的速度,可谓集准确性与速度于一身(YOLO V2获得了CVPR2017的最佳论文提名)。YOLO V2的原文提出了两个模型:YOLO V2和YOLO9000,本文主要着重YOLO V2,想要了解YOLO_v1的友友可以看本人写的YOLO_v1详解,首先列出v2版本的几个改进之处

  • BN层取代了Dropout
  • 使用了高分辨率分类器
  • 使用Anchor思想
  • K-means选定先验框的尺寸
  • 使用YOLO_v1的策略,预测坐标相对于Grid Cell的位置
  • 细粒度的特征
  • 多尺度训练

下面,我将针对上述几个创新点,依次进行讲解。

二:网络细节

【BN层取代了Dropout】

在V1的基础上增加了BN层,位置在Conv层的后面,同时去掉了Dropout,增加BN层后,给YOLO 的mAP带来了2%的提升,也说明了BN的重要作用。本人在BN的理解中对BN层进行了详细讲解,在这里不再赘述。
在这里插入图片描述
在这里插入图片描述

【高分辨率分类器】

在训练物体检测任务时,会使用ImageNet上预训练的模型作为特征提取器,而其训练时,输入图像分辨率通常在224x224左右,而训练物体检测任务时,需要分辨率更大的图像(因为图像越大,越清晰,越容易检测上面的物体),这样就会造成两者在输入图像分辨率上的不一致;比如YOLO V1,在224x224大小的输入图像上训练检测模型,然后将图像分辨率提升至448x448,在检测数据集上Finetune。可以理解为检测顺应了分类的低分辨,所以必然对检测精度有较大影响

为了更好的适应分辨率的差异,YOLO V2选择先在ImageNet上Finetune高分辨率(448x448)的模型(10 epochs),然后再训练检测模型,可以理解为分类迎合了检测需要的高分辨率输入,这样就“弱化”了分类模型和检测模型在输入图像分辨率上的“不一致”使用高分辨率分类模型,给YOLO带来了4%的mAP提升。同时YOLO V2提出了新的网络结构DarkNet-19,顾名思义就是指19层卷积,具体的结构如下图所示:
在这里插入图片描述
DarkNet-19在ImageNet上Top1的准确率为72.9%,发现里面有很多1x1的Conv在Channel维度上压缩特征图。同时,总共进行了5次下采样,目的是扩大最终的feature map的大小,最终映射到原图上的cell更多。v1中是进行了6次下采样的,最后只有7×7,而v2可以达到13×13(对于输入416×416而言)。还有一点!!!DarkNet-19中没有FC层,都是卷积层!!这样也为后期的多尺度训练做了准备。

【Anchor思想】

YOLO V1没有Anchor的概念,而且候选框一共98个(7x7x2),所以可想而知,模型的Recall是个问题,所以YOLO V2为了增加Recall(如果连正确的框都没有检查出来,就更不用想着后续的优化了,所以需要增加Recall),使用了Anchor的概念,像Faster RCNN,一个Anchor会产生9个候选框,这样在YOLO V1的情况下,原本的98个框就变成了441(7x7x9)。

同时为了进一步增加候选框的数目,YOLO V2中最后用来预测的特征图尺寸是原图的1/32(YOLO V1是1/64),由于448 / 32 = 14,这样一来图像中心点是4个点(图7方便理解),这样就会导致在图像中心的物体的中心点落在4个Grid Cell中,不方便分配,所以作者把输入图像的尺寸改成了416(416/32=13),中心点只有一个。增加了Anchor的概念后,mAP由原来的69.5%降低到了69.2%,但是Recall从81%增加到88%,这也为后续的优化提供了可能性
在这里插入图片描述
举例说明为何选择13x13而不是14x14

【K-means选定先验框】

像Faster RCNN,Anchor产生的9个候选框是“人为”选择的(“瞎编”出来的),YOLO V2为了选择更合理的候选框,使用了聚类(K-means)的策略,选出最具有代表性的5个尺寸作为Anchor候选框的尺寸

K-means是聚类的方法,最后得到K个聚类中心以及每个样本属于哪个中心,其中K是聚类的个数,需要人为指定,其中使用“距离”来衡量每个样本与聚类中心的关系,通常使用欧式距离,但是对YOLO V2来说,需要选取框的尺寸,衡量的标准应该是“覆盖率”,所以YOLO V2利用IOU来计算,所以距离公式如下:

d(box, centroid) = 1 – IOU(box, centroid)(经过实验证明,K=5刚刚好,再大精度可能退化。)
在这里插入图片描述

同时YOLO V2虽然使用了Anchor的思想,而预测框的坐标时依然使用YOLO V1的策略,直接预测坐标相对于Grid Cell的位置,而不是Anchor Box与Ground Truth之间的Offset。下面会详细说明。

【预测坐标相对于Grid Cell的位置】

跟Faster RCNN相同的地方,YOLO V2使用了Anchor的概念,其中在处理W和H的部分基本一致,我们设置Anchor框的Wa和Ha,Ground Truth为W和H,那么最后回归的目标为:
在这里插入图片描述

这样避免了YOLO V1中直接回归W和H的尴尬。

与Faster RCNN不同的是,YOLO V2回归的目标没有选择Offset,而是选择YOLO V1的策略,我们这里回忆一下Faster RCNN是如何做的,我们设置Anchor的坐标Xa和Ya,Ground Truth的坐标为X和Y:

在这里插入图片描述

YOLO V2指出这种做法是存在风险的,什么风险呢,假设我们最后的预测结果为tx, ty, tw, th,那么最后预测的框的坐标为:

在这里插入图片描述

从上述公式发现,如果tx=1,那么最后的结果相对于Anchor向右偏移了1倍(同理,tx=-1,则是向左偏移了1倍),说明这种回归目标对取值范围“约束”很弱,这样最后得到的框会出现在图的任何位置,训练就很难稳定下来为了解决这个问题,YOLO V2沿用了V1的策略,直接预测坐标相对于Grid Cell的位置,计算公式如下:

在这里插入图片描述
其中x,y为物体的中心点坐标,分成SxS个Grid Cell,针对YOLO V2,S=13,width和height为原图的宽和高。

同时也说明了YOLO V2分配训练样本的策略与V1相同,物体的中心点落在哪个Grid Cell中,其对应的Anchor候选框负责这个物体。

【细粒度的特征】

其实就是为了增强网络对于小物体检测的能力,但提升效果不明显,这一缺点在v3版本中有巨大改进。

实际上有两种实现策略,原版和改进版。

原版:首先需要两个特征图26x26x512和13x13x1024,分成两步,1)26x26x512的特征图重组成13x13x2048的特征图;2)将13x13x2048的特征图与13x13x1024的特征图Concatenate,得到13x13x3072的特征图。

这里有个细节,“重组”是如何做的?我这里简单的用下图描述一下:
在这里插入图片描述
上图简单的描述了重组的过程,一个2x2x1的特征图变成了1x1x4的特征图,这个过程不涉及任何参数变量,所以重组后的特征图很好的保存了原特征图的信息。

改进版:改进版在原版的基础上增加了一次卷积操作,先将26x26x512的特征图变为26x26x64的特征图,然后再执行后续的操作。原版和改进版的对比图如下:
在这里插入图片描述

【多尺度训练】

为了适应不同尺寸的输入图片,YOLO V2采用了多尺度训练的策略,尺度的选择:从320到608,{320,352,…,608},每隔32选取一个尺度(其中320/32=10,与上文奇数尺寸相违背了,有些尴尬)。训练的时候,系统每隔10个batch,随机从这些候选尺度中选择一个进行训练。“多尺度”在目前的物体检测训练中,已经属于常见的操作了。、

三:损失函数

最后聊聊YOLO V2的损失函数,YOLO V2的整篇文章并没有给出损失函数的公式。YOLO V2的损失函数依然以“回归”为主,里面没有Cross Entropy Loss,全部都是L2-Loss,整体的感觉和YOLO V1很像,见下面的公式:
在这里插入图片描述

我们来一点点解释,首先W、H分别指的是特征图(13×13)的宽与高,而A指的是先验框数目(这里是5),各个 λ λ λ 是各个Loss部分的权重系数。

第一项loss是计算background的置信度误差,但是哪些预测框来预测背景呢,需要先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background,需要计算noobj的置信度误差。(不能是落有物体中心点的cell中的代表框,若它小于0.6也没办法,还是得代表某个类)

第二项是计算先验框与预测框的坐标误差,但是只在前12800个iterations间计算,我觉得这项应该是在训练前期使预测框快速学习到先验框的形状。

第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth

在计算obj置信度时,在YOLOv1中target=1,而YOLOv2增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。**对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。**这点在YOLOv3论文中也有相关说明:YOLO中一个ground truth只会与一个先验框匹配(IOU值最好的),对于那些IOU值超过一定阈值的先验框,其预测结果就忽略了。这和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框。

尽管YOLOv2和YOLOv1计算loss处理上有不同,但都是采用均方差来计算loss。另外需要注意的一点是,在计算boxes的和误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正:l.coord_scale * (2 - truth.w*truth.h),这样对于尺度较小的boxes其权重系数会更大一些,起到和YOLOv1计算平方根相似的效果(参考YOLO v2 损失函数源码分析)。

四:YOLO_v2的不足

  • 对于小目标的检测效果还是不理想
  • 5个anchors虽然增大了recall,但是准确度却下降不少,可见策略还是可以改进
  • backbone所用的Darknet-19虽然相对于YOLO_v1的有改进,但是还是不太OK

  至此我对YOLO_v2的原理,进行了简单讲解,希望对大家有所帮助,有不懂的地方或者建议,欢迎大家在下方留言评论。

我是努力在CV泥潭中摸爬滚打的江南咸鱼,我们一起努力,不留遗憾!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值