前文中已经讲述了R-CNN以及SPP-Net两个经典的入门级算法,下来向我们走来的是R-CNN家族的另一位优秀代表——Fast-RCNN。region proposal
Fast-RCNN顾名思义,就是快速的R-CNN,其目的就是解决R-CNN训练慢、检测慢的难题。
Fast-RCNN的论文是就是《Fast R-CNN》,其作者是rbg大神,论文简单明了,目的性贼强。(百度云链接:https://pan.baidu.com/s/1fQlWVSY19kphn8X9zOyGEA,提取码:aglm)。
Fast-RCNN是建立在以前所使用的的卷积神经网络有效地分类目标的成果上的。其采用了多项技术,从而提高训练速度和检测速速来提高检测精度。Fast-RCNN在训练VGG-16时比R-CNN 快9倍,检测时快213倍,并且还取得了较高的检测精度(在PASCAL VOC数据集上)。
论文的第一章简介中介绍了当前的图像分类与检测算法的发展已经取得了较大的成就,But,目标检测由于其复杂性检测不光慢,还检测精度差。然后论文就对就说明了产生复杂性的两个原因:其一是必须处理大量的候选区域,其二是候选框定位不准确,需要精细化以实现定位。这些问题的解决必然会造成检测速度慢,检测精度差。然后,论文就把自己的Fast-RCNN提出来了。
接下来论文又较为详细的分析R-CNN与SPP-Net的优缺点,其中重要的一点是这两个模型的训练过程是多级流水线:涉及特征提取、使用log损失函数对网络进行微调、训练SVM分类器、使用拟合检测框进行回归。
第一章的最后,rbg大神信心百倍的指出了Fast-RCNN的几个优点:
比R-CNN和SPP-Net具有更高的目标检测精度(mAP);
训练是使用多任务损失的单阶段训练;
训练可以更新所有网络参数层;
不需要磁盘空间存储特征。
接下来上图(还是R-CNN中的那张经典的骑马图!)
输入图像和多个RoI被输入到卷积网络中。每一个RoI被池化到固定大小的特征图中,然后通过全连接层映射到特征向量(这里的映射是重点,需要注意一下映射)。等到以上操作完成后,接下来就要输出了,这里会有两个输出向量:Softmax概率和每一类检测框的回归偏移量。
Fast R-CNN网络将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。然后,对于每个候选框,RoI池化层从特征图中提取固定长度的特征向量。每个特征向量被送入一系列全连接(fc)层中,其最终分支成两个同级输出层 :一个输出个类别加上1个背景类别的Softmax概率估计,另一个为个类别的每一个类别输出四个实数值。每组4个值表示个类别的一个类别的检测框位置的修正。
相比较于R-CNN,Fast-RCNN最大的不同点在于RoI池化层和FC层中的目标分类与检测框回归的统一。(抛弃了SVM!)
首先要讲解的是ROl池化层,其涉及的灵感是来源于SPP-Net,但是在这里rbg大神做了一些简化,抛弃了多尺度池化,转而利用M*N的网格进行maxpooling(注意M不一定等于N,也就是不一定每个网格是方形的,这个改进对于后来的模型具有一定的启示作用。)
这这里需要声明的一点,在前期的准备中,Fast-RCNN还是采用了SS算法进行候选区域的选取。
然后是联合目标分类与候选框回归的FC层
在R-CNN中,首先提取region proposal,然后CNN提取特征,然后SVM分类,最后再BBox回归,不得不说比较繁琐。Fast-RCNN直接将分类和回归一并放入到了全连接层,形成一个multi-task模型。输出两层结构,其一是用来分类的cls_score层,即分类得分看看属于哪一类的分数最高。其二是BBox_predict层,用来进行候选框的微调(这个微调在后面还会提及)。
和R-CNN相似,首先获得预训练的模型(以VGG-16和ZF为例),然后再PASCAL VOC数据集上进行微调。
在调优训练时,每一个mini-batch中首先加入2张完整图片(即mini-batch=2,这是一个考验硬件的参数!),而后加入从2张图片中选取的128个候选框。这128个候选框可以复用2张图片前5个阶段的网络特征。(这里提及了复用的概念,很重要!)
在进行微调前,需要对有监督预训练后的模型进行3步转化:其一是RoI池化层取代预训练模型中卷积网络最后一层池化层(相当于连接了一个空间金字塔池化层);其二是两个并行层取代预训练模型中的最后一层全连接层和softmax层,并行层之一是新全连接层1加原softmax层1000个分类输出修改为21个分类输出(20+1,20类+1个背景,这个参数在做自己数据集训练时会经常用到),并行层之二是新全连接层2加候选区域窗口回归层;其三是预训练模型由原来单输入修改为双输入(图像的列表和这些图像中的RoI的列表)。
微调
卷积神经网络的参数训练,很大程度上是一种猜测,只有通过不断地调整才能猜的更准确。那么怎么才能更好的调整呢?当然是我随口说一个,然后你给我一个反馈,告诉我说的对不对,说的是大了还是小了,然后我再带着这个反馈进行下一轮猜测这才是一个正确并且高效的方法(二分法是不是也是这个思想?)。
卷积神经网络的参数调整同样也是这样的,这里有一个名词是“反向传播”。利用反向传播进行卷积神经网络的参数调整是重要的知识点!Fast-RCNN相较于SPP-Net的一个重要能力便是可以实现“反向传播训练”,那么为什么SPP-Net不能够实现反向传播训练呢?
原因很简单,当每一个训练样本(RoI)来自不同的图像时,通过空间金字塔池化层进行反向传播是非常低效的,低效的部分是因为每一个RoI可能具有非常大的感受野,通常跨越整个输入图像。
为了解决这个问题,实现微调。Fast-RCNN采用了以下办法。
首先是特征共享,在Fast RCNN网络训练中,随机梯度下降(SGD)的小批量是被分层采样的,首先采样N个图像,然后从每个图像采样R/N个 RoI。关键的是,来自同一图像的RoI在向前和向后传播中共享计算和内存。减小N,就减少了小批量的计算。(想要收敛的快,就加大N,加大了N就会吃内存!)。
其次是,在微调阶段联合优化Softmax分类器和检测框回归,而不是分别在三个独立的阶段训练softmax分类器、SVM和回归器。
多任务损失
Fast-RCNN有两层输出,自然也就会有两个损失等待处理,因此需要计算多任务损失。分别是
和
多任务损失自然就是两者带权之和了。
前边巴拉巴拉讲了很多,基本上说明了Fast-RCNN的基本原理、模型的基本结构和训练的基本操作。Fast-RCNN具有极大的有点就是在训练和检测上都进行了极大的提速,并且保证了检测的质量。
其缺点还是有的,最大的缺点其还是采用SS算法进行候选区域的预选择,这就造成了其并不是一个完整的或者说是全部的卷积神经网络(虽然已经改造了99%了),这样带来的问题就是其检测速度还是不是很快,那么有没有一种方法可以将候选区域的选择也纳入到卷积神经网络之中呢?(当然有了,不然我也就不会说出来了!)
未完待续。。。