Object Detection,在给定的图像中,找到目标图像的位置,并标注出来。 或者是,图像中有那些目标,目标的位置在那。这个目标,是限定在数据集中包含的目标种类,好比数据集中有两种目标:狗,猫。 就在图像找出来猫,狗的位置,并标注出来 是狗仍是猫。算法
这就涉及到两个问题:网络
2012年AlexNet在ImageNet举办的ILSVRC中大放异彩,R-CNN做者受此启发,尝试将AlexNet在图像分类上的能力迁移到PASCAL VOC的目标检测上。这就要解决两个问题:app
对于问题,R-CNN利用候选区域的方法(Region Proposal),这也是该网络被称为R-CNN的缘由:Regions with CNN features。对于小规模数据集的问题,R-CNN使用了微调的方法,利用AlexNet在ImageNet上预训练好的模型。函数
R-CNN目标检测的思路:测试
下图给出了,R-CNN的目标检测过程
spa
R-CNN进行目标检测的训练流程:.net
从一张图片中提取2000个候选区域,将每一个区域按照训练时候的方式进行处理,输入到SVM中进行正负样本的识别,并使用候选框回归器,计算出每一个候选区域的分数。
候选区域较多,有2000个,全部不少重叠的部分,就须要剔除掉重叠的部分。
针对每一个类,经过计算IOU,采起非最大值抑制的方法,以最高分的区域为基础,删掉重叠的区域。设计
R-CNN虽然取得了不错的成绩,可是其缺点也很明显。Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提高了目标检测的速度。一样使用最大规模的网络,Fast RCNN和RCNN相比,训练时间从84小时减小为9.5小时,测试时间从47秒减小为0.32秒。在PASCAL VOC 2007上的准确率相差不大约在66%-67%之间。blog
Fast RCNN主要是解决RCNN的问题的索引
输入是整幅图像和多个感兴趣区域(ROI)的位置信息,在前面的网络层中并不会处理ROI信息,在后面的RoI pooling layer中,将每一个RoI池化到固定大小的特征图中,而后经过全链接层提取特征。最后经过将提取的每一个RoI特征输入到SoftMax分类器已经边框回归器中,完成目标定位的端到端的训练。
Fast R-CNN网络将整个图像和一组候选框做为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。而后,对于每一个候选框,RoI池化层从特征图中提取固定长度的特征向量。每一个特征向量被送入一系列全链接(fc)层中,其最终分支成两个同级输出层 :一个输出个类别加上1个背景类别的Softmax几率估计,另外一个为个类别的每个类别输出四个实数值。每组4个值表示个类别的一个类别的检测框位置的修正。
ROI池化层前面的网络层是对整幅图像提取特征获得多个Feature Map。ROI池化层的输入就是这多个Feature Map以及多个ROI(候选区域),这里的ROI是一个矩形框,由其左上角的坐标以及宽高组成的四元组\((r,c,h,w)\)定义。
ROI池化层使用最大池化将输入的Feature Map中的任意区域(ROI对应的区域)内的特征转化为固定的\(H \times W\)的特征图,其中\(H\)和\(W\)是超参数。 对于任意输入的\(h \times w\)的ROI,将其分割为\(H \times W\)的子网格,每一个子网格的大小为\(\frac{h}{H} \times \frac{w}{W}\)。以下,取得\(2\times 2\)的特征图
ROI池化层的池化操做同标准的池化操做是同样的,每一个通道都单独执行。
经过ROI池化层能够从整幅图像的特征图中获得每一个ROI的特征图(固定大小),而整幅图像的特征图则使用预训练的网络提取获得。对于预训练完成的网络要作以下的修改:
R-CNN中的特征提取和检测部分是分开进行的,使用检测样本进行训练的时候没法更新特征提取部分的参数。SPPnet也不能更新金字塔层前面的卷积层权重,这是由于当批量训练的样原本自不一样的图片时,,反向传播经过SPP层时十分低效。Fast R-CNN则可使用反向传播的方法更新整个网络的参数。
Fast R-CNN提出一个高效的训练方法,能够在训练过程当中发挥特征共享的优点。在Fast R-CNN训练过程当中随机梯度降低(SGD)的mini-batch是分层采样的,首先取\(N\)张图像,而后从每张图片采样\(\frac{R}{N}\)个RoI。来自同一张图片的RoI在前向和后向传播中共享计算和内存。这样就能够减小mini-batch的计算量。例如\(N=2,R=128\),这个训练模式大概比从128个不一样的图像采样1个RoI(这就是R-CNN和SPPnet的训练方式)要快64倍。
该策略一个问题是会致使收敛起来比较慢,由于来自同一张图片的RoI是相关的。但它在实际中并无成为一个问题,咱们的使用\(N=2,R=128\)达到了很好的成绩,只用了比R-CNN还少的SGD迭代。
Fast R-CNN有两种输出:
将上面的两个任务的须要色损失函数放在一块儿
\[ L(p,u,t^u,v) = L_{cls}(p,u) + \lambda [u \ge 1]L_{Ioc}(t^u,v) \]
其中,\(L_{cls}(p,u)\)是分类的损失函数,\(p_u\)是class u的真实分类的几率。这里,约定\(u = 0\)表示背景,不参与边框回归的损失计算。
\[ L_{cls}(p,u) = -\log (p_u) \]
\(L_{Ioc}(t^u,v)\)是边框回归的损失函数,
\[ \begin{align*} L_{Ioc}(t^u,v) &= \sum_{i \in {x,y,w,h}}smooth_{L_1}(t_i^u - v) \end{align*} \]
其中,\(u\)表示类别,\(t^u\)表示预测边框的偏移量(也就是预测边框进行\(t^u\)偏移后,可以和真实边框最接近),\(v\)表示预测边框和实际边框之间真正的偏移量
\[ smooth_{L_1}(x) = \left\{ \begin{array}{cc} 0.5 x^2 & if |x| < 1 \\ |x|-0.5 & otherwise\end{array}\right. \]
这里\(smooth_{L_1}(x)\)中的\(x\)为真实值和预测值坐标对应值的差值,该函数在\((-1,1)\)之间为二次函数,在其余位置为线性函数,Fast RCNN做者表示做者表示这种形式能够加强模型对异常数据的鲁棒性。其函数曲线以下图
关于边框的修正后面单独详述。
在进行目标检测时,须要处理的RoI的个数较多,几乎一半的时间花费在全链接层的计算上。就Fast R-CNN而言,RoI池化层后的全链接层须要进行约2k次,所以在Fast R-CNN中能够采用SVD分解加速全链接层计算。
设全链接层的输入为\(X\),权值矩阵为\(W_{u\times v}\),输出为\(Y\),则全链接层的实际上的计算是一个矩阵的乘法
\[ Y = W \cdot X \]
能够将权值矩阵\(W\)进行奇异值分解(SVD分解),使用其前\(t\)个特征值近似代替该矩阵
\[ W \approx U \Sigma_t V^T \]
其中,\(U\)是\(u \times t\)的左奇异矩阵,\(\Sigma_t\)是\(t \times t\)的对角矩阵,\(V\)是\(v \times t\)的右奇异矩阵。
截断SVD将参数量由原来的 \(u \times v\) 减小到 \(t \times (u + v)\),当 \(t\) 远小于 \(min(u,v)\) 的时候下降了很大的计算量。
在实现时,至关于把一个全链接层拆分为两个全链接层,第一个全链接层使用权值矩阵\(\Sigma_t V^T\)(不含偏置),第二个全链接层使用矩阵\(U\)(含偏置).当RoI的数量大时,这种简单的压缩方法有很好的加速
Fast R-CNN是对R-CNN的一种改进
在Fast R-CNN中使用的目标检测识别网络,在速度和精度上都有了不错的结果。不足的是,其候选区域提取方法耗时较长,并且和目标检测网络是分离的,并非end-to-end的。在Faster R-CNN中提出了区域检测网络(Region Proposal Network,RPN),将候选区域的提取和Fast R-CNN中的目标检测网络融合到一块儿,这样能够在同一个网络中实现目标检测。
Faster R-CNN的网络有4部分组成:
其整个工做流程以下:
Faster R-CNN的4个组成部分,其中Conv Layers,RoI池化层以及分类和边框回归修正,和Fast R-CNN的区别不是很大,其重大改进就是使用RPN网络生成候选区域。
前面的卷积层用于提取输入图像的特征,生成Feature Map。这里有VGG-16为例,Conv layers部分共有13个conv层,13个relu层,4个pooling层。在VGG中,
Conv Layers的13个conv层并不会改变图像的尺寸,而有4个池化层,每一个池化层将输入缩小为原来的\(1/2\),则对于\(W \times W\)的输入,Conv Layers输出的Feature Map的宽和高为\(W / 16 \times W /16\),也就是输入尺寸的\(1/16\)。 有了这个Feature Map相对于原始输入图像的宽高比例,就能够计算出Feature Map中的每一个点对应于原图的区域。
因为池化层的降采样,Feature Map中的点映射回原图上,对应的不是某个像素点,而是矩形区域。
区域提议网络(RPN)以任意大小的图像做为输入,输出一组矩形的候选区域,而且给每一个候选区域打上一个分数。以下图
RPN输入的是前面Conv Layers提取图像的Feature Map,输出有两部分:
为了获得上述的两种输出,要从输入的Feature Map上获得两种信息:
前面提到因为池化层的降采样,Feature Map中的点映射回原图上,对应的不是某个像素点,而是矩形区域。很简单的,能够将Feature Map中的每一个点映射回原始图像,就能够获得一个候选区域,可是这样获得的区域太过于粗糙,显然是不行的。Faster R-CNN使用的是将每一个Feature Map中的点映射到原图上,并以映射后的位置为中心,在原图取不一样形状和不一样面积的矩形区域,做为候选区域。 论文中提出了Anchor的概念来表示这种取候选区域的方法:一个Anchor就是Feature Map中的一个点,并有一个相关的尺度和纵横比。说白了,Anchor就是一个候选区域的参数化表示,有了中心点坐标,知道尺寸信息以及纵横比,很容易经过缩放比例在原图上找到对应的区域。
在论文中为每一个Anchor设计了3种不一样的尺度\({128\times 128,256 \times 256,512 \times 512}\),3种形状,也就是不一样的长宽比\(W:H = {1:1,1:2,2:1}\),这样Feature Map中的点就能够组合出来9个不一样形状不一样尺度的Anchor。下图展现的是这9个Anchor对应的候选区域:
现假设输入到Conv Layers的图像尺寸为\(800 \times 600\),经过VGG16的下采样缩小了16倍,则最终生成的Feature Map的尺寸为
\[ ceil(800/16) \times ceil(600 /16 ) = 50 \times 38 \]
有Feature Map的一个点\((5,5)\),以该点为Anchro,生成不一样的候选区域
只有区域信息也不行啊,这些区域有多是前景也有多是背景,这就须要提取这些区域对应的特征信息,用于分类。对于VGG16,其最终生成的特征图有512个通道,也就是每一个点均可以获得一个512维的特征,将这个特征做为该点为Anchor生成的区域特征,用于分类。 论文中,是在特征图上作一个\(3 \times 3\)的卷积,融合了周围的信息。
设Feature Map的尺度为\(W \times H\),每一个点上生成k个Anchor(\(k = 9\)),则总共能够获得\(WHk\)个Anchors。而每一个Anchor便可能是前景也多是背景,则须要Softmax层\(cls = 2k\) scores;而且每一个anchor对应的候选区域相对于真实的边框有$(x,y,w,y)\(4个偏移量,这就须要边框回归层\)reg = 4k$ coordinates。
每一个anchor便可能包含目标区域,也可能没有目标。 对于包含目标区域的anchor分为positive label,论文中规定,符合下面条件之一的即为positive样本:
和任意GT的区域的IoU都小于0.3的anchor设为negative样本,对于既不是正标签也不是负标签的anchor,以及跨越图像边界的anchor就直接舍弃掉。
因为一张图像可以获得\(WHk\)个Anchors,显然不能将全部的anchor都用于训练。在训练的时候从一幅图像中随机的选择256个anchor用于训练,其中positive样本128个,negative样本128个。
关于边框回归的具体内容,因为本文内容过多,这里再也不说明,单独另写。
本文就R-CNN的系列文章进行了一个大体的梳理,从R-CNN初次将CNN应用于目标检测,到最终的Faster R-CNN经过一个CNN网络完成整个目标检测的演变过程。下图总结下三个网络
上表格引用自 Faster R-CNN论文笔记——FR