目标检测之解读YOLOv2论文、源码及背后逻辑

关于YOLOv1的内容,请参考目标检测之解读YOLOv1论文、源码及背后逻辑。下面具体看下YOLOv2都做了哪些改进。

YOLOv2精度的改进(Better)

Batch Normalization(批量归一化)

CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。新的YOLO网络在每一个卷积层后添加batch normalization,通过这一方法,mAP获得了2%的提升。batch normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

High Resolution Classifier(高分辨率分类)

所有最顶尖的检测算法都使用了基于ImageNet预训练的分类器。从AlexNet开始,大多数分类器的输入尺寸都是小于256x256的。最早的YOLO算法用的是224x224,现在已经提升到448x448了。这意味着网络学习目标检测的时候必须调整到新的分辨率。
对于YOLOv2,作者一开始在协调分类网络(指DarkNet-19)用的448X448全分辨率在ImageNet上跑了10个epoch。这使得网络有时间去调整自己的filter来使得自己能够在更高分辨率的输入上表现更佳。然后,作者们把这种更高分辨率的分类网络用到detection上,发现mAP提升了4% 。

用卷积代替全连接

可行性:卷积获取的是局部特征,全连接获取所有的局部特征,如果卷积核大小跟feature map一样大小就可以获取所有的局部特征。

实现过程如下:

在这里插入图片描述

全连接层转变成卷积层的操作很简单,只需要使用与上层尺寸一致的卷积核进行卷积运算即可。最终得到的输出层维度是1 x 1 x 4,代表4类输出值,激活函数也是softmax。

卷积替代全连接的优点
对输入分辨率的限制

如果网络后面有全连接层,而全连接层的输入神经元个数就是固定的,那么反推上层卷积层的输出是固定的,继续反推可知输入网络的图片的分辨率是固定的。例如,LetNet由于由全连接层,输入就只能是28 x 28的。那么图片就需要进行resize,这个会改变物体的真实比例,影响模型检测效果。

如果网络中的全连接层都用卷积层替代,网络中只有卷积层,那么网络的输出分辨率是随着输入图片的分辨率而来的,输出图中每一个像素点都对应着输入图片的一个区域(可以用stride,pooling来反算)。解决了v1只支持一种分辨率图片的问题

计算效率比较

在这里插入图片描述

假设为了识别图片中所有的数字(为了简单,假设每个数字都是在这个大图划分为14 x 14的网格中),16 x 16 x 3的图片需进行4次,28 x 28 x3的图片需进行64次。而利用卷积操作全链接,则不管原始图片有多大,只需要进行一次CNN正向计算,因为其中共享了很多重复计算部分,这大大节约了运算成本。

保留更多空间信息

v1使用全连接层数据进行bounding box预测(将全连接层转换为S*S*(B*5+20)维的特征),这一操作丢失较多的空间信息,导致定位不准

而全卷积网络的特点就在于输入和输出都是二维的图像,并且输入和输出具有相对应的空间结构,我们可以将网络的输出看作是一张heat-map,用热度来代表待检测的原图位置出现目标的概率,只做一次前向就可以得到所有位置的分类概率。如下图所示:
在这里插入图片描述

引入Anchor Boxes机制

YOLO v1一个单元格只能预测一个物体。作者借鉴Faster R-CNN中anchor box的概念,解决一个单元格不能预测多个物体召回率低的问题

为了引入anchor boxes来预测bounding boxes,首先,在网络中去掉和最后一个池化层(确保输出的卷积特征图

有更高的分辨率)。然后,让图片输入分辨率为416 * 416,这一步的目的是为了让后面产生的卷积特征图宽高

都为奇数,这样就可以产生一个中心单元格。作者观察到,大物体通常占据了图像的中间位置, 就可以只用

中心的一个cell来预测这些物体的位置,否则就要用中间的4个单元格来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样,使得输入卷积网络的416 * 416图片最终得到13 * 13的feature map。

加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。我们来计算一下,假设每个cell预测9个

建议框,那么总共会预测13 * 13 * 9 = 1521个boxes,而之前的网络仅仅预测7 * 7 * 2 = 98个boxes。具体数据

为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为

69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确

率,的确有改进空间。

anchor boxes的选取

faster-rcnn中的anchor boxes的个数和宽高比往往都是手动设置的,虽说在训练过程中网络也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。但是如果能够一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。

于是,yolo_v2的anchor boxes 通过在训练集的ground truth box上用了k-means聚类,找到ground truth box的统计规律,从而确定anchor boxes的形状。传统的K-means聚类使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,距离公式采用公式如下:
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box, centroid) = 1 - IOU(box, centroid) d(box,centroid)=1IOU(box,centroid)
其中,centroid代表簇的中心。

平衡k(anchor box的个数)和平均IOU得分之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。

仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。

