mask RCNN不仅能够同时进行目标检测与分割,还很容易拓展到其他任务中。
Mask RCNN沿用了Faster RCNN的思想,特征提取采用ResNet-FPN的架构,另外多加了一个Mask预测分支。
1、Faster RCNN
参考
感觉这一篇讲的很好,本文只摘抄其中一部分,具体看原文。
Faster RCNN在结构上已经将特征抽取(feature extraction),proposal提取,bounding box regression ,classification都整合在一张网络中,综合性能有较大提升,检测速度快。其包含两个阶段。包括阶段1的Region proposal以及阶段二的bounding box回归和分类
1、Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2、Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
3、Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
4、Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
使用CNN提取图像特征,使用region proposal network (RPN)提取出ROI(Region of Interest)。然后使用ROI pooling将这些ROI全部变成固定尺寸,再喂给全连接层进行Bounding box回归和分类预测。
2、ResNet-FPN
Feature Pyramid Network (FPN,金字塔型特征网络)是一种精心设计的多尺度检测方法。FPN结构中包括自下而上,自上而下和横向连接三个部分,如下图所示。这种结构可以将各个层级的特征进行融合,使其同时具有强语义信息和强空间信息。
FPN是一种通用的架构,可以结合各种骨架网络使用。
3、ResNet-FPN+Fast RCNN
将ResNet-FPN和Fast RCNN进行结合,实际上就是Faster RCNN的了,但与最初的Faster RCNN不同的是,FPN产生了特征金字塔 图片,而并非只是一个feature map。金字塔经过RPN之后会产生很多region proposal。这些region proposal是分别由 图片 经过RPN产生的,但用于输入到Fast RCNN中的是 图片,也就是说要在 图片 中根据region proposal切出ROI进行后续的分类和回归预测。问题来了,我们要选择哪个feature map来切出这些ROI区域呢?实际上,我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个图片 来切:
这里224表示用于预训练的ImageNet图片的大小。 图片 表示面积为 图片 的ROI所应该在的层级。作者将 图片 设置为4,也就是说 图片 的ROI应该从 图片 中切出来。假设ROI的scale小于224(比如说是112 * 112), 图片 ,就意味着要从更高分辨率的 图片 中产生。另外 k 值会做取整处理,防止结果不是整数。
这种做法很合理,大尺度的ROI要从低分辨率的feature map上切,有利于检测大目标,小尺度的ROI要从高分辨率的feature map上切,有利于检测小目标。
(个人理解:在这里初始设置的224以及K0,都是根据FPN的层数以及原图像的大小来决定的)
4、ResNet-FPN+Fast RCNN+mask
将ResNet-FPN+Fast RCNN+mask,则得到了最终的Mask RCNN,如下图:
Mask RCNN是在ROIAlign之后添加卷积层,进行mask预测的任务。
5、总结
Mask RCNN的网络:
骨干网络ResNet-FPN,用于特征提取,另外,ResNet还可以是:ResNet-50,ResNet-101,ResNeXt-50,ResNeXt-101;
头部网络,包括边界框识别(分类和回归)+mask预测。头部结构见下图:
6、RoIAlign
Mask RCNN中还有一个很重要的改进,就是ROIAlign。Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。而Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。
RoIAlign 效果优于 RoIPooling
RoIPooling 在定位的时候是采取的 取整操作,RoIAlingn在定位是采取不取整操作。
在RoIPooling中 有一个参数sampling ratio,在每个子区域中采样的个数==sampling ratio 的平方。
1双线性插值
1线性插值
已知数据 图片 与 图片 ,要计算 图片 区间内某一位置 图片 在直线上的 图片 值,如下图所示。
通过斜率公式得到:
y = +
+
2双线性插值
双线性插值本质上就是在两个方向上做线性插值
双线性插值公式为
这样就得到所要的结果f(x,y)
引用自双线性插值
2 ROI Pooling(Region of Interest Pooling,即感兴趣区域池化)
直接通过一个例子来形象理解。假设现在我们有一个8x8大小的feature map,我们要在这个feature map上得到ROI,并且进行ROI pooling到2x2大小的输出
假设ROI的bounding box为
将它划分为2x2的网格,因为ROI的长宽除以2是不能整除的,所以会出现每个格子大小不一样的情况。
进行max pooling的最终2x2的输出为:
通过两次取整操作,此时的候选框已经和最开始回归出来的位置有一定的偏差,会影响检测或者分割的准确度。在论文中被总结为“不匹配问题”(misalignment)但是在ROI Align 中,不进行整数化的操作,使用双新型插值的方法获得坐标为浮点数的像素点上的图像数值。
最终的采样结果对采样位置以及采样点的个数并不敏感。
7 损失
mask分支
在Mask R-CNN中,对预测mask以及Class进行解耦 。
训练网络的时候输入Mask分支的目标是由RPN提供的,即Proposals(正样本),但预测的时候输入Mask分支的目标是由Fast R-CNN提供。
语义分割与实例分割的区别
-
语义分割:
- 任务:在图像中为每个像素分配一个语义类别,例如“人”、“车”、“狗”等。
- 输出:对于输入图像的每个像素,都会预测其所属的语义类别。
- 特点:忽略了不同个体之间的区别,只关注整体像素的类别。在像素级别上提供了语义信息,但不提供个体的区分。
- 示例:对于一张包含人、车、狗和树的图像,语义分割将为图像中的每个像素分配一个类别标签,例如人的像素被标记为“人”,车的像素被标记为“车”,以此类推。
-
实例分割:
- 任务:在图像中识别和分割出每个个体对象,并为每个对象分配一个唯一的标识符(ID)。
- 输出:对于每个检测到的对象,生成一个二进制掩码,其中像素值为 1 表示属于该对象,像素值为 0 表示属于背景。
- 特点:不仅提供了语义信息,还提供了个体对象的识别和分割,每个对象都有一个唯一的标识符。
- 示例:对于一张包含多个人、车、狗和树的图像,实例分割将为每个个体对象生成一个独立的二进制掩码,以区分不同的对象。
总的来说,语义分割关注的是像素级的语义信息,而实例分割不仅提供了语义信息,还能够区分不同的个体对象。