内容简介:参考资料要充分理解maskRCNN建议先通读RCN的系列论文了解主题脉络, 然后参考代码实现了解细节。
编辑推荐: |
本文来自于csdn,文章主要介绍了Mask RCNN整体实现框架、FPN和RPN的对应关系以及分类和bbox回归等相关内容。 |
参考资料
要充分理解maskRCNN建议先通读RCN的系列论文了解主题脉络, 然后参考代码实现了解细节。
本文内容基于 matterport 的实现版本,这里有一份官方博客介绍了一些实现细节,推荐阅读。
整体架构
下图为mask-rcnn的整体实现框架
训练和推导过程的区别
从图中可以看出来,MASK-RCNN的训练和推导过程略有不同。
1) 训练的时候,分类器使用的region proposal是根据ground truth和rpn的结果计算出来的,而推导的时候,直接使用RPN的结果。
2) 训练的时候分类器和mask生成器是并行的,推导的时候是串行的,先进行分类和bbox的回归,然后使用其结果进行mask的生成。
3)注意虽然流程不同,但是不一样的部分(detection target layer和detection layer)是固定的流程,没有参数和‘可学习’的部分。其他主要的需要训练学习的网络是一样的。
多任务训练
Backbone一般直接使用训练好的模型,比如ResNet,VGGNet等。RPN网络、类别判定和BBox回归网络,Mask生成网络,各自都有对应的loss,几个模块可以同时学习,而且据说同时训练效果更好。
FPN和RPN的对应关系
具体来说,FPN的各层feature都应用到同一个RPN, 但是对应不同的anchor box的大小。这里和anchor box大小的对应关系是隐含的。比如对于512*512的输入图片,如果feature是128*128的,那么对应的anchor box是8*8。不过这个对应关系是可配置的(RPN_ANCHOR_SCALES, BACKBONE_STRIDES),也可以有不一样的对应关系,如果修改的需要注意reception field,以及在构造ground truth bbox的时候要对应好。
FPN在分类/BBOX回归/mask生成是如何使用
根据RPN生成的BBOX的大小,对应到不同的feature层。matterport的代码这里是写死的。对于224*224的ROI,对应到FPN的P4. 此处有个疑问,对于不同的输入图片大小,是不是应该有不同的对应关系。
FPN的各层feature其实没有合起来一起用,RPN用不同层的feature对应不同的anchor box的大小,类别判定和bbox回归,以及mask生成都是选定某一层feature作为网络的输入。
FPN
FPN上层upsample之后和下层直接相加,channel数不变。这里和 Unet 不一样,Unet用连接(concatenation)的方式合并上下层feature,得到的channel数会变多。
RPN
论文中RPN是在featurelayer上使用3*3的区域作为输入,在实现的时候就是简单的3*3卷积,每个位置都生成结果。
RPN与Proposal Layer的对应关系
FPN的不同feature层都输入到rpn网络,生成一组RPN结果,然后将这些结果合并起来,输入到ProposalLayer。需要注意对应关系,因为某个RPN的结果对应哪个Box Scale,哪个Box ratio,以及对应原始图片哪个Position,都是固定的,后续计算Loss的时候需要和Ground Truth对应起来。在ProposalLayer之后这个对应关系就不需要了,因为Bbox本身记录了位置。
分类和bbox回归
输出分类结果(上部)和bbox回归(下部)。每个类别有一个结果(不包括背景),上图中类别为2。
Mask生成网络
默认情况下生成28*28大小的Mask,每个类别一个Mask。推理时使用后处理将mask resize到bbox的大小,并填充0变成原图片大小(utils.unmold_mask)。
Gradient传递
PyramidROIAlign层阻止Gradient向ROI proposals传递,但是会向FPN传递。也就是说头部的反向传递部分对RPN网络不产生影响。代码参考models.PyramidROIAlign
其他模块
Detection target layer,Proposal layer, 以及推导过程中的Detetion layer都是普通的非学习的过程.
Proposal layer选择6000个概率最大的anchor boxes,做一些后处理,使用NMS去重。得到的结果作为后续的输入。由于FPN的高精度层比较大,比如128*128,会生成128*128*NUM_bbox_ratio个结果,以0.5,1,2三个box ratio来计算是128*128*3=49152个,而且可能存在大量的重叠,如果不加处理输入到后续网络,会占用大量的内存。
Detection target layer把Proposal layer的输出进一步处理,生成合适的候选ROIs输入到后续网络,并为计算loss做准备。
Detection layer主要是根据目标分类和Bbox回归的结果,选择合适的ROI(去除背景,去除低概率的box,NMS去重)输入到mask生成网络。
ROIAlign 论文中这部分是使用插值的方式,将BBox对应的feature变换成7*7大小。matterport的实现直接使用了tf的resize。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- php如何实现session,自己实现session,laravel如何实现session
- AOP如何实现及实现原理
- webpack 实现 HMR 及其实现原理
- Docker实现原理之 - OverlayFS实现原理
- 为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?
- 自己实现集合框架(十):顺序栈的实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JAVA 2核心技术 卷Ⅰ
[美] 霍斯特曼、[美] 科奈尔 / 叶乃文、邝劲筠 等 / 机械工业出版社 / 2006-5 / 88.00元
本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI工具箱进行图形用户界面设计,异常处理、流输入/输出和对象序列化、泛型程序设计等。 本书内容翔实、深入浅出,附有大量程序实例,极具实用价值,是Java初学者和Java程序员......一起来看看 《JAVA 2核心技术 卷Ⅰ》 这本书的介绍吧!