MaskRCNN
maskRCNN:https://blog.csdn.net/weixin_43702653/article/details/124377487
https://www.cnblogs.com/wangyong/p/10614898.html
https://zhuanlan.zhihu.com/p/407831250
feature map:https://blog.csdn.net/MengYa_Dream/article/details/123705503
FPN网络:https://zhuanlan.zhihu.com/p/562953949
感受野:https://zhuanlan.zhihu.com/p/394917827
ROI Align:https://zhuanlan.zhihu.com/p/73113289
https://blog.csdn.net/Tian__Gao/article/details/124474448
双线性插值法:https://zhuanlan.zhihu.com/p/191260037
FCN:https://zhuanlan.zhihu.com/p/384377866
转置卷积:https://blog.csdn.net/weixin_39910711/article/details/124342599?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-124342599-blog-121181904.235v38pc_relevant_anti_t3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
maskRCNN在fasterRCNN的基础上,与bounding box检测并行地增加了一个预测分割mask的分支,相当于将目标检测和语义分割结合起来,从而达到实力分割的效果。
实例分割
实力分割和语义分割的区别:语义分割会分割出不同类别的物体,而实力分割可以分割出同一类中的不同实例的物体。
基本结构
maskRCNN的基本结构图
maskRCNN的基本结构如上图所示。其流程步骤如下:
- 输入一张图片,经过预训练好的CNN(ResNet+FPN)得到feature map;
- 对feature map的每一个点预设一些ROI,从而获得多个候选的ROI;
- 对这些ROI送入RPN网络进行二值分类(前景或背景)和bbox回归,过滤掉超出图像区域的ROI;
- 进行ROI Align操作,将原图和feature map的像素对应起来,然后将feature map和固定的feature对应起来;
- 对ROI进行N类别分类、bbox回归和mask生成(在每个ROI中进行FCN操作)。
maskRCNN相对于fasterRCNN的结构变化
如上图所示,maskRCNN相对于fasterRCNN的结构变化有有如下几个:
- 使用的ResNet+FPN代替fasterRCNN中的vgg网络;
- 将ROI pooling替换为ROI alig;
- 添加并列的FCN层,完成语义分割任务。
1. FPN
浅层网络中的特征语义信息比较少,但是目标位置准确;深层的特征语义信息比较丰富,但是目标位置比较粗略(原因:浅层网络的感受野较小,每一个像素点代表的区域很小,能够利用更多细粒度特征信息;随着下采样或卷积次数的增加,感受野逐渐增加,每一个像素点代表一个区域的信息,相对不够细粒度。感受野:特征图上的一点,相对于原图的大小)。
FPN的目标:先通过下采样得到语义特征,然后在保留语义特征的基础上进行上采样,最终得到既有语义特征、又有细粒度特征的网络。因此FPN的网络结构可以分为两个部分:自底向上和自顶向下。
FPN网络结构
FPN网络结构以及自顶向下过程中的上采样机制
FPN的网络机构如图所示:
- 在自底向上的过程中,通过卷积和池化提取对特征图进行降维,依次得到\(C_1\), \(C_2\), \(C_3\), \(C_4\), \(C_5\)五个特征图。其中,因为\(C_1\),和\(C_2\)的特征图的大小是一样的,所以FPN的建立基于\(C_2\)到\(C_5\)这四个特征层。
- 在自顶向下的过程中,需要进行上采样,同时将上采样结果和下采样过程中的特征图进行merge。同时还需要进行卷积操作,消除上采样中的混叠效应。首先\(C_5\)通过\(1 \times 1\)的卷积生成\(P_5\),再进行对\(P_5\)进行步长为2的下采样,将下采样结构与\(C_4\)经过\(1 \times 1\)的卷积的结果merge的到\(P_4\),依此类推得到\(P_2\), \(P_3\)
- 对\(P_5\)进行步长为2的max pooling得到\(P_6\).
Anchor生成规则
规则:
- 遍历\(P_2\),到\(P_6\)这五个特征层,对特征层上的每一个像素都生成anchor;
- anchor生成规则:以\(P_2\)层为例,其相对于原图的步长为4,因此对于\(P_2\)上的每一个尺寸预设为anchor scale锚框,都能够在原图上对应一个\(4\times4\times anchor scale\)的锚框。同时,我们可以为锚框设置长宽比变换,如
RATIO=[0.5,1,2]
,就可以基于每个锚框得到三种不同尺寸的锚框。在fasterRCNN中可以将anchor scale设置为多个值,而在maskRCNN中每一个特征层只对应着一个anchor scale。
例如,如果我们将anchor scale设置为\(4\times4\),则在\(P_2\)上,可以生成\(256\times256\times3(三种长宽比)\)个锚框。
2. ROI Align
ROI pooling需要进行两次量化操作:图像坐标->feature map; feature map->ROI feature坐标。这两个操作导致ROI pooling并不是按照像素一一对齐的,因此对掩码的精度有较大的影响。因此使用ROI Align来代替ROI pooling。
ROI pooling的基本步骤
在得到ROI后,如果ROI的边界没有位于feature map的网格,需要进行对齐操作,如下图所示。这一步中会引入位置的偏差。
在进行完上一步后,需要划分子区域。此时如果ROI的大小为\(5\times7\),则对于长度为奇数的边进行先取平均值再向上向下取整的操作,再对子区域做max pooling,如下图所示,这一步也会引入偏差。
ROI Align的步骤
首先,对浮点数边界不做对齐;其次划分子区域时采用均匀划分。
对于划分的每个子区域,取得四个采样点(选取方式为将子区域划分成四个子子区域,并取每个子子区域的中心点),再利用双线性插值法计算四个采样点的像素值大小,最后通过max pooling或average pooling对每一个子区域执行聚合操作,得到最终的特征图。
双线性插值法
首先介绍一下插值法。插值法是在图像缩放的过程中,将旧图片中的像素放到新图片中时所使用的算法。对于原图像中的像素的坐标\((src\_x,src\_x)\),假设原图像的宽高为\(src\_w\),\(src\_h\),目标图像的宽高为\(des\_w\),\(des\_h\),则对应的目标图像中的\(x\)坐标为:
如果得到的\(des\_x\)和\(des\_y\)不是整值的话,就需要使用插值的方法。速度最快但效果最差的是最近邻插值法,直接用计算结果找到最邻近的点。
而双线性插值法则不是找到附近的一个点,而是找到四个点。双线性插值可以看作进行三次单线性插值,两次x一次y或者两次y一次x。单线性插值就是利用直线上一点到直线两端的关系,得到如下的关系:
3. FCN层
传统的CNN会将图像下采样后,最后输出一个n维的向量来表示输入图像属于每一类的概率。而FCN则是对图像进行像素级的分类,深度模型后使用转置卷积进行上采样,最后输出的heat map上的每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息。
FCN网络的流程如下(如下图所示):
- 输入的图像经过convi+pooli(i=1~5)进行下采样,得到1/32尺寸特征图;
- 经过两个卷积层后图像尺寸不变;
- 使用转置卷积对1/32特征图进行上采样,得到图像预测结果FCN-32s;
- 将1/32特征图进行2倍上采样,再和pool4的1/16特征图进行融合,对融合原理进行上采样得到预测图FCN-16s;
- 最后将pool3的1/8特征图与1/16图和1/32图做上述同样的操作,最后上采样得到图像预测FCN-8s。