物体检测的三种网络模型

来源:互联网 发布:java面向对象关键字 编辑:程序博客网 时间:2024/04/27 23:34

物体检测的三种网络模型

介绍三种网络结构:(1)使用Proposal,包括Faster R-CNNR-FCN;(2SSD;(3Yolo。这三种网络各具特色。

Faster R-CNN

R-CNNFast R-CNNFaster R-CNN一脉相承。

 

R-CNN处理流程如上图所示:(1)使用一个提取Region Proposal的算法在一张图像上提取约2K个图像块(R-CNN中使用Selective Search算法,具体细节不用关心,演化到Faster R-CNN就用网络提取Proposal了);(2)把所有的Proposal归一化成一个SS的矩形(CNN的输入要求是矩形);(3)训练CNN网络,对每一个Proposal进行分类。可见R-CNN的做法还是很朴素的,它的贡献就是打破物体分类常用的Bag of Words方法,首次使用CNN来做。

R-CNN的一个缺陷是计算量很大:每个图像有约2KProposal,每个Proposal作为一个独立的输入提取特征,提取特征又是CNN中计算量密集的步骤,导致该算法很笨重。Fast R-CNN就是解决这个问题。

 

Fast R-CNN的处理流程如上图所示:(1)使用CNN网络提取底层特征(这些特征是整幅图像上所有的Proposal公用的,节省了R-CNN中的计算量);(2)自己写了一个ROI Pooling层,从数据层得到ROIs,即:每一个Proposal的坐标,映射到Feature Map上的对应位置,把该位置的矩形分成7×7的块,使用max Pooling提取一个维数固定为49的特征向量,送到两个全连接层中;(3)输出网络是两个全连接层,一个做分类,Loss层是SoftMaxWithLoss,一个做回归,Loss层是SmoothL1Loss。网络结构如下图所示。

 

Fast R-CNN网络的一个缺陷:依赖外部算法提取Proposal,个数太多,仍然占用大量计算量。Faster R-CNN就是解决这个问题的。Faster R-CNN训练一个RPNRegion Proposal Network)网络来提取Proposal,个数大大减少,然后再结合Fast R-CNN做分类和回归。

 

Faster R-CNN的处理流程如上图所示:(1)使用CNN网络提取底层特征;(2)训练RPN网络,提取ProposalRPN的处理流程后面有描述);(3)使用现有的Proposal和底层图像特征,训练Fast R-CNN做分类和回归。