Direct location prediction(直接位置预测)

Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量能够简化问题,让神经网络学习起来更容易。

但是,Faster-RCNN计算anchor boxes位置没有任何限制,使得无论在什么位置进行预测,可能会出现anchor检测很远的目标box的情况,效率比较低。模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。正确做法应该是每一个anchor只负责检测周围正负一个单位以内的目标box。
yolo使用了预测相对于单元格的坐标位置,同时配合sigmod函数将预测值转换到0~1之间的办法,做到每一个anchor只负责检测周围正负一个单位以内的目标box。具体计算示意图如下:

在这里插入图片描述

t x t_x tx, t y t_y ty 经sigmod函数处理过,取值限定在了0~1,实际意义就是使anchor只负责周围的box,有利于提升效率和网络收敛。使用 e e e 的幂函数是因为前面做了 l n ln ln 计算,因此, σ ( t x ) σ(t_x) σ(tx)是bounding box的中心相对栅格左上角的横坐标, σ ( t y ) σ(t_y) σ(ty)是纵坐标。

Fine-Grained Features(细粒度特征)

越在卷积网络前面的层,感受野越小,有利于小目标的检测;越卷积网络后面的层感受野越大,有利于大目标的检测,

上述网络上的修改使YOLO最终在13 * 13的特征图上进行预测,虽然这足以胜任大尺度物体的检测,但是用上细粒度特征的话,这可能对小尺度的物体检测有帮助。yolo添加了一个转移层( passthrough layer),这一层要把浅层特征图(分辨率为26 * 26,是底层分辨率4倍),然后跟深层特征图拼接在一起,用于检测物体。解决YOLOv1小目标检测效果不好的问题

passthrough layer,具体来说就是特征重排(不涉及到参数学习),前面26 * 26 * 512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,维度都是13 * 13 * 512,然后做concat操作,得到13 * 13 * 2048的特征图,将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。

Multi-Scale Training(多分辨训练)

原来的YOLO网络使用固定的448 * 448的图片作为输入,现在加入anchor boxes后,输入变成了416 * 416。目前的网络只用到了卷积层和池化层,那么就可以进行动态调整(意思是可检测任意大小图片)。作者希望YOLOv2具有不同尺寸图片的鲁棒性,因此在训练的时候也考虑了这一点。

不同于固定输入网络的图片尺寸的方法,作者在几次迭代后就会微调网络。没经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化{320,352,…,608}。最终最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。

这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。

在小尺寸图片检测中,YOLOv2成绩很好,输入为228 * 228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其在低性能GPU、高帧率视频、多路视频场景中更加适用。

在大尺寸图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,仍然高于平均水准。

YOLOv2速度的改进(Faster)

YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。

最终得出的基础模型就是Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。结构如下:
在这里插入图片描述

Training for classification

作者使用Darknet-19在标准1000类的ImageNet上训练了160次,用的随机梯度下降法,starting learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。 (这些训练参数是基于darknet框架,和caffe不尽相同)

初始的224 * 224训练后,作者把分辨率上调到了448 * 448,然后又训练了10次,学习率调整到了0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。

Training for detection

分类网络训练完后,就该训练检测网络了,作者去掉了原网络最后一个卷积层,转而增加了三个3 * 3 * 1024的卷积层(可参考darknet中cfg文件),并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。

作者的检测模型以0.001的初始学习率训练了160次,在60次和90次的时候,学习率减为原来的十分之一。其他的方面,weight decay为0.0005,momentum为0.9,依然使用了类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略。

YOLOv2分类的改进(Stronger)

VOC数据集可以检测20种对象,但实际上对象的种类非常多,只是缺少相应的用于对象检测的训练样本。YOLOv2尝试利用ImageNet非常大量的分类样本,联合COCO的对象检测数据集一起训练,使得YOLO2即使没有学过很多对象的检测样本,也能检测出这些对象,称为YOLO9000。

基本的思路是,如果是检测样本,训练时其Loss包括分类误差和定位误差,如果是分类样本,则Loss只包括分类误差。

构建WordTree

YOLO9000于是根据WordNet[5],将ImageNet和COCO中的名词对象一起构建了一个WordTree,以physical object为根节点,各名词依据相互间的关系构建树枝、树叶,节点间的连接表达了对象概念之间的蕴含关系(上位/下位关系)。

在这里插入图片描述

整个WordTree中的对象之间不是互斥的关系,但对于单个节点,属于它的所有子节点之间是互斥关系。比如terrier节点之下的Norfolk terrier、Yorkshire terrier、Bedlington terrier等,各品种的terrier之间是互斥的,所以计算上可以进行softmax操作。上图只画出了3个softmax作为示意,实际中每个节点下的所有子节点都会进行softmax。

WordTree的构建方法

构建好的WordTree有9418个节点(对象类型),包括ImageNet的Top 9000个对象,COCO对象,以及ImageNet对象检测挑战数据集中的对象,以及为了添加这些对象,从WordNet路径中提取出的中间对象。

构建WordTree的步骤是:①检查每一个将用于训练和测试的ImageNet和COCO对象,在WordNet中找到对应的节点,如果该节点到WordTree根节点(physical object)的路径只有一条(大部分对象都只有一条路径),就将该路径添加到WrodTree。②经过上面操作后,剩下的是存在多条路径的对象。对每个对象,检查其额外路径长度(将其添加到已有的WordTree中所需的路径长度),选择最短的路径添加到WordTree。这样就构造好了整个WordTree。

训练时WordTree如何表达对象的类别

之前对象互斥的情况下,用一个n维向量(n是预测对象的类别数)就可以表达一个对象(预测对象的那一维数值接近1,其它维数值接近0)。现在变成WordTree,如何表达一个对象呢?如果也是n维向量(这里WordTree有9418个节点(对象),即9418维向量),使预测的对象那一位为1,其它维都为0,这样的形式依然是互斥关系,这样是不合理的。合理的向量应该能够体现对象之间的蕴含关系。

比如一个样本图像,其标签是是"dog",那么显然dog节点的概率应该是1,然后,dog属于mammal,自然mammal的概率也是1,…一直沿路径向上到根节点physical object,所有经过的节点其概率都是1。参考上面图10,红色框内的节点概率都是1,其它节点概率为0。另一个样本假如标签是"Norfolk terrier",则从"Norfolk terrier"直到根节点的所有节点概率为1(即上图中黄色框内的节点),其它节点概率为0。

所以,一个WordTree对应且仅对应一个对象,不过该对象节点到根节点的所有节点概率都是1,体现出对象之间的蕴含关系,而其它节点概率是0。

预测时如何确定一个WordTree

上面讲到训练时,有标签的样本对应的WordTree中,该对象节点到根节点的所有节点概率都是1,其它节点概率是0。那么用于预测时,如何根据WordTree各节点的概率值来确定其对应的对象呢?

根据训练标签的设置,其实模型学习的是各节点的条件概率。比如我们看WordTree(图10)中的一小段。假设一个样本标签是dog,那么dog=1,父节点mammal=1,同级节点cat=0,即P(dog|mammal)=1,P(cat|mammal)=0。

既然各节点预测的是条件概率,那么一个节点的绝对概率就是它到根节点路径上所有条件概率的乘积。比如

P(Norfolk terrier) = P(Norfolk terrier|terrier) * P(terrier|hunting dog) * P(hunting dog|dog) *…* P(animal|physical object) * P(physical object)

对于分类的计算,P(physical object) = 1。

不过,为了计算简便,实际中并不计算出所有节点的绝对概率。而是采用一种比较贪婪的算法。从根节点开始向下遍历,对每一个节点,在它的所有子节点中,选择概率最大的那个(一个节点下面的所有子节点是互斥的),一直向下遍历直到某个节点的子节点概率低于设定的阈值(意味着很难确定它的下一层对象到底是哪个),或达到叶子节点,那么该节点就是该WordTree对应的对象。

分类和检测联合训练

由于ImageNet样本比COCO多得多,所以对COCO样本会多做一些采样(oversampling),适当平衡一下样本数量,使两者样本数量比为4:1。

YOLO9000依然采用YOLOv2的网络结构,不过5个先验框减少到3个先验框,以减少计算量。YOLO2的输出是13*13*5*(4+1+20),现在YOLO9000的输出是13*13*3*(4+1+9418)。假设输入是416*416*3。

由于对象分类改成WordTree的形式,相应的误差计算也需要一些调整。对一个检测样本,其分类误差只包含该标签节点以及到根节点的所有节点的误差。比如一个样本的标签是dog,那么dog往上标签都是1,但dog往下就不好设置了。因为这个dog其实必然也是某种具体的dog,假设它是一个Norfolk terrier,那么最符合实际的设置是从Norfolk terrier到根节点的标签都是1。但是因为样本没有告诉我们这是一个Norfolk terrier,只是说一个dog,那么从dog以下的标签就没法确定了。

对于分类样本,则只计算分类误差。YOLO9000总共会输出13*13*3=507个预测框(预测对象),计算它们对样本标签的预测概率,选择概率最大的那个框负责预测该样本的对象,即计算其WrodTree的误差。在剩下的框中选择其中预测置信度>0.3的边框,作为分类的负样本也参与损失的计算。

参考:

https://arxiv.org/abs/1612.08242

https://wordnet.princeton.edu/

https://www.jianshu.com/p/517a1b344a88

https://github.com/Captain1986/CaptainBlackboard

https://blog.csdn.net/q199502092010/article/details/85257180

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值