YOLOv2相对于V1的改进主要有两方面:1、使用一系列策略对YOLOv1的网络结构进行了修改,在保证检测速度的同时提升了模型的检测准确率;2、提出了一种联合训练策略,使用ImageNet与COCO联合训练得到YOLO9000模型,可以实现9000类物体的目标检测。本文将从这两个改进策略对YOLOv2模型进行介绍。
个人觉得改进2(联合训练方法)的意义更大,这种训练方法可以迁移到其它检测模型,使检测模型可以检测到更多更详细的目标种类信息。
论文地址:https://arxiv.org/pdf/1612.08242.pdf。
1、BN层的引入(BatchNormalization)
YOLOv2网络模型通过在每一个卷积层后添加BN层,极大的改善了网络模型训练时到的收敛速度同时减少了模型对其它正则化方法的依赖(舍弃了dropout优化后依然没有过拟合),使得mAP获得了2%的提升。
2、适用高分辨率图像的分类器(High Resolution Classifier)
YOLOv1模型时使用ImageNet数据集以224×224的分辨率来预训练了分类模型,之后在分类模型的基础上改进为检测模型,基于分类模型已有的权重来初始化检测模型的权重,最终使用448×448分辨率的图像来训练检测模型。因此,在模型迁移后进行检测模型训练时,模型不仅需要来学习检测任务,而且需要有一个适应高分辨率图像输入的学习过程。YOLOv2解决了这个问题,YOLOv2使用ImageNet数据集预训练分类模型时,直接使用448×448分辨率的图像作为模型的输入(在ImageNet上共计训练了10个epoch),从而避免了模型迁移时分辨率变化的这一现象。
3、引入了Anchor Boxes用于目标检测(Convolutional With Anchor Boxes)
YOLOV1模型的最后使用了全连接层,这也就导致YOLOV1只能接受固定大小图像的输入。其次,在YOLOv1中,输入图像最终被划分为7×7的网格,每个单元格预测2个bounding box,并且最终取置信度最大的那个bounding box作为单元格的预测结果。这也就意味着YOLOV1模型最多只能预测出49个bounding box,也因此YOLOV1对小目标的检测不太友好。因此YOLOv2借鉴了faster rcnn所采用的的RPN策略(即采用anchor box来预测检测结果)。
因此YOLOv2移除了全连接层,这样可以保证模型可以接受不同分辨率图像的输入(这里输入图像的分辨率也是有限制的,因为YOLOV2模型总体的下采样系数为32,因此输入图像的分辨率必须是32的倍数)。作者实验证明,图像中大目标更倾向于出现在图像的中心,作者期望模型输出的特征图中有一个中心点来专门预测这些大目标,因此网络输出的特征图尺寸应该为奇数(奇数尺寸才能拥有一个绝对的中心点)。论文中检测模型输入图像的分辨率为416×416,网络最后一层输出的特征图尺寸为13×13。
YOLOv2为每个anchor box预测所属的类别以及bounding box中含有目标的分数,因此YOLOv2可以预测出13×13×5=845个bounding box。
4、采用聚类的方法生成Anchor Boxes(Dimension Clusters)
在Faster R-CNN和SSD中,Anchor Box(长和宽)都是人为手动设定的。如果选取的Anchor Box比较适用于当前数据集,则模型更容易学习和收敛,从而得到更好的预测结果。因此,YOLOv2采用k-means聚类方法对训练集中的bounding box进行了聚类分析,从而获取更适合当前数据集的Anchor Box。因为Anchor Box的选定是为了使模型预测的bounding box更接近ground truth ,因此在进行k-means聚类时距离指标采用聚类中心(bounding box)与ground truth的IOU值:
个人理解:进行k-means时的ground truth(图像真实的bounding box)没有使用位置信息只使用了W和H信息(即:bounding box的宽和高),因此得到的中心点也只有W和H信息(即:Anchor box)。注意,作者在进行k-means时使用的ground truth的width和height不是以像素为单位的(这也可以理解,COCO或VOC数据集中图像的尺寸是不同的),应该是相对于模型最终输出的feature map的尺寸(13×13)。
个人理解:参与k-means计算的ground truth的width和height计算方式,这里以模型最后输出的特征图尺寸为13×13为例:
:ground truth的width(以像素为单位)
:ground truth的height(以像素为单位)
:图像的width(相对于13×13feature map的尺寸)
:图像的height(相对于13×13feature map的尺寸)
5、直接位置预测(Direct location prediction)
RPN基于Anchor Box计算bounding box的中心(x,y)的方式如下所示(个人理解:作者在论文中所写的公式是错误的,应该是“+”而不是“-”):
:bounding box的实际中心位置
:坐标偏移值
:Anchor box的width和height
:feature map每个位置的中心点
由于公式没有任何约束(预测的bounding box可以向任何方向偏移,且可以偏移任意大小的偏移量),如当时bounding box将向右偏移一个Anchor Box的width,如当时bounding box将向左偏移一个Anchor Box的width,因此feature map中每个位置预测出的bounding box中心点可以落在图像的任意位置,这导致模型的前期训练十分不稳定,需要很多次迭代才能获取到一个稳定的模型。所以,YOLOv2弃用了这种计算方式,沿用YOLOv1的方法,就是预测bounding box中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度为1)。
模型为每个cell预测5个bounding box(因为有5个Anchor box),每个bounding box预测5个坐标值,关系图如下所示:
个人理解这幅图是模型最终输出的尺寸为13×13的feature map,共有169个cell。为cell的左上角坐标,每个cell的width和height均为1(每个cell的左上角坐标为,且为整数),上图中当前cell的坐标为(1,1),对于每个cell而言是固定不变的;与为Anchor Box的宽和高,4中说过它们是相对于feature map的大小。
6、细粒度特征(Fine-Grained Features)
YOLOv2模型最终是对一个13×13的feature map进行卷积运算做检测结果预测的.13×13的feature map对于检测图像中大尺寸物体来说是足够了,但是对于小物体需要更精细的特征图。YOLOv2提出了passthrough层来获取更精细的feature map,精细feature map的分辨率为26×26(网络结构中最后一个maxpooling层的输入,Darknet-19中精细feature map尺寸为26×26×512)。26×26×512的feature map经过passthrough层变成13×13×2048的feature map,将passthrough层得到的特征图与后面13×13×1024的feature map进行拼接,得到一个13×13×3072的feature map,然后在此feature map上进行卷积运算得到检测结果。
passthrough layer:本质其实就是特征重排,26×26×512的feature map分别按行和列隔点采样,可以得到4幅13×13×512的特征,把这4张特征按channel串联起来,就是最后的13×13×2048的feature map.还有就是,passthrough layer本身是不学习参数的,直接用前面的层的特征重排后拼接到后面的层,越在网络前面的层,感受野越小,有利于小目标的检测。
6、多尺度输入训练(Multi-Scale Training)
YOLOv2模型中没有全连接层,所以YOLOv2的输入可以不限于416×416分辨率的图像。为了使训练出的模型具有更强的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体做法就是在训练过程中每10个Batch随机改变一次模型输入图像的分辨率,YOLOv2的下采样系数是32,所以输入图像的分辨率需要是32的倍数:{320,352,……,608},输入图像的分辨率最小为320×320,最大为608×608。
这一策略可以使YOLOv2模型适应不同分辨率的图像作为输入,并且在在不同分辨率的情况下均能取得较好的预测结果。在VOC2007数据集上的结果证明,采用较小分辨率作为模型的输入时,模型的性能会有所下降,但是模型的效率更高;相反采用高分辨率图像作为模型的输入时,模型的性能会更好,但模型的效率会有所下降。也就是当输入图像分辨率较小时模型的效率更高,输入图像分辨率较大时模型的精确度更高,所以需要再效率和精度上进行权衡。
7、Darknet19
Darknet19与VGG模型的结构相似,有 19 个卷积层(卷积核尺寸为3×3)和 5 个 maxpooling 层(池化核为2×2,每次池化操作后特征图维度降低2倍,而同时将特征图的channles增加两倍)。Darknet-19最后一个池化层采用global avgpooling,并且在3×3的卷积之层间使用1×1的卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,避免模型过拟合。
8、YOLOv2模型的训练
YOLOv2模型的训练主要分为3个阶段。第一阶段:基于ImageNet数据集训练Darknet-19,网络模型输入的图像分辨率为224×224,训练160个epoch;第二阶段:基于ImageNet数据集finetune Darknet-19,此时网络模型输入的图像分辨率为448×448,训练10个epoch;第三阶段:首先将Darknet-19由分类网络修改为目标检测网络(移除Darknet-19的后三层,即最后一个卷积层、Global Avgpooling层以及softmax层,取而代之的是连续3个卷积核为3×3的卷积层+passthrough层+1个卷积核为1×1的卷积层),使用第二阶训练得到的weights来初始化检测模型的权重,使用目标检测数据集(COCO、VOC)来finetune检测模型。
个人理解:至此,YOLOv2就已经完事了,作者在模型结构上的改进就已经完事了。接下来介绍作者提出的一种模型训练方法,即YOLO9000。
YOLO9000是在YOLOv2模型的基础上提出了一种分类和检测的联合训练策略,使YOLOv2可以检测到9000类物体。YOLOv2实现在分类和检测数据集上的联合训练,当网络模型输入的图像来自检测数据集,对于这类数据使用完整的YOLOv2 loss来进行反向传播,当模型输入的图像来自分类数据集,则只计算整个YOLOv2 loss计算结构中分类部分的loss来进行反向传播。
作者在COCO检测数据集和ImageNet分类数据集上进行联合训练,但是遇到的第一个问题是两者的类别并不是完全互斥的,比如:“哈士奇”、“牛头梗”、“金毛”这些分类明显属于“狗”这一类,所以作者提出了层级分类方法(Hierarchical classification),在ImageNet数据集WordNet的基础上结合COCO数据集进行了进一步优化,建立了一种树结构WordTree,构建的WordTree如下所示:
传统用于分类的模型,最后一层往往是Softmax Layer,softmax往往处理的是类别之间是相互独立的标签,但是现实场景中许多类别并不是互斥的,盲目地混合数据集进行训练是不合理的。作者采用了softmax+WordTree的方法,不再是对所有类别使用一个大softmax进行分类,而只需对同一概念下的同义词进行softmax分类。
为了计算某一结点的绝对概率,只需要对这一结点到根节点的整条路径的所有概率进行相乘。比如你想知道一个图片是否是 Norfolk terrier 的概率,则进行如下计算:
个人理解:YOLO9000的训练策略比YOLOv2的网络模型意义更大,训练策略可以适用任何检测模型永远不会过时,纵使出现超越YOLOv2的模型,同样可以采用这种策略。以上是自己阅读YOLOv2论文的一些体会,可惜的是没有找到YOLOv2的损失函数,估计需要看一下大佬的代码了,如果有什么理解错误的希望指出。