RPN的处理流程如下图所示:(1)使用一个3×3的滑动窗口在Feature map上滑动,在每一个位置的中心点处遍历指定的scaleaspect ratio,提取Kanchor box;(2)类似FCN,使用卷积层对anchor box进行分类(前景和背景)和回归;(3)根据anchor box和标定的真值的重叠情况(IOUIntersection Over Union)进行分类,找出正面样本、负面样本和不参与训练的样本(这些样本决定了网络应该怎么学习);(4)分类任务使用SoftmaxWithLoss层,回归任务使用SmoothL1Loss层,根据Loss调整RPN网络;(5RPN网络输出Proposal

 

Faster R-CNN的网络结构如下图所示,整个网络分成3部分:(1)提取anchor box,如图中的rpn_conv/3×3;(2)提取样本,如图中的rpn-data;(3Fast R-CNN,如图中Proposal以下的网络结构。 


R-CNNFast R-CNNFaster R-CNN一路走来,都是为了减少重复计算,那么到了Faster R-CNN是不是没有重复计算了?不是。如上图中,ProposalN个,Proposal下面的网络结构(即:subnet)就需要计算N次,并且Proposal之间的重复比较多,subnet的计算量随之会很大。R-FCN就能够解决这个问题。

R-FCN

R-FCNRegion FCN。首先说说FCNFCNFull Convolutional Network,全卷积网络,特点是在分类时用卷积层代替全连接层,与之匹配的,用C(类别个数)个Feature MapAverage Pooling代替最后一个全连接层,用于分类。

FCN的示意图如下图所示。上半部分是一个用于图像分类的CNN网络,输入是一个图像块,经过多个卷积层提取特征,然后用三个全连接层进行分类。这个网络如果用于物体检测该怎么办?在物体检测时,输入的不是一个图像块,而是一整幅图像,是不是要把整幅图像分成多个图像块,对每个图像块进行分类?FCN(图中下半部分所示)的回答是:不用。图像不用分块,在整幅图像上做卷积(相当于把多个图像块有重叠的并起来),这也要求用于分类的不是一个全连接层(一个全连接层相当于一个1×1的卷积层),而是一个N×N的卷积层以获取不同区域对于不同种类的响应。FCN相当于一个并起来的CNN分类网络。

 

再来说说R-FCNR-FCN中的RRegion,即:通过RPN得到的Proposal。如果不考虑提升检测精度的话,R-FCN就会用一个卷积层(FC层)把底层特征的Feature Map的处理成C+1个卷积层,使用RPNProposal在每个卷积层上找出一块区域做Average Pooling,再接上一个softmax层用于分类。这样的话,每个Proposal下就不是一个subnet,而是一个Average Pooling,计算量可以忽略不计。

 

为了提高性能,R-FCNFC层之后的卷积层个数由C+1个增加到K×K×C+1)个,Average Pooling之后的一个数值变成一个K×K的矩阵,用于分类,如上图所示。怎么将K×K个卷积层合并成1个带有位置信息的1Score Map呢?(1)根据Proposal的位置,在K×K个卷积层上找到对应的位置;(2)在每个卷积层上,对Proposal中的响应求均值,得到一个数值;(3)将这些数值按照固定顺序排列起来,就得到一个K×KScore Map。凭借着学习,每一类中的K×K个卷积层的确能够学习到某些和位置有关的信息。

 

整个网络的处理流程如下图所示。

 

SSDSingle Shot Multibox Detector

SSD的处理流程如下图所示:(1)使用CNN网络提取底层特征;(2)在不同scaleFeature Map上,用P×(classes+1)3×3Kernel预测类别概率,用P×43×3Kernel回归物体坐标,其中PAnchor BoxscaleAspect Ratio的遍历,classes是类别个数,再加上背景类;(3)作者添加了MultiBoxLoss层计算Loss值,该Loss值使用与真值相匹配的Bounding Box的分类Loss和回归Loss的加权平均,前者使用SoftmaxLoss,后者使用SmoothL1Loss。作者实现了PriorBox层,根据Feature Map的尺寸来产生不同Aspect RatioScaleAnchor Box,这个层不用学习。

 

SSD的网络结构如下图所示:(1SSD的独特之处就是右侧的多个PriorBox,每个PriorBox有两个输入,一个是真值,一个是特定ScaleFeature Map,用于获取大小;(2)网络左侧的每个Feature Map有四个输出,一个向后传递,一个在卷积层中预测位置,一个在卷积层中预测类别,一个在PriorBox中计算尺寸;(3)位置和类别的Loss拼接起来,在MultiBoxLoss层一并计算,Loss的计算公式如下图所示,只计算和真值足够重叠的Bounding Box的分类和回归Loss

 

 

Yolo, Yolo2

Yolo的网络结构如下图所示:(1)用647×7的卷积核在整幅图像上卷积;(2)经过一系列的3×3或者1×1的卷积层,提取特征;(3)用两个全连接层做分类和回归,最后生成一个7×7×30的矩阵,7×7代表把图像分成7×7grid,每一个grid的结果用一个30维的特征向量表示,2×5+20=302代表每个grid预测两类,5代表一类物体的xywidthheightconfidence20代表二十个物体类别。

 

网络的Loss层计算方法如下图所示:(1)真值中物体中心落在7×7grid中的那一个grid就要responsible改物体的检测,需要计算xywidthheightLoss;(2)在真值中物体范围内的grid需要计算confidenceclassLoss;(3)没有在真值中物体范围内的grid需要计算confidenceLoss。这种计算方法比SSD中的Loss稍微细腻一些。Loss值在7×7的矩阵的点上计算,然后回传用于训练网络。

 

上述网络结果的一个浅显的解释如下图所示:(1)图像分成7×7grid;(2)物体中心的grid负责位置的回归,物体内的grid负责confidence的回归,图像内所有的grid负责分类;(3)把结果拼接起来,得到物体检测的结果。

 

SSD相比,Yolo在预测Bounding Box的时候没有使用ScaleAspect Ratio的约束,直接做预测,导致检测精度不够,这在Yolo2中得到了补救。

 

1 0