论文(2) YOLO v2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GZHermit/article/details/80320641

YOLO v2

@(目标检测)
YOLO通过整合备选框选择和特征检测两个部分,成功的实现了end-to-end的训练,降低了复杂度并且减少了计算量,达到了实时的效果。但是仍然拥有缺陷:

定位误差,YOLO采用的网络结构中含有全连接层,使得输入图片分辨率固定,对物体尺寸不敏感,大量的位置信息被丢失掉。并且在最后一层中,每个grid里面只预测两个obj,一个类,这让YOLO网络天然对存在大量obj的图片难以准确检测。

如何解决这个问题,就是YOLOv2的工作。下面将一一列举YOLOv2的改进。


Batch Normalization

batch normalization的应用已经得到了很多经典网络的肯定,现在基本上成为标配。YOLOv1中并没有引入,所以在YOLOv2中加入网络,使得网络的收敛更快更稳定。至于batch normalization为何有效,这里简单提一下。神经网络的每一层输出,由于网络权重,都会导致数据的分布发生变化。这会对学习造成困难,因此每一层加上BN,使得每一层的输出和上一层的输出的分布保持一致。详情参见Batch Normalization

High Resolution Classifier

YOLO的训练分成两部分,第一部分是用ImageNet通过分类任务训练特征提取器,第二部分是用CoCo,VOC通过检测任务来对网络做fine-tuning。在v2中,第一部分里使用448×448而不是224×224的图片训练网络,高分辨率的样本进行训练会使得网络的检测效果更好,这一点显而易见。(更多的特征信息可以被学习)

Convolutional With Anchor Box

YOLOv1中最被诟病的region层被改变了,首先看一下两种结构对比。
enter image description here

(特别提示,YOLOv1和v2中x,y,w,h的含义不一样,v1中是坐标,而v2中是偏差,详情见Anchor box

可以发现,YOLOv1中每一个grid可以预测的obj的数量为B(B=2)个,并且在预测的时候每个grid实际上只输出一个BB(bounding box),而YOLOv2上升到了K(K=5)个,并且BB们会独立预测所属类,一个grid里面可以对多个不同类的物体做预测。比如这样的图片。
这里写图片描述

更多的预测框意味着检测结果的Precsion下降,而Recall[1]上升,但是根据论文结果,Precsion从69.5%下降到69.2%,Recall由81%提升到了88%。所以这一方法是行之有效,并且精度方面仍然存在改进空间(然后YOLOv3就这么做了)。

作者观察到,大物体通常占据了图像的中间位置,所以将图片的尺寸从448×448变为了416×416,这样做是为了让网络里所有卷积层产生的特征图,尺寸都为奇数,从而使得在预测物体位置的时候只需要中间位置的一个grid,而不是四个grid。

Anchor Box

anchor box是在RCNN系列中被使用的,使用这个结构的原因是为了在一个grid里面能够预测多个不同类别的目标。而且,一般地,同一种对象,他们的框子基本属于同一种比例,比如人的检测框往往是瘦长的,而车辆的检测框要么是宽扁的,要么是方形的。所以为了获得更加精确的检测框,我们可以先精选出不同种类物体的典型检测框,然后在这个基础上进行修改。在YOLOv2中,我们精选出来的检测框数量为K(K=5)个,这个K值是YOLO的作者试出来的,下面将会介绍。所以对于每一个grid,其特征向量的长度为(5+C)×K,即[pc,bx,by,bw,bh,c1,...,cCK,......,pc,bx,by,bw,bh,c1,...,cC]

关于Anchor box的资料找了好久啊,才在RCNN里面的支持材料里面找到。
这个东西叫做Bounding Box Regression。首先我们看看直接预测(x,y,w,h)有什么不好的地方呢?
这里写图片描述
还记得YOLO是怎么算loss的嘛。如果你有一个预测框,而图像中有多个GT框,那么你是跟哪个GT框算loss呢?答案是在IoU超过0.5的情况下,跟IoU最大的那个。现在来看上面这个图,我们会觉得这个模型预测飞机基本可以了,但是在模型看来,它预测出来的框和GT框的IoU没有达到0.5,直接预测失败,给了模型一个大的loss回去迭代了,极端点就是本来快收敛了,又搞这么几下,迭代回去了。那么如果我们能再调整一下这个预测框的长宽大小和比例的话,使得这个框子更加接近GT框,我们就不需要对模型进行大的调整,这样精度更高收敛速度更快。Bounding Box Regression就是来调整这个框子的位置,使其更加准确的。
这里写图片描述
我们的目的就是,给定P=(Px,Py,Pw,Ph)G=(Gx,Gy,Gw,Gh),寻找一种映射f,使得f(P)=G^,G^=(G^x,G^y,G^w,G^h),达到G^G

那么这个映射应该是个什么样子呢?什么样的映射可以使得一个size的框变成另一个size的框?
最容易想到的就是平移加变换。平移框子中心坐标(x,y),放缩框子尺寸(w,h)。所以RCNN给出了公式如下。

G^x=Pwdx(P)+Px,(1)G^y=Phdy(P)+Py,(2)G^w=Pwexp(dw(P)),(3)G^h=Phexp(dh(P)),(4)

我们来分析一下为什么公式这么定义。

首先这个P是什么?
enter image description here
P不是上面说的那个四个坐标,而是RCNN的Pool5 feature(特征向量),d()表示参数化的函数,而d(P),(x,y,w,h)表示对其参数化后得到的变换。

dx(p)Δxxdy(p)Δxydw(p)Swwdh(p)Shh

先说(1)(2)两个公式,也许有人会问为什么要加上PwPh,直接回归偏移不好吗?不好的地方在这。CNN具有尺寸不变性,也就是说一个物体,无论是大还是小,从它身上提取出来的特征应该始终不变。如果直接回归偏移,那么对于一个大物体,它的特征设为ϕ,那么dx(ϕ)=GxPx,假设已经完全精确。现在把这个物体缩小,CNN从中提取的特征是不变的,仍然为ϕ,那么对于这个小物体的预测框坐标x的回归,偏移仍然是dx(ϕ)=GxPx,这显然是不对的。所以要乘上PwPh,使其等比例放缩偏差。
这里写图片描述
再说(3)(4)两个公式,为什么用ex函数,有人说这是为了保持放缩系数始终大于0。我个人看法不是这样,不然为什么不用平方呢?论文里面说的很清楚,这是为了把变换拉入log-space中。所以在这里使用了指数。为什么呢?翔宇大大说得好,log函数的特点是在定义域位于(0, 1)之间,值域很敏感,定义域在(1,+)时,越大越不敏感。在目标检测中对于大目标,如果你的预测框大一点或者小一点,IoU不会降得太多,而对于小目标,框子大小就变得非常重要了。可以想象一个特别小的物体,只有一个像素大小,那么框子稍微偏一点,或者大一点,IoU就会降低至接近于0。

所以最后的我们回归的变换公式就是: