前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【个人整理】faster-RCNN的训练过程以及关键点总结

【个人整理】faster-RCNN的训练过程以及关键点总结

作者头像
小草AI
发布2019-06-02 23:34:58
16.2K1
发布2019-06-02 23:34:58
举报

前言

前言:faster-RCNN是区域卷积神经网络(RCNN系列)的第三篇文章,是为了解决select search方法找寻region proposal速度太慢的问题而提出来的,整个faster-RCNN的大致框架依然是沿袭了fast-RCNN的基本能结构,只不过在region proposal的产生上面应用了专门的技术手段——区域推荐网络(region proposal network,即RPN),这是整个faster最难以理解的地方,本文也将以他为重点进行说明。鉴于篇幅较长,本次系列文章将分为3篇来说明:

第一篇:faster-RCNN的背景、结构以及大致实现架构

第二篇:faster-RCNN的核心构件——RPN区域推荐网络

第三篇:faster-RCNN的训练以及补充

本次为系列文章第三篇。

四、RoIHead与Fast R-CNN的进一步训练

RPN只是给出了2000个候选框,RoI Head在给出的2000候选框之上继续进行分类和位置参数的回归。其实所谓的ROIHead就是对生成的候选框进行处理,这个地方与前面的fast-RCNN是一样的。

4.1 ROIHead的网络结构

由于RoIs给出的2000个候选框,分别对应feature map不同大小的区域。首先利用ProposalTargetCreator 挑选出128个sample_rois, 然后使用了RoIPooling 将这些不同尺寸的区域全部pooling到同一个尺度(7×7)上。下图就是一个例子,对于feature map上两个不同尺度的RoI,经过RoIPooling之后,最后得到了3×3的feature map.

RoIPooling,其实这里的ROIPooling跟fast-RCNN里面的是一样的。

RoI Pooling 是一种特殊的Pooling操作,给定一张图片的Feature map (512×H/16×W/16) ,和128个候选区域的座标(128×4),RoI Pooling将这些区域统一下采样到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一个batch-size=128,通道数为512,7×7的feature map。

为什么要pooling成7×7的尺度?是为了能够共享权重。在之前讲过,除了用到VGG前几层的卷积之外,最后的全连接层也可以继续利用。当所有的RoIs都被pooling成(512×7×7)的feature map后,将它reshape 成一个一维的向量,就可以利用VGG16预训练的权重,初始化前两层全连接。最后再接两个全连接层,分别是:

FC 21 用来分类,预测RoIs属于哪个类别(20个类+背景)

FC 84 用来回归位置(21个类,每个类都有4个位置参数)

4.2 训练

前面讲过,RPN会产生大约2000个RoIs,这2000个RoIs不是都拿去训练,而是利用ProposalTargetCreator 选择128个RoIs用以训练。选择的规则如下

(1)RoIs和gt_bboxes 的IoU大于0.5的,选择一些(比如32个)

(2)选择 RoIs和gt_bboxes的IoU小于等于0(或者0.1)的选择一些(比如 128-32=96个)作为负样本

(3)为了便于训练,对选择出的128个RoIs,还对他们的gt_roi_loc 进行标准化处理(减去均值除以标准差)

(4)对于分类问题,直接利用交叉熵损失. 而对于位置的回归损失,一样采用Smooth_L1Loss, 只不过只对正样本计算损失.而且是只对正样本中的这个类别4个参数计算损失。

举例来说:

一个RoI在经过FC 84后会输出一个84维的loc 向量. 如果这个RoI是负样本,则这84维向量不参与计算 L1_Loss。如果这个RoI是正样本,属于label K,那么它的第 K×4, K×4+1 ,K×4+2, K×4+3 这4个数参与计算损失,其余的不参与计算损失。

4.3 生成预测结果

测试的时候对所有的RoIs(大概300个左右) 计算概率,并利用位置参数调整预测候选框的位置。然后再用一遍极大值抑制(之前在RPN的ProposalCreator用过)。

注意:

在RPN的时候,已经对anchor做了一遍NMS,在RCNN测试的时候,还要再做一遍

在RPN的时候,已经对anchor的位置做了回归调整,在RCNN阶段还要对RoI再做一遍

在RPN阶段分类是二分类,而Fast RCNN阶段是21分类

4.4 模型架构图

最后整体的模型架构图如下:

需要注意的是: 蓝色箭头的线代表着计算图,梯度反向传播会经过。而红色部分的线不需要进行反向传播(论文了中提到了ProposalCreator生成RoIs的过程也能进行反向传播,但需要专门的算法)。

五、faster-RCNN里面的几个重要概念(四个损失三个creator)

5.1 四类损失

虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。

在训练Faster RCNN的时候有四个损失:

(1)RPN 分类损失:anchor是否为前景(二分类)

(2)RPN位置回归损失:anchor位置微调

(3)RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)

(4)RoI位置回归损失:继续对RoI位置微调

四个损失相加作为最后的损失,反向传播,更新参数。

5.2 三个creator

(1)AnchorTargetCreator : 负责在训练RPN的时候,从上万个anchor中选择一些(比如256)进行训练,以使得正负样本比例大概是1:1. 同时给出训练的位置参数目标。 即返回gt_rpn_loc和gt_rpn_label。

(2)ProposalTargetCreator: 负责在训练RoIHead/Fast R-CNN的时候,从RoIs选择一部分(比如128个)用以训练。同时给定训练目标, 返回(sample_RoI, gt_RoI_loc, gt_RoI_label)

(3)ProposalCreator: 在RPN中,从上万个anchor中,选择一定数目(2000或者300),调整大小和位置,生成RoIs,用以Fast R-CNN训练或者测试。

其中AnchorTargetCreator和ProposalTargetCreator是为了生成训练的目标,只在训练阶段用到,ProposalCreator是RPN为Fast R-CNN生成RoIs,在训练和测试阶段都会用到。三个共同点在于他们都不需要考虑反向传播(因此不同框架间可以共享numpy实现)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与python集中营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档