语义分割(semantic segmentation),实例分割(instance segmentation)
联系:语义分割和实例分割都是目标分割中的两个小的领域,都是对输入的图片做分割处理。
区别:通常意义上的目标分割指的是语义分割,语义分割已经有很长的发展历史,已经取得了很好地进展,目前有很多的学者在做这方面的研究。实例分割是一个从目标分割领域独立出来的一个小领域,是最近几年才发展起来的。实例分割比语义分割更复杂,需要在语义分割的基础上对同类物体进行更精细的分割。
Mask R-CNN的架构
Mask-RCNN 大体框架还是 Faster-RCNN 的框架,可以说在基础特征网络之后又加入了全连接的分割子网,由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。Mask R-CNN 采用和Faster R-CNN相同的两个阶段:
第一个阶段具有相同的第一层(即RPN),扫描图像并生成提议(proposals,即有可能包含一个目标的区域);
第二阶段,除了预测种类和bbox回归,并添加了一个全卷积网络的分支,对每个RoI预测了对应的二值掩膜(binary mask),以说明给定像素是否是目标的一部分。所谓二进制mask,就是当像素属于目标的所有位置上时标识为1,其它位置标识为 0。
为了产生对应的Mask,文中提出了两种架构,即左边的Faster R-CNN/ResNet和右边的Faster R-CNN/FPN,如下图所示。
对于左边的架构,我们的backbone使用的是预训练好的ResNet,使用ResNet倒数第4层的网络。输入的ROI首先获得7x7x1024的ROI feature,然后将其升维到2048个通道(这里修改了原始的ResNet网络架构),然后有两个分支,上面的分支负责分类和回归,下面的分支负责生成对应的mask。由于前面进行了多次卷积和池化,减小了对应的分辨率,mask分支开始利用反卷积进行分辨率的提升,同时减少通道的个数,变为14x14x256,最后输出了14x14x80的mask模板。
而右边使用到的backbone是FPN网络,这是一个新的网络,通过输入单一尺度的图片,最后可以对应的特征金字塔。得到证实的是,该网络可以在一定程度上面提高检测的精度,当前很多的方法都用到了它。由于FPN网络已经包含了res5,可以更加高效的使用特征,因此这里使用了较少的filters。该架构也分为两个分支,作用于前者相同,但是分类分支和mask分支和前者相比有很大的区别。可能是因为FPN网络可以在不同尺度的特征上面获得许多有用信息,因此分类时使用了更少的滤波器。而mask分支中进行了多次卷积操作,首先将ROI变化为14x14x256的feature,然后进行了5次相同的操作,然后进行反卷积操作,最后输出28x28x80的mask。即输出了更大的mask,与前者相比可以获得更细致的mask。
backbone
backbone是一系列的卷积层用于提取图像的feature maps,比如可以是VGG16,VGG19,GooLeNet,ResNet50,ResNet101等,这里主要讲解的是ResNet101的结构。
FPN
FPN (feature pyramid network)的提出是为了实现更好的feature maps融合,一般的网络都是直接使用最后一层的feature maps,虽然最后一层的feature maps 语义强,但是位置和分辨率都比较低,容易检测不到比较小的物体。FPN的功能就是融合了底层到高层的feature maps ,从而充分的利用了提取到的各个阶段的特征(ResNet中的C2-C5 )
FPN是为了自然地利用CNN层级特征的金字塔形式,同时生成在所有尺度上都具有强语义信息的特征金字塔。所以FPN的结构设计了top-down结构和横向连接,以此融合具有高分辨率的浅层layer和具有丰富语义信息的深层layer。这样就实现了从单尺度的单张输入图像,快速构建在所有尺度上都具有强语义信息的特征金字塔,同时不产生明显的代价。
ROI Align
Mask RCNN中还有一个很重要的改进,就是ROIAlign(对齐)。Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。而Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。
在Faster RCNN中,有两次整数化的过程:
- region proposal的xywh通常是小数,但是为了方便操作会把它整数化。
- 将整数化后的边界区域平均分割成 k × k k \times k k×k个单元,对每一个单元的边界进行整数化。
两次整数化的过程如下图所示:
事实上,经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题”(misalignment)。
为了解决这个问题,ROI Align方法取消整数化操作,保留了小数,使用以上介绍的双线性插值的方法获得坐标为浮点数的像素点上的图像数值。但在实际操作中,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后进行池化,而是重新进行设计。
下面通过一个例子来讲解ROI Align操作。如下图所示,虚线部分表示feature map,实线表示ROI,这里将ROI切分成2x2的单元格。如果采样点数是4,那我们首先将每个单元格子均分成四个小方格(如红色线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以需要对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行maxpooling,就可以得到最终的ROIAlign的结果。
需要说明的是,在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。
具体网络情况
1)ResNet50网络简单介绍
ResNet50网络主要用来提取图片的特征。
MASKRCNN网络虽然对于输入图片的大小没有要求,但是在代码中存在IMAGE_MIN_DIM和IMAGE_MAX_DIM两个参数的定义,会将图片统一成设定的大小。设定的规则这里主要介绍两种常用的方式:
①‘squre’:先将图片较短边按照IMAGE_MIN_DIM进行等比例缩放,再将图片以零像素填充到IMAGE_MAX_DIM大小
②‘crop’:同样,先将图片较短边按照IMAGE_MIN_DIM进行等比例缩放,再从图片中随机剪裁一个IMAGE_MIN_DIM大小的子图片作为输入图片
这里,基于‘squre’这种方式介绍,即将参数IMAGE_MAX_DIM设定为1024,因此,网络的输入图片大小就是1024*1024
ResNet50网络比较简单,主要包括卷积、BN、RELU三步提取特征的操作,其中:
①C1:25625664表示特征图的大小为256256,特征图的个数是64个
②C2:256256256表示特征图的大小为256256,共有256个特征图
③C3:128128512表示特征图的大小为128128,共有512个特征图
④C4:64641024表示特征图的大小为6464,共有1024个特征图
⑤C5:32322048表示特征图的大小为32*32,共有2048个特征图
C1和C2的特征图大小是一样的,所以,FPN的建立也是基于从C2到C5这四个特征层上。
2)FPN网络的建立
通过ResNet50网络,得到图片不同阶段的特征图,利用C2,C3,C4,C5建立特征图金字塔结构
①将C5经过256个11的卷积核操作得到:3232256,记为P5
②将P5进行步长为2的上采样得到6464256,再与C4经过的256个11卷积核操作得到的结果相加,得到6464256,记为P4
③将P4进行步长为2的上采样得到128128256,再与C3经过的256个11卷积核操作得到的结果相加,得到128128256,记为P3
④将P3进行步长为2的上采样得到256256256,再与C2经过的256个11卷积核操作得到的结果相加,得到256256256,记为P2
⑤将P5进行步长为2的最大池化操作得到:1616256,记为P6
结合从P2到P6特征图的大小,如果原图大小1024*1024,那各个特征图对应到原图的步长依次为[P2,P3,P4,P5,P6]=>[4,8,16,32,64]
3)Anchor锚框生成规则
基于上一步得到的特征图[P2,P3,P4,P5,P6],介绍下MASKRCNN网络中Anchor锚框的生成,根据源码中介绍的规则,与之前的Faster-RCNN中的生成规则有一点差别。
①遍历P2到P6这五个特征层,以每个特征图上的每个像素点都生成Anchor锚框
②以P2层为例,P2层的特征图大小为256256,相对于原图的步长为4,这样P2上的每个像素点都可以生成一个基于坐标数组[0,0,3,3]即44面积为16大小的Anchor锚框,当然,可以设置一个比例SCALE,将这个基础的锚框放大或者缩小,比如,这里设置P2层对应的缩放比例为16,那边生成的锚框大小就是长和宽都扩大16倍,从44变成6464,面积从16变成4096,当然在保证面积不变的前提下,长宽比可以变换为32128、6464或12832,这样以长、宽比率RATIO=[0.5,1,2]完成了三种变换,这样一个像素点都可以生成3个Anchor锚框。在Faster-RCNN中可以将SCALE也可以设置为多个值,而在MASKRCNN中则是每一特征层只对应着一个SCALE即对应着上述所设置的16。
③以P2层每个像素点位中心,对应到原图上,则可生成2562563(长宽三种变换)=196608个锚框
④以P3层每个像素点为中心,对应到原图上,则可生成1281283=49152个锚框
⑤以P4层每个像素点为中心,对应到原图上,则可生成64643=12288个锚框
⑥以P5层每个像素点为中心,对应到原图上,则生成32323=3072个锚框
⑦以P6层每个像素点为中心,对应到原图上,则生成1616*3=768个锚框
从P2到P6层一共可以在原图上生成261888个Anchor锚框
4)生成RPN网络数据集
在上一步已经生成了26188个Anchor锚框,需要借助这些Anchors建立RPN网络训练时的正类和负类,
假设需要的正样本与负样本共计256个Anchor,即RPN_TRAIN_ANCHORS_PER_IMAGE这个参数所指定。源码中这步操作由以下几方面构成:
①先找到所有真实框中那些同时框住了多个物体的框,并排除掉
②计算每个Anchors与该图片上标注的真实框ground truth之间的IOU
- 如果anchor box与ground truth的IoU值最大,标记为正样本,label=1
- 如果anchor box与ground truth的IoU>0.7,标记为正样本,label=1
- 如果anchor box与ground truth的IoU<0.3,标记为负样本,label=-1
剩下的既不是正样本也不是负样本,不用于最终训练,label=0
同时,保证正样本为128个,负样本为128个
除了对anchor box进行标记外,另一件事情就是计算anchor box与ground truth之间的偏移量
令:
ground truth:标定的框也对应一个中心点位置坐标x*,y和宽高w,h*
anchor box:中心点位置坐标x_a,y_a和宽高w_a,h_a
所以,偏移量:
△x=(x*-x_a)/w_a △y=(y*-y_a)/h_a
△w=log(w*/w_a) △h=log(h*/h_a)
这样,经过这一步,共找到128个Anchor作为正样本和128个Anchor作为负样本, 同时,保存了这256个Anchor与真实框ground truth之间的偏移量
5)RPN网络的分类与回归
①前向传播计算分类得分(概率)和坐标点偏移量
RPN网络在分类和回归的时候,分别将每一层的每一个Anchor分为背景和前景两类,以及回归四个位移量,比如P2层,特征图大小为256256,即像素点有256256个,每个像素点有三种长宽比例变换,一共有2562563个Anchor,如果是分类则需要分别计算每个Anchor为前景的得分(概率)或为背景的得分(概率),其数组可定义为[2562563,2],相应的如果是偏移量的回归则数组对应着形式为[2562563,4]
将从P2到P6的所有层进行同样的分类和回归操作,一共得到[261888,2]的分类信息和[261888,4]的回归信息。
②计算RPN网络损失值反向传播更新权重
在‘生成RPN网络数据集’这一步,在261888个Anchors中获得了256个正负样本且与真实框的偏移量。
分类:
从前向传播计算得到的所有Anchors得分数组中即上面所述的[261888,2]数组中找到这256个正样本和负样本所对应的得分,利用得分与正负样本的标签计算交叉熵损失值。
RPN分类使用的是基于Softmax函数的交叉熵损失函数,Softmax函数只要是将前向传播计算的得分归一化到0~1之间的概率值,同时,经过Softmax函数后,也可以保证各个分类的概率不会出现负数
回归:
从前向传播计算得到的所有Anchors偏移量数组中即上面所述的[261888,4]数组中找到这128个正样本所在索引对应的偏移量,利用此前向传播计算得到的偏移量与正样本与真实框之间计算的偏移量计算损失值。
6)根据RPN调整生成ROI
这一部分对应着总网络图中的ProposalLayer层,取出一定量的Anchors作为ROI,这个量由源码中参数POST_NMS_ROIS_TRAINING确定,假设这个参数在训练的时候设置为2000,则我们这里需要从261888个Anchors中取出2000个作为ROI
首先,按照Anchors经过RPN网络前向传播计算得出的前景(或称为正样本)的得分从高到低排序,取出前2000个得分最高的Anchors,相对应的将2000个Anchors经RPN网络前向传播计算出的偏移量累加到Anchor box上得到较为准确的box坐标。
其中,红色的A框是生成的anchor box,而蓝色的G’框就是经过RPN网络训练后得到的较精确的预测框,绿色的G是ground truth box
7)生成RCNN网络数据集
这一部分对应着总网络图中的DetectionTargetLayer层。在经过ProposalLayer层之后得到了2000个经过微调后的ROI,而在DetectionTargetLayer需要对2000个ROI做以下几步:
①首先剔除掉2000个ROI中不符合条件的ROI,主要是在ProposalLayer层最后返回的时候如果不足2000个会用0填充凑足,将这些用0填充的全部排除掉,避免参与不必要的计算
②DetectionTargetLayer中会用到图片中的真实框信息,所以,在使用之前同样将所有真实框中那些同时框住了多个物体的框,并排除掉
③计算每个ROI与真实框之间的IOU值
如果ROI与ground truth的IoU>0.5,标记为正样本
如果ROI与ground truth的IoU<0.5,标记为负样本
假定正样本个数只保留到100个,而负样本一般保持是正样本数的3倍,正负样本总数则就可以达到400个,这个400可有配置文件中TRAIN_ROIS_PER_IMAGE参数确定
④对于每个正样本,进一步计算与其相交最大即最接近的真实框ground truth box,将这个真实框所对应的类别即class_id赋予这个正样本,这样RCNN网络就可以区分具体哪个类别
⑤同样,计算每个正样本ROI与最接近的真实框ground truth box之间的偏移量,这RPN中的计算公式一样
⑥RCNN网络还需要保存与每个正样本ROI最接近的真实框ground truth box的mask掩码信息,并且知道每个mask大小为参数MASK_SHAPE所指定,一般为28*28,同时知道其所属于的类别即class_id,进行保存
最后DetectionTargetLayer层返回400个正、负样本,400个位移偏移量(其中300个由0填充),400个掩码mask信息(其中300个由0填充)
8)ROI对齐操作
在ROI 对齐操作中mask分支对齐成14*14大小的feature map,并且在‘生成RCNN网络数据集’操作中知道每个正样本mask掩码区域对应的class_id
i) 前向传播:将1414大小feature map通过反卷积变换为[2828*num_class],即每个类别对应一个mask区域,称之为预测mask
ii) 与‘生成RCNN网络数据集’操作中的返回的mask也是28*28,并且知道每个mask区域的真实类别class_id,称之为真实mask
iii) 通过当前得到的真实mask中的类别class_id,遍历所有的预测mask,找到class_id类别所对应的预测mask(前向传播中介绍过每个类别都有一个预测mask),比较真实mask与预测mask每个像素点信息,用的是binary_cross_entropy二分类交叉熵损失函数
参考
https://zhuanlan.zhihu.com/p/37998710
https://blog.csdn.net/u010901792/article/details/100044200
https://www.cnblogs.com/wangyong/p/10614898.html