在yolo v1的基础上作者提出了一种联合训练的方法将目标检测数据集与分类数据集结合,使得YOLOv2网络能够识别9000种物体,升级为YOLO9000。
YOLOv2改进
1.Better
1.1 批规范化(Batch Normalization)
Batch Normalization的作用是提高了网络模型的鲁棒性,缓解了Covariant Shift问题,有一定的正则化(regularization)作用,在这里也不例外。通过在YOLO所有的卷积层中加入Batch Normalization,可以使得mAP提高2%,并且dropout的部分也可以丢掉。
1.2 高分辨率分类器(High Resolution Classifier)
从AlexNet开始,大多数的分类器都在分辨率小于的图像上执行分类。YOLO一代在训练分类网络的时候用的是分辨率,检测网络的时候用的是分辨率,这就意味着网络需要同时切换到目标检测并且适应新的分辨率。在YOLO二代中,直接使用的分辨率微调(fine tune)了网络,训练了10个epoch。可以使得mAP提高大概4%。
1.3 使用Anchor Box
原来的YOLO是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了Faster R-CNN的思想,引入anchor。首先将原网络的全连接层和最后一个pooling层去掉,使得最后的卷积层可以有更高分辨率的特征;然后缩减网络,用大小的输入代替原来。这样做的原因在于希望得到的特征图都有奇数大小的宽和高,奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell(比如可以划分成或个cell,center cell只有一个,如果划分成或的,center cell就有4个)。为什么希望只有一个center cell呢?因为大的object一般会占据图像的中心,所以希望用一个center cell去预测,而不是4个center cell去预测。网络最终将的输入变成大小的feature map输出,也就是缩小比例为32。
原来的YOLO算法将输入图像分成的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为为例,每个grid cell有9个anchor box的话,一共就是个,当然由后面第4点可知,最终每个grid cell选择5个anchor box)。在Faster RCNN在输入大小为时的boxes数量大概是6000,在SSD300中boxes数量是8732。显然增加box数量是为了提高object的定位准确率。实验证明:虽然加入anchor使得MAP值下降了一点(69.5降到69.2),但是提高了recall(81%提高到88%)。
1.4 通过K-means来学习出anchor box
在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关,K-means主要用与预测anchor box的长跟宽。:
聚类结果如图,左图代表Avg IOU与聚类数目K的关系,在权衡Avg IOU和模型复杂度以后,作者选择了K=5。右图代表了VOC和COCO数据集的box的聚类结果。可以看出聚类所得到的anchor box与手动选择相比,更倾向于选择高瘦的anchor box。
从表1可以看出,使用聚类算法得到的anchor box在其数量为5时就可以得到与手动选择的anchor box数量为9时几乎相同的Avg IOU,而在聚类算法得到anchor box数量为9时,它的Avg IOU是优于手动选择的(67.2> 60.9)。这也证明了聚类算法的得到的anchor box更好。
1.5 Directed Location Prediction
用Anchor Box的方法,会让model变得不稳定,尤其是在最开始的几次迭代的时候。而不稳定的因素主要来自于预测bounding box坐标(x, y)的时候。理解它的产生原因,我们需要先看一下faster RCNN的预测检测框的方法。
如下图所示,在faster RCNN中,box主要分为Ground True Box(人工标定的真正的检测框),Anchor Box和网络预测出的Predict Box。
faster RCNN预测的是Ground True/Predict Box与Anchor Box的偏移量,因此有如下公式:
x,y,w,h分别表示box的中心坐标和宽高,分别表示 predicted box, anchor box和ground truth的x坐标值 (y,w,h同理)。表示predict box相对于anchor box的偏移,表示ground true box相对于anchor box的偏移,学习目标自然就是让前者接近后者的值。
对应的,关于检测框中心点坐标则通过如下公式计算:(!!感觉应该是+号,才符合faster rcnn)
这样会带来一个问题,即当较大时(>=1),检测框可能跳到图像上的任意位置。因此YOLO的作者在此基础上做出了如下改进来限制检测框的跳动:
在这里作者并没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式。前面提到网络在最后一个卷积层输出大小的feature map,然后每个cell预测5个bounding box,然后每个bounding box预测5个值:(这里的类似YOLOv1中的confidence)。看上图,经过sigmoid函数处理后范围在0到1之间,这样的归一化处理也使得模型训练更加稳定;表示一个cell和图像左上角的横纵距离;表示bounding box的宽高,这样就是这个cell附近的anchor来预测得到的结果。黑色虚线框是bounding box,蓝色矩形框就是预测的结果。
其中 分别代表predict box的中心坐标x,y和它的长和宽,还有目标为物体b的概率。
1.6 细分类特征(Fine-Grained Features)
Faster F-CNN、SSD都使用不同尺寸的Feature Map来取得不同范围的分辨率,而YOLOv2采取了不同的方法,YOLOv2加上了一个跳跃层(Passthrough Layer)来获取之前的26*26分辨率的层的特征。这个Passthrough layer能够把高分辨率特征与低分辨率特征连结(concatenate)起来,这种方式看起来与ResNet很像,但是略有不同,因为ResNet采用的是summation,而YOLOv2的Fine-Grained Features采用的是concatenate。
1.7 多尺寸训练(Multi-ScaleTraining)
作者希望YOLO v2能鲁棒地运行于不同尺寸的图片之上,所以把这一想法用于训练model中。 区别于之前的补全图片尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小,最大,网络会自动改变尺寸,并继续训练的过程。 这一方法使得网络在输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,下图为YOLOv2和其他的目标检测网络的对比。
2.Faster
2.1 网络结构
YOLO使用的是GoogleNet架构,比VGG-16快,YOLO完成一次前向过程只用8.52 billion 运算,而VGG-16要30.69billion,但是YOLO精度稍低于VGG-16。因此作者在YOLOv2中设计了一种新的网络结构叫Darknet-19。网络结构如表格所示,与VGG相似,大量使用的卷积核,并在每次Pooling之后增加一倍Channels的数量。YOLO v2中还用到了Batch Normalization技术。 最终的model–Darknet19,有19个卷积层和5个maxpooling层,处理一张图片只需要5.58 billion次运算。
3.Stronger
3.1 Hierarchical classification
WordNet是一种有向图,这是因为语言模型很复杂,有很多同义词,所以不可以用树状结构表示。(例如,在训练的过程中,当网络遇到一个来自检测数据集的图片与标记信息,那么就把这些数据用完整的YOLO v2 loss功能反向传播这个图片。当网络遇到一个来自分类数据集的图片和分类标记信息,只用整个结构中分类部分的loss功能反向传播这个图片。 但是检测数据集只有粗粒度的标记信息,像“猫“、“ 狗”之类,而分类数据集的标签信息则更细粒度,更丰富。比如狗这一类就包括”哈士奇“”牛头梗“”金毛狗“等等。所以如果想同时在监测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。 )假设一个图片可以有多个分类信息,并假定分类信息必须是相互独立的规则可以被忽略。但是分类模型中不需要考虑所有的同义词,因此作者在这里从WordNet结构中提取出包含ImageNet类别的多层级WordTree结构。
作者希望根据ImageNet中包含的概念来建立一个分层树,为了建立这个分层树,首先检查ImagenNet中出现的名词,再在WordNet中找到这些名词,再找到这些名词到达他们根节点的路径(在这里设为所有的根节点为实体对象(physical object))。在WordNet中,大多数同义词只有一个路径,所以首先把这条路径中的词全部都加到分层树中。接着迭代地检查剩下的名词,并尽可能少的把他们添加到分层树上,添加的原则是取最短路径加入到树中。
为了计算某一结点的绝对概率,只需要对这一结点到根节点的整条路径的所有概率进行相乘。所以比如你想知道一个图片是否是Norfolk terrier的概率,则进行如下计算:
3.2 Dataset combination with WordTree
为了验证这一个方法,在WordTree上训练Darknet19的model,使用1000类的ImageNet进行训练,为了建立WordtTree 1K,把所有中间词汇加入到WordTree上,把标签空间从1000扩大到了1369。在训练过程中,如果有一个图片的标签是”Norfolk terrier“,那么这个图片还会获得”狗“(dog)以及“哺乳动物”(mammal)等标签。总之现在一张图片是多标记的,标记之间不需要相互独立。
这里解释一下标签是怎么扩充的,比如一张图片是“Norfolk terrior”,那么根据WordTree的最短路径,这张图片还会获得“dog”和“mammal”的标签,即现在的标签向量元素为1的位置不唯一。比如原数据标签为(0,0,0,0,0,1,0,0,0,0),那么扩充后的数据标签则为(0,0,0,0,0,1,0,0,0,0,1,1)。之前的ImageNet分类是使用一个大的softmax进行分类。而现在,WordTree只需要对同一级别下的词汇类别进行softmax分类。如图所示:
如Figure5所示,之前的ImageNet分类是使用一个大softmax进行分类。而现在,WordTree只需要对同一概念下的同义词进行softmax分类。 使用相同的训练参数,这种分层结构的Darknet19达到71.9%top-1精度和90.4%top-5精确度,精度只有微小的下降。 这种方法的好处:在对未知或者新的物体进行分类时,性能降低的很优雅(gracefully)。比如看到一个狗的照片,但不知道是哪种种类的狗,那么就高置信度(confidence)预测是”狗“,而其他狗的种类的同义词如”哈士奇“”牛头梗“”金毛“等这些则低置信度。
3.3 Joint classification and detection
在使用WordTree混合了COCO与ImageNet数据集后,混合数据集对应的WordTree包含9418类。由于ImageNet数据集跟COCO比太大了,产生了样本倾斜的问题,因此作者将COCO过采样,使得COCO与ImageNet的比例为1: 4。
YOLO9000的训练基于YOLO v2的构架,但是使用3“priors”来限制输出的大小。当网络遇到检测数据集中的图片时则正常地反方向传播,当遇到分类数据集图片的时候,只使用分类的loss功能进行反向传播。
参考链接
https://cloud.tencent.com/developer/article/1064556
https://blog.csdn.net/hysteric314/article/details/53909408
https://blog.csdn.net/Chunfengyanyulove/article/details/80860870
https://blog.csdn.net/zhazhiqiang/article/details/82669863