编辑于2019/02/21,转载请注明
早期看过很多Faster-rcnn的解读,当时一直不明白,RPN已经有了分类和框回归,为什么要做成two stage呢?下面是我的理解。
Faster-rcnn简介
简单说下吧,Faster-rcnn分为三部分:
(1)基础网络,用来提取特征。
(2)RPN,初步的二分类+框回归。
(3)剩余部分,就是精确多分类+框回归,还有loss什么的。
比起跟早的检测网络,RPN网络有两个优点,一个是生成框的速度比selective search较快,另一个是在每个anchor上有k个(默认9个框,三个scale,三个aspect ratio)框,不同大小不同纵横比的框,可以包含到多尺度的目标。
RPN
RPN做的是初步的二分类和框回归,看网络结构,网络结构文件引用自
https://github.com/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/ZF/faster_rcnn_end2end
RPN从rpn_conv/3x3开始,假设输出的是nx14x14x256的特征,默认产生9个框,借鉴一下最常见的两张图。
然后:
(1)所有框初步二分类
rpn_cls_score层,是1x1的卷积层,输出nx14x14x18(每个anchor有9个框,每个框有2个值,代表包含和不包含目标的概率,即每一个框的二分类)
(2)所有框初步回归
rpn_bbox_pred层,也是1x1的卷积层,输出nx14x14x36(9个框,每个有(x,y,w,h)的偏移值,用来对每个初始框进行一定程度的回归)
(3)proposal
每一个框都有2个分数+4个框坐标的偏移值,接着只要用坐标偏移值来修正初始值,然后映射回原图,然后按照筛选规则去除一部分不要的,就有了初步的分类和框。
回答最开始的问题,为什么需要two stage,而不在RPN里直接搞定分类和回归呢?
从网络结构可以看出,RPN被设计为一个非常简单的小网络,它的分类,只能区分有没有目标,而不能区分是1000类中的哪一类;它的框回归,也做不到检测框的精确回归。
所以,后面需要根据RPN的初筛结果,进行精确的分类和回归,于是就有了two stage。