YOLOv2的论文全名为YOLO9000: Better, Faster, Stronger,是对于yolov1的改进。
YOLOv1论文总结点这里:YOLOv1 论文详解【论文笔记 + pytorch实现 附.pth权重文件】
1 绪论
这篇论文的主要工作有:
- 使用一系列的方法对YOLOv1进行了改进,在保持原有检测速度的同时提升精度得到YOLOv2;
- 提出了一种目标分类与检测的联合训练方法,同时在COCO和ImageNet数据集中进行训练得到YOLO9000,实现9000多种物体的实时检测。
所以这篇文章其实包含两个模型:YOLOv2
和YOLO9000
,不过后者是在前者基础上提出的,两者模型的主体结构是一致的。
同yolov1论文题目一样,yolov2论文题目也体现了它改进后的三个优点:Better、Faster、Stronger
。如下总结作者是通过采用什么样的方法以实现这三个优点的。
2 Better
YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系列的检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLOv1模型的定位准确度和召回率。下面详细介绍各个改进策略。
Batch Normalization
YOLOv2网络在每个卷积层后添加Batch Normalization层,极大的改善了收敛速度同时减少了对其它regularization方法的依赖(舍弃了dropout优化后依然没有过拟合)。
High Resolution Classifier(高分辨率分类器)
YOLOv1先以分辨率224×224
预训练分类网络,然后分辨率调整到448×448
进行检测训练,这样做意味着网络在进行检测训练时还需要适应输入分辨率的不同。
YOLOv2在ImageNet数据集上预训练后,修改预训练分类网络的分辨率为448×448,再在ImageNet数据集上训练10轮(10 epochs)。这个过程使得模型在检测数据集上fine-tune之前已经适用高分辨率输入。
Convolutional With Anchor Boxes
YOLOv1使用全连接层数据进行bounding box
预测,这会丢失较多的空间定位信息。
YOLOv2借鉴了Faster R-CNN中的anchor
思想: 在特征图上的每个特征点取一定数量的不同大小和比例的anchor,由于特征图上的每个特征点对应于原图像的某个固定区域,故很好得保留了空间定位信息。此外,用预测相对偏移(offset)取代直接预测坐标简化了问题,便于网络学习。
针对于该想法,YOLOv2中对YOLOv1网络结构的改进如下:
- 去掉最后一层全连接层;
- 去掉最后的池化层以确保输出的卷积特征图有更高的分辨率;
- 将网络输入图片分辨率由
448×448
改为416×416
,目的是使得特征图的宽高都为奇数,这样就可以产生一个center cell。因为作者观察到,大物体通常占据了图像的中间位置,可以只用一个中心的cell来预测这些物体的位置,否则需要使用特征图中心的4个cell来进行预测,这个技巧可稍稍提升效率(细节拉满); - 使用卷积层降采样的总步长为32,使得输入卷积网络的
416×416
图片最终得到13×13
的特征图(416/32=13); - 把预测类别的机制从空间位置(cell)中解耦,由anchor box同时预测类别和坐标。因为YOLOv1是由每个cell来负责预测类别(回想YOLOv1中最后输出7×7×30的特征,每个cell对应1×1×30,前10个主要是2个bounding box用来预测坐标,后20个表示该cell在假设包含物体的条件下属于20个类别的概率)。YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是让全部放到anchor box中,即类别预测与anchor绑定在一起,可以实现对于anchor类别的预测而非每个特征点仅能有一个类别。
Dimension Clusters(使用anchor的第一个问题)
在Faster R-CNN中,anchor根据大小为{64, 128, 256}
、比率为{0.5, 1.0, 2.0}
来生成的,anchor数量越多,计算量就越大,势必会影响检测速度。为了保证YOLO系列算法速度快这一特性,作者采用统计学习中的K-means聚类方法,通过对数据集中的ground true box
做聚类,找到ground true box的统计规律。以聚类个数k
为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度。
如果按照标准K-means
使用欧式距离函数,大boxes比小boxes产生更多error。但是,我们真正关心的是与ground true box的IOU得分较高的boxes(与box的大小无关)。因此采用了如下距离度量:
关于k的具体取值,作者选取一系列k值进行实验,结果如下图所示。
可以看到随着k值增大,IOU在增大(高召回率),但是复杂度也在增加。所以平衡复杂度和IOU之后,最终选取k=5
。下右图可以看到,5个聚类的统计结果为扁长的框较少瘦高的框较多(这就是统计规律的力量)。
Direct location prediction(使用anchor的第二个问题)
使用anchor boxes的另一个问题是模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的(x,y)坐标时。
在区域建议网络(RPN)中预测坐标就是预测tx,ty。对应的中心点(x,y)按如下公式计算:
![](https://i-blog.csdnimg.cn/blog_migrate/32d2a0d5f19ccf2f7b4dec77c2f26992.png#pic_center)
PS: 论文中的公式为
个人感觉这里公式的符号略有出入,因为Faster R-CNN中的公式为:
![](https://i-blog.csdnimg.cn/blog_migrate/6a71071cd936104c7cdbef9011219565.png#pic_center)
这个公式没有任何限制,模型随机初始化之后将需要很长一段时间才能稳定预测敏感的物体偏移。因此作者没有采用这种方法,而是预测相对于grid cell的坐标位置,同时把ground truth限制在0到1之间(利用logistic激活函数约束网络的预测值来达到此限制)。
![](https://i-blog.csdnimg.cn/blog_migrate/8c8337e1fc5a740641ff57b344a23ae5.png#pic_center)
最终,网络在特征图13×13
的每个cell上预测5个bounding boxes,每一个bounding box预测5个坐标值:tx,ty,tw,th,to
。在计算时每个cell的尺度为1,所以当前cell的左上角坐标为 (1,1) 。由于sigmoid
函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。而 p_w 和 p_h 是先验框的宽度与长度,它们的值也是相对于特征图大小的,那么对应的box为:
![](https://i-blog.csdnimg.cn/blog_migrate/4b3a4da6ac0ecb3aef691db70027b62e.png#pic_center)
如果再将上面的bx, by, bw, bh
4个值分别乘以特征图的宽高,就可以得到边界框在原图像上的最终位置和大小,这就是YOLOv2边界框的整个解码过程。
Fine-Grained Features(细粒度特征)
考虑到对于小物体的检测,结合FPN(特征金字塔)的思想,YOLOv2简单添加一个 passthrough layer,把浅层特征图(分辨率为26 × 26,即提取特征图的倒数第二卷积层结果)连接到深层特征图。
通过把高低分辨率的特征图做连结,叠加相邻特征到不同通道(而非空间位置),类似于ResNet中的identity mappings。这个方法通过把26 × 26 × 512
的特征图叠加成13 × 13 × 2048
的特征图以实现。(特征图大小降低2倍,而channles增加4倍,类似如下图)
![](https://i-blog.csdnimg.cn/blog_migrate/5ca95f82c5bd8c37c8430f2f5cf0a59c.png#pic_center)
Multi-Scale Training
原始YOLOv1网络使用固定的448 × 448
的图片作为输入,加入anchor boxes后输入变成416 × 416
,由于网络只用到了卷积层和池化层(没有需要固定输入的全连接层),故可以检测任意大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,
具体实现为每经过10 batches
就会随机选择新的图片尺寸。网络使用的降采样参数为32,于是使用32的倍数{320,352,…,608}
,最小的尺寸为320 × 320
,最大的尺寸为608 × 608
。 调整网络到相应维度然后继续进行训练。
这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以进行不同分辨率的检测任务。
3 Faster(从网络框架角度)
大多数的目标检测框架依赖于VGG-16特征提取网络,224 × 224
的图片进行一次前向传播,其卷积层需要多达306.9亿次
浮点数运算;YOLOv1基于GoogleNet,一次前向传播需要80.52亿次
浮点数运算。YOLOv2提出了一种新的网络模型——Darknet-19
,它处理一张照片仅需要55.8亿次
运算(既保证了YOLOv2快速性的特点),包含19个卷积层、5个最大值池化层(max pooling layers )。
![](https://i-blog.csdnimg.cn/blog_migrate/10004fabbe4e6c2f9f8faf4fea9d8455.png#pic_center)
分类训练
- 使用Darknet-19在数据集ImageNet上训练160个epochs
- 使用SGD随机梯度下降法 starting learning
- rate = 0.1 polynomial rate decay = 4
- weight decay = 0.0005 momentum
- 0.9 数据增广:random crops、rotations、 hue、saturation、 exposure shifts
不要忘记第二部分中提到的High Resolution Classifier:
预训练完成后,将数据集的分辨率上调到448 × 448,使用同样的参数训练了10个epochs,学习率调整为0.001。
检测训练
为了把分类网络改成检测网络,去掉Darknet-19
网络最后一个卷积层、Avgpool
和Softmax
,连接三个 3 × 3 (1024 filters)的卷积层,并且在每一个卷积层后面跟一个1 × 1的卷积层,输出维度是检测所需数量。
对于VOC数据集,预测5种boxes,每个box包含5个坐标值和20个类别,所以总共是5 ×(5+20)= 125个输出维度。
![](https://i-blog.csdnimg.cn/blog_migrate/f7134af2a022db2046eff77fd9618d12.png#pic_center)
不要忘记第二部分中提到的Fine-Grained Features:即添加passthrough layer,从最后的3 × 3 × 512的卷积层连到倒数第二层。
![](https://i-blog.csdnimg.cn/blog_migrate/257e2f23d7855f659c3499d941d6197a.png#pic_center)
训练策略:
- epoch1~60 learning rate = 0.001
- epoch61~90 learning rate = 0.0001
- epoch91~160 learning rate = 0.00001
- weight decay = 0.0005 momentum = 0.9
- 数据增广:random crops、color shifting、etc
4 Stronger
这部分其实是在YOLOv2的基础上训练得到YOLO9000,最大的创新点在于对于数据集的处理。YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。
众所周知,检测数据集的标注要比分类数据集的标注繁琐的多,所以ImageNet分类数据集比VOC等检测数据集的数量高出几个数量级。在YOLO中,边界框的预测其实并不依赖于物体的标签,所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类;而对于分类数据集可以仅用来学习分类,但是其可以极大扩充模型所能检测的物体种类。
作者选择在COCO和ImageNet数据集上进行联合训练,但是遇到的第一问题是两个数据集的类别并不是完全互斥的,比如"Norfolk terrier"明显属于"dog",所以作者提出了一种层级分类方法(Hierarchical classification
),主要思路是根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree
,结合COCO和ImageNet建立的WordTree如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/2d0cda1e85bc40cedf5c82eabd5af33d.png#pic_center)
WordTree中的根节点为"physical object"
,每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个path,然后计算path上各个节点的概率之积,即可得到这个类别的绝对预测概率。
![](https://i-blog.csdnimg.cn/blog_migrate/1997aa84c12eae4c15a28cefa2df0f28.png#pic_center)
欢迎关注【OAOA】