Faster-RCNN阅读笔记

首发地址

系统架构

structure.png

Faster-RCNN是Fast-RCNN的后续版本,主要针对Fast-RCNN速度过慢进行优化。在Fast-RCNN中,速度的瓶颈主要是用于生成候选区域的Selective Search过程。在Faster-RCNN中,候选区域的生成使用RPN网络,且共享的使用了卷积产生的特性,由此将候选区域的生成方式纳入神经网络的范畴下。该系统有以下部分构成:

  • 卷积神经网络:对待测图片进行几层卷积,产生高级特征,这些高级特征用于RPN生成候选框和RoI池化输入
  • PRN网络:根据卷积产生的高级特性生成一系列不考虑物品类别的候选区域,即代替Selective Search方法
  • Fast-CNN:RoI pool层输入的Fast-RCNN网络,输入为高级特征和候选区域,生成该候选区域的类别信息和候选区域的调整因子

PRN网络

PRN网络用于产生类别无关的候选区域,即代替Selective Search的功能,其结构如下:

prn_structure.png

其输入为从共享卷积部分的输出feature map,该部分再经过PRN网络的卷积部分,变为PRN feature,其长宽不变,通道数变为(4+2)n,其中n为每个点上生成候选框的数量。即每个候选框对应六个数据,分别为:

  • 位置信息x,y,w,h:包含位置信息,分别是位置和大小的调整系数。
  • 评分信息a,b:对这个区域是否含有物体的打分,一个为物品的分数,另一个为是背景的分数。

需要注意的是,位置信息均是调整系数,其和真实位置信息的关系为:
t_x = \cfrac{x-x_a}{w_a} \\ t_y = \cfrac{y-y_a}{h_a} \\ t_w = log\cfrac{w}{w_a} \\ t_h = log\cfrac{h}{h_a}
其中,t_x,t_y,t_w,t_h为网络的输出,x_a,y_a,w_a,h_a为anchor box提供的基础框大小,而x,y,w,h为最终预测的结果。这里的anchor box为一种预设为固定大小的框,其长度和宽度为超参数,在训练前指定,其x坐标和y坐标为PRN feature产生该预测框的点在原图中对应的点。例如输入原图大小为400*400,卷积网络使用了三次2*2的池化,feature map的尺寸为50*50,那么在PRN feature中坐标为(4,4)产生的所有anchor box的预设中心坐标x_a,y_a均为(32,32)。

anchor box的尺寸共n个,每个点共享n个anchor box尺寸,该尺寸一般通过类聚数据集上的物品尺寸产生,每个点都按指定的n个anchor box尺寸生成n个anchor box的调整系数和分数,调整后产生RoI的尺寸,注意RoI尺寸是原图上的尺寸,应用到Fast-RCNN上还需要进行缩放变换。

Fast-RCNN网络

fast_rcnn_structure.png

这里的Fast-RCNN部分指RoI池化层之后的部分,输入为与PRN共享的卷积网络的输出,输出分为两个部分:

  • 类别信息:总物体类别加1,即类别+背景,用于判断候选框的物品类别
  • 调整因子:用于微调PRN的输出结果,该部分输出的每个数据的功能与PRN的4个调整因子相同

由上图所示,共享卷积层输出的结果与PRN输出的RoI结合通过RoI池化层,获得一个固定大小的RoI feature,该部分经过一个共享的处理(卷积层,全连接层等),获得后续的feature,该feature分别通过两个独立的全连接层,获得类别信息和调整因子。使用其中的调整因子调整PRN输出的RoI数据,获得最终的RoI位置和大小数据。

系统训练

标签标注

标记分为三种,分别是:

  • 标记为正例:相对于真实物体IoU高于0.7或相对于真实物体IoU在所有候选区域中最高
  • 标记为反例:相对于真实物体的IoU低于0.3
  • 不标记:不属于正例也不属于反例的候选区域,这些区域不影响训练过程

代价函数

PRN代价函数

L(\{p_i\},\{t_i\}) = \cfrac{1}{N_{cls}}\sum\limits_i{L_{cls}(p_i,p_i^*)}+\lambda\cfrac{1}{N_{reg}}\sum\limits_ip_i^*L_{reg}(t_i,t_i^*)

PRN网络的代价函数如上所示,其中i是anchor box的标号;p_i为PRN判定的该anchor box有物体的概率;p_i^*为该anchor box的标记,若标记正例为1,反例则标记为0;t_i为PRN判定的调整因子;t_i^*为真实的调整因子。

代价函数分为两个部分,分别是:

  • 类别代价:L_{cls}(p_i,p_i^*)衡量类别判断错误产生的代价,为log代价函数(交叉熵)
  • 回归代价:L_{reg}(t_i,t_i^*)衡量调整因子误差产生的代价,为R(t_i-t_i^*)

其中,R函数的表达式如下所示:
R(x)=\begin{cases}0.5x^2 & |x| <1 \\ |x|-0.5&otherwise\end{cases}

Fast-RCNN代价函数

Fast-RCNN代价函数分为两个部分,如下所示:
L(p,u.t_u,v) = L_{cls}(p,u) + \lambda[u \geq 1]L_{loc}(t^u,v)
第一个部分L_{cls}为分类部分的代价函数,使用交叉熵函数,公式如下,其中u为该RoI区域的标记类别,p为神经网络输出的分类向量:
L_{cls}(p,u) = -log(p_u)
第二个部分L_{loc}为调整因子的代价函数,[u \geq 1]表示仅当当前位置不是背景时才考虑该部分代价, 超参数\lambda表示两个部分之间的权重,论文中取1。L_{loc}如下所示,其中t为网络输出的调整因子,v为目标调整因子。
L_{loc}(t^u,v) = \sum\limits_{i \in \{x,y,w,h\}}smooth_{L_1}(t^u_i-v_i) \\ smooth_{L_1}=\begin{cases}0.5x^2 & |x| <1 \\ |x|-0.5&otherwise\end{cases}

训练过程

训练过程包括PRN和Fast-RCNN网络的训练,其中,前段的卷积层还是共享权值的,训练方法如下所示:

  1. 单独训练共享部分和PRN网络,使其能获得类别无关的候选区域
  2. 单独训练共享部分和Fast-RCNN网络,候选区域使用第一步中训练出的PRN获得,注意这里PRN和Fast-RCNN前端卷积(前向传播时共享权值的部分)并没有实现共享权值,PRN和Fast-RCNN是两个完全独立的网络
  3. 将PRN网络与第二步训练出的共享部分连接,并固定共享部分权值,单独微调训练PRN网络
  4. 使用第三步训练产生的PRN产生候选区域,固定共享部分权值,微调Fast-RCNN的ROI池化之后层的参数,注意这一步的PRN和Fast-RCNN网络的前端卷积的权值是共享的
train.png

Fast-RCNN和PRN的训练都是批处理的,每一批均是从一张图片中获取的anchor box,且要求正例和反例的数量相同,原论文中batch大小是256,由128个正例和128个反例组成。

推荐阅读更多精彩内容