YOLO9000
摘要
Better
YOLO有很多缺点,比如定位错误很严重;比如和region-besed的方法相比,召回率很低。因此,本文着重于在保证分类准确率的前提下,提高召回率和定位准确性。
本文做出的一些改进见table2:
Batch Normalization
- 在每个卷积层后面加了BN层之后,模型收敛速度有了很大提升,就不需要别的正则化方法了;可以regularize 模型;
- 可以去掉了YOLO1中使用的dropout方法,模型也不会过拟合。
效果:mAP提升了2%
High Resolution Classifier
YOLO1训练的时候图片尺寸是$224\times 224$,测试时是$448\times 448$, YOLOv2中,我们在前10epoch中使用$448\times 448$的图片在ImageNet上fine tune,以便使得网络能够适应更高分辨率的输入。
效果:mAP提升了4%.
Convolutional With Anchor Boxes
YOLO直接使用卷积网络顶层的全连接层直接预测bounding box的坐标。
Faster RCNN使用手选的先验来预测bounding box。RPN中全部是卷积层,预测anchor box的偏移和置信度。因为预测层是卷积层,因此RPN预测了特征图中每个位置的offset.预测offset也使网络比直接预测坐标更容易学习。
YOLOv2中,移除了全连接层并且使用anchor box来预测边界框。
首先,去掉了一个池化层来使得网络卷积层的输出具有更高的分辨率。
其次,调整网络输入为$416\times 416$,使得最后的feature map的宽高都为奇数,这样就只会产生一个center cell。原因是:大的物体一般都会占据图像的中心,这样在预测时就可以只使用中心cell,而不用周围的四个cell来预测,提高了效率。使用卷积层降采样,factor为32,这样最终得到($13\times 13$)的输出特征图。
另外,使用anchor box之后,可以解耦类别预测和空间定位,由anchor box同时预测类别和坐标。
如下图,YOLOv1中输出的$7\times 7\times 30$的特征,每个cell对于$1\times1\times30$,前10个是2个bounding box的坐标和confidence,后20个是表示假设该cell包含物体的情况下属于20个类别概率。
YOLOv2中,对每个anchor box都预测类别概率,也就是解耦合。
效果:
YOLOv1预测的box数目:$7\times7\times2=98$个,YOLOv2预测的box数目:$13\times13\times9>1000$个。准确率略微下降,当时召回率提升很多,说明还有很大改进空间。
使用anchor box会有两个问题,一个是anchor box 的维度需要手动选择,另一个是模型的不稳定性。下面分别叙述解决方法。
Dimension Cluster
源起:使用anchor时,需要手动选择box的维度(个数,宽,高)。设想能否一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。
解决办法:就是统计学习中的K-means聚类方法,通过对数据集中的ground truth box做聚类,找到ground truth box的统计规律。以聚类个数k为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度。
距离度量: 没有使用欧几里得距离,因为这样会使得大的box产生更多的error。我们的目的是使得先验获得绝佳的IOU分数,也就是不依赖于box的尺寸。
$$
d(box,centroid) = 1-IOU(box,centroid)
$$
随着k增大,IOU也增大,(高召回率),但是模型复杂度也在增大,最后这种取了$k=5$,上面右图中,$k=5$的聚类中心与手动选取的boxes是完全不一样的,扁长的框少,瘦高的框多.
效果:
Direct Location Prediction
bounding box regression
首先,我们回顾一下RCNN中介绍的Bounding box regression的方法。DPM中首先引入了边界框回归,但是他是基于几何特征,而RCNN是基于CNN特征。
输入是一组数据${(P^i,G^i)}_{i=1,……,N}$,其中$P^i=(P^i_x,P^i_y,P^i_w,P^i_h)$,表示$P^i$ proposal边界框的中心坐标和宽高。$G$表示ground truth的边界框,$G=(G_x,G_y,G_w,G_h)$,现在需要求得一个变换将proposal box $P$映射到groundtruth $G$.
我们将这个变换参数化成四个函数:$d_x(P),d_y(P),d_w(P),d_h(P)$,前两个表示bouding box $P$中心坐标的尺寸不变的平移变换。后两个是bounding box的宽高的对数域的变换。通过学习这些变换,可以将一个输入的proposal变换成一个预测的groundtruth box $\hat{G}$:
$$
\hat{G}_x = P_wd_x(P)+P_x \qquad(1)\\hat{G}_y=P_hd_y(P)+P_y\qquad(2)\\hat{G}_w=P_wexp(d_w(P))\qquad(3)\\hat{G}_h=P_hexp(d_h(P))\qquad(4)
$$
假设$d(P)$这四个变换都是由proposal $P$的第五个池化层特征得到的线性函数,标记为$\phi _5(P)$,因此我们有$d(P)=\textbf{w}^T\phi_5(P)$,其中$\textbf{w}_T$表示学习的参数向量。
优化方法使用加入正则项的最小平方损失。
$$
\textbf{w}*=argmin{\hat{\textbf{w}*}}\sum_i^N=(t^i-\hat{\textbf{w}}_^T\phi_5(P^i))^2+\lambda ||\hat{\textbf{w}}||^2\qquad(5)
$$
回归的目标$t_*$定义如下:
$$
t_x=(G_x-P_x)/P_w\qquad(6)\t_y=(G_y-P_Y)/P_h\qquad(7)\t_w=log(G_w/P_w)\qquad(8)\t_h=log(G_h/P_h)\qquad(9)
$$
回归过程有两点需要注意:
- 正则化项很重要,$\lambda=1000$.
- $P$必须在$G$附近才有意义。因此我们把与$G$有着最大IOU值的proposal当成是其附近的proposal,并且小于0.6IOU的都被丢弃了。
YOLOv2的bounding box 回归
源起:在网络迭代初期,模型不稳定,主要来源于预测boxd的$(x,y)$位置时。Faster rcnn在预测anchor时使用的公式如下:
其中:$x$表示坐标预测值,$x_a$表示anchor坐标(预设的固定值),$x^*$表示真实坐标。
即预测的中心坐标$(x,y)$计算如下:
$$
x=(t_xw_a)-x_a\y=(t_yh_a)-y_a
$$
(注意,应该是加号)
当预测$t_x=1$时,就会把box王右边移动(具体为anchor box的宽度);当$t_x=-1$时,就会往左边移动。因此,论文中说,这个公式没有任何限制,无论在什么位置预测,预测的anchor box都可以在图像中任意位置(由于$t_x$没有数值限制,可能会出现anchor检测到很远的目标box的情况,效率低下)。模型初期初始化后,需要很长的时间才能稳定预测敏感的物体位置。
因此,作者没有直接使用offset方法,而是预测了相对于grid cell的坐标位置的方法,且把ground truth限制在0-1之间,利用sigmod函数实现这一限制。网络在输出特征图上的0每个cell处预测了5个bounding box,每个bounding box有5个参数:$t_x,t_y,t_w,t_h,t_o$.假设该cell离图片左上角的cell相差$(c_x,c_y)$,并且bounding box的先验宽高为$(p_w,p_h)$,那么对应的预测如下图:
$t_x,t_y$经过sigmod函数被约束到了0-1之间,实际意义就是使得anchor负责其周围的box,约束了位置预测的范围后,参数更容易学习,模型也更稳定。
效果:结合dimension cluster和direct location,mAP提升了5%。
Fine-Grained Features
修改了的YOLO在$13\times13$的特征图上做预测,对大目标检测足够,对小目标不够。因此仿照SSD在多个特征图上得到不同的分辨率,我们也加上一个旁路,把之前$26\times26$分辨率的特征图引入,把$26\times26\times512$特征图变成$13\times13\times2048$的,拼接特征到不同的通道,而不是不同的空间位置上,就像ResNet的identity mapping一样。
效果:mAP提升了1%
Multi-Scale Training
网络只用到了卷积和池化层,因此可以检测任意大小的图片。不同于固定输入网络的图片尺寸的方法,每经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化{320,352,…,608}。最终最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。
这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。
Faster
Darknet19
VGG16对于$224\times224$输入的图片需要30.69billion的浮点数运算,而YOLOv1框架只需要8.52billion次浮点数运算,且在ImageNet上的分类精度只下降了一点点(88.0%vs90.0%)。
- 主要使用$3\times3$的滤波器,在池化步骤之后加倍滤波器的通道数。
- 使用全局平均池化来预测,并且在$3\times3$的滤波器之间使用$1\times1$的滤波器来压缩特征表达。
- 使用BN层来使训练稳定,加速收敛,正则化模型。
最后的DarkNet19有19个卷积层,5个最大池化层。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。
训练: