您的位置:首页 > 其它

【R-CNN系列目标检测】(6)YOLO2算法

2017-07-13 16:36 232 查看
基本上转的晓雷的YOLO2笔记,写的非常详尽~

算法【1】以 YOLO 为基础,从准确度和速度上做改进,最终在保持原有速度的同时将精度提升到了76%左右;提出了联合训练(同时训练目标检测和分类)的方法,在COCO和ImageNet上得到一个能实现9000种目标实时检测的网络 YOLO9000

对YOLO的改进

YOLO2 对很多细节做了调整,从精度和速度上得到了提升

更精确

1.批归一化(Batch Normalization)

深层网络训练不收敛(梯度涣散)的原因是:每批训练数据的分布各不相同,导致网络每次迭代都需要学习适应不同的分布

文章《Batch Normalization导读》强烈推荐,写的有趣又详细)介绍的 Batch Normalization 方法对每个隐含层(激活)输入做归一化处理(均值为0,方差为1,同时添加 scale 和 shift 的扰动),极大改善了收敛速度

YOLO2 应用该方法(每个卷积层后面添加 BN),mAP 得到2%的提升

2.高分辨率分类器(High Resolution Classifier)

所有优秀的检测方法基本都会使用 ImageNet 预训练的分类器来提取特征。但这些网络输入尺寸往往比较小(AlexNet为 256*256,毕竟其目的是为了分类嘛),对于检测任务,其目标就会变得很小

YOLO2 修改预训练网络输入为 448*448 ,在 ImageNet 上训练10轮(其实也是 fine-tunning),让网络适应高分辨率的输入。通过这个办法,YOLO2 获得了4%的 mAP 提升

3.使用 Anchor Boxes 做卷积

YOLO1 使用 1470*1 的全连接层通过 reshape 为 7*7*30 做 bounding box 预测,这会丢失较多的空间信息,造成定位不准

YOLO2 借鉴了 Faster R-CNN 的思想,在卷积层输出的特征图上做滑窗采样,每个中心预测 9 种不同大小和比例的建议框(没有reshape因此保留了空间信息)

具体做法:

1)去掉最后的池化层,确保输出的卷积特征有更高的分辨率

2)网络输入尺寸调整为 416*416(前面的448*448是预训练的尺寸),这样后面产生的卷积尺寸都为奇数,有一个 center cell。(作者观察到,大物体通常占据了图像中间位置,可以只用一个中心 cell 来预测,由此稍稍提升效率)

3)使用 factor 为 32 的卷积层降采样,最终得到 13*13 的特征图(416/32=13)

4)YOLO1中每个 cell 仅预测一个类别,YOLO2 由 anchor box 同时预测类别和坐标(图1)

       


                 图1. YOLO2同时预测类别和坐标(图片来源

加入 anchor boxes 后,查全率由81%升到88%,查准率仅从69.5%降到69.2%

4.维度聚类(Dimension Clusters)

Faster-RCNN的 anchor boxes 个数和宽高是手动选择的,具有一定盲目性。YOLO2 使用 k-means 聚类方法,对训练样本的 ground true box 做聚类,从统计学上获得 boxes 的个数(聚类数目)和高宽(聚类中心 box)

k-means 的欧式距离函数在这里不太合理(大 box 比小 box产生更多error,而我们关心的实际上是IoU):

d(box,centroid)=1−IoU(box,centroid)

5.直接坐标预测(Direct Location Prediction)

Faster-RCNN的 anchor boxes 的坐标是以(x,y)为中心,每次预测其偏移比例(tx,ty):

{x=(tx∗wa)+xay=(ty∗ha)+ya

其存在的问题是,模型随机初始化后需要很长一段时间才能稳定预测

YOLO2 直接预测相对于 grid cell 的坐标,每个(全部13*13)cell 预测 5 个 bounding boxes,每个 box 预测5个坐标值(tx,ty,tw,to)

             


                     图2. YOLO2约束范围的位置预测

图中σ(tx)和σ(ty)为box中心偏离其所在 cell 左上角的距离;cx和cy为box中心所在 cell 距离图像左上角的距离

通过维度聚类和直接坐标预测的方式,mAP提升了5%

6.细粒度特征(Fine-Grained Features)

为了进一步提高对小尺度物体的检测效果,YOLO2 添加了一个 passthrough layer,将浅层特征图(26*26)连接到深层特征图

通过使用扩展后的特征图,YOLO2的性能提升了1%

7.多尺度训练(Multi-Scale Training)

由于YOLO2网络只包含卷积层和池化层,因此可以接受任意尺寸的图像输入。

YOLO2每经过10批训练,就会随机选择新的图片尺寸继续训练。

更快速

大多数检测网络使用 VGG-16 作为特征提取网络,该网络分类效果好,但结构复杂。224*224的图片经过一次前向传播,卷积层需要做306.9亿次浮点运算

YOLO使用修改后的 GoogleNet,其一次前向仅需85.2亿次浮点运算,但精度略低于 VGG-16

YOLO2设计了一个全新的分类网络 Darknet-19(包含19个卷积层,5个最大值池化层)。其处理一张照片需做55.8亿次运算,在 imagenet 的 top-1 准确率为72.9%,top-5 准确率为91.2%

                  


                        图3. Darknet-19网络结构

联合训练方法

YOLO2里提出了一种在分类数据集和检测数据集上联合训练的机制。使用检测数据集去学习坐标预测、是否包含物体及属于各物体的概率;使用分类数据集学习扩展可以检测的种类。

具体来说,作者在这里做了两项工作:数据集的层次式分类、联合训练机制

数据集的层次式分类

ImageNet 的标签为 WordNet 模式(一种有向图结构),为了简化问题,YOLO2使用层次树结构来代替图结构:

遍历ImageNet的所有视觉名词

对每一个名词,在WordNet上找到从它所在位置到根节点(“physical object”)的路径。 许多同义词集只有一条路径。所以先把这些路径加入层次树结构。

然后迭代检查剩下的名词,得到路径,逐个加入到层次树。路径选择办法是:如果一个名词有两条路径到根节点,其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少的那条路径

最终在预测时,计算每个节点的条件概率。如:

⎧⎩⎨Pr(Norfolkterrier|terrier)Pr(Yorkshireterrier|terrier)Pr(Bedlingtonterrier|terrier)

此外,还可以通过 WordTree 整合 ImageNet 和 COCO 数据集

联合训练机制

当网络遇到一张检测图片就正常反向传播。其中对于分类损失只在当前及其路径以上对应的节点类别上进行反向传播。

当网络遇到一张分类图片仅反向传播分类损失。在该类别对应的所有bounding box中找到一个置信度最高的(作为预测坐标),同样只反向传播该类及其路径以上对应节点的类别损失。反向传播objectness损失基于如下假设:预测box与ground truth box的重叠度至少0.31 IOU。

通过这种训练方法,YOLO2 将可检测类别扩展到了9000

代码实现

作者在主页上提供了源代码及安装方法。需要说明的是,这里作者使用的自己实现的深度学习框架 darknet,用起来不是很方便

文章《 r-cnn系列代码编译及解读(3)》基于作者代码,完成编译、训练工作,添加python检测接口

【1】Redmon J, Farhadi A. YOLO9000: better, faster, stronger[J]. arXiv preprint arXiv:1612.08242, 2016.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: