打个广告,复现Yolov3之后的深度原理剖析请移步下文(含代码):
【算法实验】能检测COCO并鉴黄的SexyYolo(含Yolov3的深度原理剖析)
Yolov2论文链接:YOLO9000: Better, Faster, Stronger
Yolov2是基于Yolov1的一系列改进,如果没有了解过Yolo的读者,请先阅读Yolov1解读:【论文解读】Yolo三部曲解读——Yolov1
Yolov3解读:【算法实验】能检测COCO并鉴黄的SexyYolo(含Yolov3的深度原理剖析)
【论文解读】Yolo三部曲解读——Yolov3
一、Yolov2概述
![86e5e465320b9b808a031f8a6c0c58d6.png](https://img-blog.csdnimg.cn/img_convert/86e5e465320b9b808a031f8a6c0c58d6.png)
先解释概念:Yolov2和Yolo9000算法内核相同,区别是训练方式不同:Yolov2用coco数据集训练后,可以识别80个种类。而Yolo9000可以使用coco数据集 + ImageNet数据集联合训练,可以识别9000多个种类。图一为Yolo9000的检测效果图,可以看到图片中的人,被分为了leader、American、skin-diver、athlete。
本文首先介绍Yolov2,列举出基于v1所做的改进;之后解读Yolo9000的训练方法。
二、Yolov2: Better, Faster
Yolov2论文标题就是更好,更快,更强。Yolov1发表之后,计算机视觉领域出现了很多trick,例如批归一化、多尺度训练,v2也尝试借鉴了R-CNN体系中的anchor box,所有的改进提升,下面逐一介绍。
- Better
1. Batch Normalization(批归一化)
By adding batch normalization on all of the convolutional layers in YOLO we get more than 2% improvement in mAP.
检测系列的网络结构中,BN逐渐变成了标配。在Yolo的每个卷积层中加入BN之后,mAP提升了2%,并且去除了Dropout。
2. High Resolution Classifier(分类网络高分辨率预训练)
在Yolov1中,网络的backbone部分会在ImageNet数据集上进行预训练,训练时网络输入图像的分辨率为224*224。在v2中,将分类网络在输入图片分辨率为448*448的ImageNet数据集上训练10个epoch,再使用检测数据集(例如coco)进行微调。高分辨率预训练使mAP提高了大约4%。
3. Convolutional With Anchor Boxes(Anchor Box替换全连接层)
第一篇解读v1时提到,每个格点预测两个矩形框,在计算loss时,只让与ground truth最接近的框产生loss数值,而另一个框不做修正。这样规定之后,作者发现两个框在物体的大小、长宽比、类别上逐渐有了分工。在v2中,神经网络不对预测矩形框的宽高的绝对值进行预测,而是预测与Anchor框的偏差(offset),每个格点指定n个Anchor框。在训练时,最接近ground truth的框产生loss,其余框不产生loss。在引入Anchor Box操作后,mAP由69.5下降至69.2,原因在于,每个格点预测的物体变多之后,召回率大幅上升,准确率有所下降,总体mAP略有下降。
v2中移除了v1最后的两层全连接层,全连接层计算量大,耗时久。文中没有详细描述全连接层的替换方案,这里笔者猜测是利用1*1的卷积层代替(欢迎指正),具体的网络结构原文中没有提及,官方代码也被yolo v3替代了。v2主要是各种trick引入后的效果验证,建议不必纠结于v2的网络结构。
4. Dimension Clusters(Anchor Box的宽高由聚类产生)
这里算是作者的一个创新点。Faster R-CNN中的九个Anchor Box的宽高是事先设定好的比例大小,一共设定三个面积大小的矩形框,每个矩形框有三个宽高比:1:1,2:1,1:2,总共九个框。而在v2中,Anchor Box的宽高不经过人为获得,而是将训练数据集中的矩形框全部拿出来,用kmeans聚类得到先验框的宽和高。例如使用5个Anchor Box,那么kmeans聚类的类别中心个数设置为5。加入了聚类操作之后,引入Anchor Box之后,mAP上升。
需要强调的是,聚类必须要定义聚类点(矩形框
![8555ca6d149115e819e648014fce47ee.png](https://i-blog.csdnimg.cn/blog_migrate/805b4c35a4da58c87f4e95c5d667bbb9.png)
使用(1-IOU)数值作为两个矩形框的的距离函数,这里的运用也是非常的巧妙。
5. Direct location prediction(绝对位置预测)
Yolo中的位置预测方法很清晰,就是相对于左上角的格点坐标预测偏移量。这里的Direct具体含义,应该是和其他算法框架对比后得到的。比如其他流行的位置预测公式如下(原文中是减号,应该是加号,无伤大雅):
![1b24bdfee6c86cecf02204bc307f54db.png](https://i-blog.csdnimg.cn/blog_migrate/1e9d889e82ea3f1f927dc2c77dbf1f22.jpeg)
神经网络预测
![a36acc8489c71cd26378222eed58ac80.png](https://i-blog.csdnimg.cn/blog_migrate/6de136f6eb3cad363f4dfff4c50e76a5.jpeg)
Yolo的天然优势,就是格点的坐标可以作为参照点。此时
6. Fine-Grained Features(细粒度特征)
在26*26的特征图,经过卷积层等,变为13*13的特征图后,作者认为损失了很多细粒度的特征,导致小尺寸物体的识别效果不佳,所以在此加入了passthrough层。
![b68090190d2af658b0d6e000eb35cbc8.png](https://i-blog.csdnimg.cn/blog_migrate/a7a0e5e6a74797277da7aa1f8024eb6b.jpeg)
如上图所示,passthrough层就是将26*26*1的特征图,变成13*13*4的特征图,在这一次操作中不损失细粒度特征。有人说passthrough层分成四份的具体细节,并不是两刀切成4块,而是在每个2*2的小区域上都选择左上角块。其实这里怎么切都一样,在之后1*1卷积层中,不过是加法交换律的事。
7. Multi-Scale Training(多尺寸训练)
很关键的一点是,Yolo v2中只有卷积层与池化层,所以对于网络的输入大小,并没有限制,整个网络的降采样倍数为32,只要输入的特征图尺寸为32的倍数即可,如果网络中有全连接层,就不是这样了。所以Yolo v2可以使用不同尺寸的输入图片训练。
作者使用的训练方法是,在每10个batch之后,就将图片resize成{320, 352, ..., 608}中的一种。不同的输入,最后产生的格点数不同,比如输入图片是320*320,那么输出格点是10*10,如果每个格点的先验框个数设置为5,那么总共输出500个预测结果;如果输入图片大小是608*608,输出格点就是19*19,共1805个预测结果。
在引入了多尺寸训练方法后,迫使卷积核学习不同比例大小尺寸的特征。当输入设置为544*544甚至更大,Yolo v2的mAP已经超过了其他的物体检测算法。
- Faster——Darknet-19
![c1569808220d3df38c2cdc1a1d8db28a.png](https://i-blog.csdnimg.cn/blog_migrate/042af8062ceab843bc73e2a53a5a493d.jpeg)
v2中作者提出了新的分类网络架构——Darknet-19,该架构的网络参数较VGG-16更少,在ImageNet上,仍然可以达到top-1 72.9%以及top-5 91.2%的精度。
- Yolo v2精度与性能
全部的trick效果如下,除了直接引入人为指定宽高的Anchor Boxes,其他技巧都带来了一定的增益。
![f61f243bd207cd53fc09b7b398e7b7f9.png](https://i-blog.csdnimg.cn/blog_migrate/8f4a2340d7d820573a1e366631939483.jpeg)
附一下Yolo v2与其他算法的对比图:
![7a599892874d464d594003d0634b6d58.png](https://i-blog.csdnimg.cn/blog_migrate/fe9b51a1b52e88a0bc7c03346d3fd1f5.jpeg)
![57ef50c2ae68a76b389e7468a8a00e02.png](https://i-blog.csdnimg.cn/blog_migrate/0685d977599c3bcd453a0245a022f255.jpeg)
Yolo v2的精度可以比肩业界前沿算法,同时仍然保持着大幅度速率领先。
三、Yolo9000: Stronger
- Joint classification and detection
如果说整个Yolo v2的Better部分,都没有什么大的创新点,这里的分类与检测联合训练,就是Yolo v2的一大亮点,因为这一个技巧,Yolo v2才成为了Yolo9000。
如之前所说,物体分类,是对整张图片打标签,比如这张图片中含有人,另一张图片中的物体为狗;而物体检测不仅对物体的类别进行预测,同时需要框出物体在图片中的位置。物体分类的数据集,最著名的ImageNet,物体类别有上万个,而物体检测数据集,例如coco,只有80个类别,因为物体检测、分割的打标签成本比物体分类打标签成本要高很多。所以在这里,作者提出了分类、检测训练集联合训练的方案。
联合训练方法思路简单清晰,Yolo v2中物体矩形框生成,不依赖于物理类别预测,二者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其余部分loss为零。当然,一般的训练策略为,先在检测数据集上训练一定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,作者对coco数据集进行了上采样,使得coco数据总数和ImageNet大致相同。
联合分类与检测数据集,这里不同于将网络的backbone在ImageNet上进行预训练,预训练只能提高卷积核的鲁棒性,而分类检测数据集联合,可以扩充识别物体种类。例如,在检测物体数据集中,有类别人,当网络有了一定的找出人的位置的能力后,可以通过分类数据集,添加细分类别:男人、女人、小孩、成人、运动员等等。这里会遇到一个问题,类别之间并不一定是互斥关系,可能是包含(例如人与男人)、相交(运动员与男人),那么在网络中,该怎么对类别进行预测和训练呢?
- Dataset combination with WordTree
在文中,作者使用WordTree,解决了ImageNet与coco之间的类别问题。
![ac5f67077a4eec7d05c04f64b0f74a11.png](https://i-blog.csdnimg.cn/blog_migrate/56c0bd3631d3a990d36df918ca84d062.jpeg)
树结构表示物体之间的从属关系非常合适,第一个大类,物体,物体之下有动物、人工制品、自然物体等,动物中又有更具体的分类。此时,在类别中,不对所有的类别进行softmax操作,而对同一层级的类别进行softmax:
![5d94e00e956b2304204646082cf1bcd7.png](https://i-blog.csdnimg.cn/blog_migrate/b5e9658388952f3a643309bc512a543a.jpeg)
如图中所示,同一颜色的位置,进行softmax操作,使得同一颜色中只有一个类别预测分值最大。在预测时,从树的根节点开始向下检索,每次选取预测分值最高的子节点,直到所有选择的节点预测分值连乘后小于某一阈值时停止。在训练时,如果标签为人,那么只对人这个节点以及其所有的父节点进行loss计算,而其子节点,男人、女人、小孩等,不进行loss计算。
最后的结果是,Yolo v2可以识别超过9000个物体,作者美其名曰Yolo9000。当然原文中也提到,只有当父节点在检测集中出现过,子节点的预测才会有效。如果子节点是裤子、T恤、裙子等,而父节点衣服在检测集中没有出现过,那么整条预测类别支路几乎都是检测失效的状态。这也合理,给神经网络看的都是狗,让它去预测猫,目前神经网络还没有这么智能。
四、小结
Yolo v2将同期业界的很多深度学习技巧结合进来,将Yolo的性能与精度又提升了一个层次。Yolo9000的物体检测分类技巧,可以很好的被运用到工程中,并不需要对所有的物体都进行费时费力的检测标注,而是同时利用分类标签与检测标签达到同样的效果,从而减轻了标注成本与时间。
最后预告下个月Yolo v3,绝不跳票!