论文YOLO9000:Better, Faster, Stronger总共分为两大部分Better、Faster部分是对YOLOv1的诸多改善即YOLOv2 Stronger部分是在YOLOv2基础上提出的YOLO9000 YOLO9000主要添加了WordTree希 望将分类数据集和检测数据集联合起来,最终的模型能够检测9000多类对象。
YOLO对比最先进的目标加测模型而言有很多的缺点,对比Fast-RCNN而言其定位有很多的错误,对比区域建议的模型其招回率相对较低,YOLOv2旨在保留YOLO速度的前提下对其召回率很准确率进行改善。
且看上图YOLOv2与YOLO像对进行的诸多改善,基本上每一个改善都会提升模型的mAP.
通过在每一个卷积层之后添加BN层来加速网络的训练速度,而且BN算法能够起到防止过拟合的作用,YOLOv1中采用了dropout的方式来防止过拟合,YOLOv2通过BN来代替dropout,通过批量标准化(BN)mAP得到了约2% 的提高。
从AlexNet开始,大多数分类器在小于256×256的输入图像上运行。原始YOLO以224×224的速度训练分类器网络,并将分辨率提高到448以进行检测。 这意味着网络必须同时切换到学习目标检测并调整为新的输入分辨率。对于YOLOv2,我们首先在448x 448分辨率上在ImageNet上以10个eopch微调分类网络。 这使网络有时间调整其filters,使其在更高分辨率的输入上更好地工作。 然后,我们根据检测结果对网络进行微调。 这种高分辨率分类网络使我们的mAP几乎提高了4%。
YOLO使用卷积提取特征然后通过全连接层直接预测边界框的坐标。代替Region Proposal的选取。Faster RCNN使用手工挑选的先验框(anchor)来预测边界框。仅使用卷积层,Faster R-CNN中的区域提议网络(RPN)可以预测锚框的偏移量和置信度。 由于预测层是卷积的,因此RPN会在特征图中的每个位置预测这些偏移。 预测偏移量而不是坐标可以简化问题,并使网络更容易学习。
YOLO2中删除YOLO中的全连接层,并使用锚定框来预测边界框。 首先,去除了最后一个池化层,以使网络卷积层的输出具有更高的分辨率。同时将网络缩小为可处理416x416分辨率的输入图像,而不是448x448。这样做是因为作者希望特征图中的位置数为奇数,因此只有一个中心单元。 对象(尤其是大对象)往往占据图像的中心,因此最好在中心位置使用一个位置来预测这些对象,而不要使用附近的四个位置。YOLO的5个卷积层对图像进行32倍下采样,因此使用416的输入图像,YOLO v2 会得到13x13的输出特征图。
对于每一个boundingbox而言,YOLOv2还将类预测机制与空间位置分离,为每个boundingbox预测类和对象。 在YOLO之后,预测的仍会使用与GT的IOU,并且每个grid cell中的类别预测会在存在目标的情况下预测该类别的条件概率。
使用anchor,准确性会略有下降,原因当然是因为YOLO模型是将边框预测和分类融合成一体的,当为边框定位更新权重的时候肯定会在一定程度上影响分类的准确性。YOLO只能预测每个图像98个盒子,但使用锚框的YOLOv2模型可以预测1000个以上。 如果没有锚框,YOLO模型将获得69.5 mAP,召回率为81%。 使用anchor,模型可实现69.2 mAP,召回率,达到88%。 用极小的mAP降低来换取召回率的提升是划算的。
当将它们anchor与YOLO一起使用时,作者遇到了两个问题。 首先是先验框的尺寸是手工挑选的。网络可以学习适当地调整框,但是如果我们能够为网络选择更好的先验条件,则可以使网络更容易学习预测良好的检测。
为了弥补手工设置鲜艳可不够准确的缺点,在YOLOv2统手工选取anchor的方式不同,YOLOv2中的anchor是通过对检测集中的GT进行k-means聚类得出的anchor尺寸大小。与传统的方式相比聚类出的anchor更加符合检测集的数据分布。
通过聚类出的先验框高瘦形状的更多这比较符合我们的常识,那么到底选择几个聚类簇最合适嘞?上图中绘制出了随着聚类簇的增多平均IOU会增大,但是由于随着先验框的增多在方向传播调整参数提升边框预测能力的时候会牺牲一部分mAP,因此作者采取了一个准确率和召回率比较折中的办法选取了5个聚类簇,即使用五个先验框。
犹如聚类的时候损失函数如果采用范数则当边框比较大的时候其误差也大不方便衡量距离,因此采用IOU损失函数。
在YOLO中使用先验框时,会遇到第二个问题:模型不稳定,尤其是在早期迭代期间。大多数不稳定性来自于预测 anchor的位置。 在区域提议网络中,网络会预测值,并且中心坐标的计算公式如下:
此公式不受限制,因此任何锚定框都可以终止于图像中的任何点,而不管预测该框的位置如何。 通过随机初始化,该模型需要很长时间才能稳定以预测合理的偏移量。
通过预测相对于网格单元位置的位置坐标。 这将预测限制在0到1之间。我们逻辑激活sigmoid函数将网络的预测限制在此范围内如下图所示:
通过这种预测先验框的方式将模型的mAP提升了5%
YOLOv2的输出是13x13gridcell的特征图 尽管这对于大物体而言是足够去预测的,但是由于池化层下采样导致信息丢失,很多的小物体已经不能够进行分类了,于是YOLOv2采取了类似ResNet和DenseNet的方式将最后一个池化层输出后的特征图通过passthrough层堆叠到后面一个卷积层的输出上,这样就能够防止信息丢失有助于小图像的检测,通过这种操作性能提高了1%。
YOLOv2使用的输入分辨率为448x448。添加锚框后,我们将分辨率更改为416x416。由于模型仅使用卷积和池化层,因此可以即时调整其大小。 作者希望YOLOv2能够在不同尺寸的图像上运行,因此我们将其训练到模型中采取不同尺度的训练图片训练模型,而不是固定输入图像的大小,每10批次,就会随机选择一个新的图像尺寸输入模型进行训练,由于模型下采样了32倍,输入不同尺度为图片为32的倍数: 。这种形式迫使网络学会在各种输入维度上进行良好的预测。 这意味着同一网络可以预测不同分辨率的检测。 网络在较小的尺寸下运行速度更快,因此YOLOv2可以在速度和准确性之间进行轻松的权衡。虽然这样处理之后低分辨率的准确率比高分辨率要低但是这是在同一个网络进行的检测任务。
大多数目标检测框架采用的是VGG16作为特征提取器,虽然VGG16功能强大、分类准确但是他很复杂,对于224x224分辨率的图像VGG-16在进行前向传播的时候的卷积层需要进行306.9亿次浮点运算。YOLOv1采用的是Googlenet自定义网络,该网络比VGG-16要快但是也要进行85.2亿次浮点运算才能完成前向传播而且他的准确率比不上VGG16。而YOLOv2采用的是Darknet-19网络框架,Darknet-19含有19个卷积层5个池化层,只需要55.8亿次浮点运算处理每张图像,而且在ImagNet数据集上实现72.9% top-1,91.2% top-5的准确率。
模型输出是一个的张量也就是说每个gridcell有5个boundingbox没个box在20类对象中独立预测一个对象。
YOLO模型损失函数毫无疑问都包括了边框误差和置性度误差和概率误差,损失函数个人感觉还是要边看源码才能理解透,网上有文章这里就不做过多叙述了。
论文作者在YOLOv2的基础上提出一种WordTree机制使得模型能够将分类和检测的训练集合并起来进行训练,当输入样本为分类数据时候反向传播只更新与计算概率分布分类有关的参数,当输入样本为检测数据时就对整个模型进行反向传播更新参数。如果对于分类数据集和检测数据集种类是完全互斥的情况这当然是可以的,但是当两个数据即不是完全互斥的时候就会有问题存在。比如如果检测数据集上只有标签狗而分类数据集Imagenet上却有猎狗、哈士奇等不同品种的狗这样的情况下分类数据集和检测数据集据不能联合起来进行训练。
于是作者就提出了层级分类(Hierarchical classification)的概念,通过构建一个类别标签树,从主类到子类从树的顶端到树的顶端进行分类预测。
上图中有COCO数据集对应的分类标签和ImageNet的分类标签以及联合了COCO和ImageNet 数据集之后构建的WordTree。联合了分类数据集和检测数据集之后就能够对9000类对象进行分类,但是犹与要对模型进行评估论文中作者还添加了一些分类和检测集上不相关的418类总共就是9418类。
当搭建好了WordTree之后如何在YOLOv2的基础上以预测概率分布以及进行检测任务嘞?
假设在父节点terrier下有多个叶子节点Norfolk、Yorkshire、Bedlington...那么假设模型输出的张量是13x13x(3*(5+9418))也就是说每一个gridcell中有3个bbox没个bbox预测9418类物体中的一个,则每个9418向量中计算的分别是每个节点相对于其父节点的条件概率,那么如果是预测某个节点的概率我们就将这个节点到根节点的边上的所有条件概率乘起来如下图所示:
在推理阶段其实我们不用计算出每一条路径上的绝对概率,我们可以先设置一个阈值从根节点使用greedy贪婪算法开始遍历每一条路径每通过一个子节点就计算这个节点的概率如果到下一个节点计算概率的时候低于阈值就返回到上一个节点预测其类,对每个box都做同样的处理之后在对box进行NMS处理然后输出所有的box及其对应的预测类。
YOLOv2在YOLO的基础上进行进行了诸多改善,特别引入了anchor机制,和改变了YOLO原先的网络结构使得YOLO的性能不论是速度还是准确率都得到了提升。YOLO9000,通过WordTree在有限的检测数据集上提高了模型的分类数目。