1、只训练非resnet部分的所有网络。(其余部分不训练,即不进行梯度计算以及优化更新)

2、对于输入:保持长宽比用双线性插值resize训练图片成1024*1024(若图片不是正方形的就加zero padding),并且分别对图片的rgb每个通道减去整个训练集在rgb上各自的均值。随机翻转

3、RPN网络会输出每个anchor是背景和含物体的概率:

为了判定它predict的是否正确,需要知道每个anchor是否含有物体的正确答案作为label:计算该图每个anchor与该图gt_bbox的iou,iou>=0.7的anchor标注为是含有物体的正样本,iou<0.3的anchor标注为是背景的负样本,iou在这之间的anchor为无关样本,不参与loss的计算。并且标注为正负anchor的总数为256(即只有这256个anchor参与loss的计算),且正样本数量不能超过128,超过部分则标注为无关样本,不足部分由负样本填充至256个。

对RPN预测的每个anchor的得分,只看那256个标注了正负样本的anchor,计算其softmax_cross_entropy。(若某anchor的标注为正样本,则对RPN网络预测的该anchor是包含物体的概率进行-log得出该anchor的softmax_loss)

 

 

RPN网络会输出每个anchor的回归参数:

为了判定网络输出的anchor的回归参数是否准确(即通过这个回归参数的调整能否将anchor的位置调整成和gt_bbox重合),则需要计算出准确的回归参数作为label(即对该anchor进行某个回归参数调整,使得该anchor恰好能与gt_bbox重合,则这个回归参数就是该anchor的回归参数的正确答案,即label)。(注:然后还要将回归参数除一个[0.1,0.1,0.2,0.2])

对RPN预测的每个anchor的回归参数,只看正样本对应的预测回归参数(负样本是背景,调整个啥),计算该回归参数和该anchor的正确回归参数的L1_smooth_loss。

(是将预测出的回归参数和除了[0.1,0.1,0.2,0.2]的label回归参数做loss)

MASK RCNN

(L1 loss是差的绝对值,即预测的4个回归参数和正确的4个回归参数的差的绝对值之和)

(而绝对值函数在x=0处导数不唯一,所以smooth就是在其x为零附近将其变为x方函数)

4、根据RPN网络对每个anchor的预测,选出含物体概率最高的前6000个anchor,并根据预测的回归参数对这些anchor进行调整,然后再用nms(阈值0.7)留下最多2000个anchor作为proposal,进行ROI Align以及classifier。

5、计算2000个proposal与该图gt_bbox的iou,iou>=0.5的proposal标注为那个gt_bbox的类别,iou<0.5的proposal标注为背景类。计算标注为某类别的proposal和其所对应的gt_bbox之间的的回归参数(并除一个[0.1,0.1,0.2,0.2])。保证物体类的proposal数量和背景类的proposal数量比值为1:3,且他们的总数不能超过200。

6、这些proposal只是对应与原图上的框,而送入classifier网络的要是这些框所对应的特征,所以根据视野域映射的关系算出这些框在feature map上的位置,然后用ROIAlign提取成固定大小(7*7)的特征送入classifier网络,得出这些proposal的分类概率以及回归参数。根据5中所述label计算loss(依旧是softmax_loss和L1_smooth_loss)

7、根据5中的不到200个proposal,按6中的方法从feature map中ROIAlign出14*14的特征,送入mask网络,对每个proposal得出81*28*28的predict结果。用的是bce loss计算mask的损失

8、最后将以上所有损失相加得出最终的损失,以此损失函数进行梯度计算,优化更新。

 

Inference:

一、预处理:

保持长宽比用双线性插值将image resize成1024*1024(若图片不是正方形的就加zero padding),并且对image的三个维度分别减去3个均值(这3个均值是整个训练集图片 在该维度的均值),就以此为输入就这么送进网络了,没有归一和其它任何操作

 

二、Resnet:

首先进入Resnet进行特征提取

 

三:FPN:

使用Resnet的中间四层(res2、res3、res4、res5)送入FPN网络进行高低语义间的特征融 合(网络结构见后图)

 

四、RPN:

将FPN的输出(P2、P3、P4、P5、P6)送入RPN网络,得出261888个anchor的得分及回 归参数(网络结构见后图)

(我大概算了下,P2对应输入的原图的视野域为25*25,所以P2用来预测scale为32*32的anchor是合理的)

 

五、Proposal:

1、从261888个anchor中选出为非背景类得分最高的前6000个anchor,根据对应的回 归参数对6000个框的位置大小进行调整,并将调整后的框,大小超出window边界的 部分进行裁剪。

注:window指的是不包含padding部分的图片

附:微调步骤:

(1)、将每个框的回归参数[dy,dx,dh,dw]乘上一个用来对回归参数进行归一化的参数 [0.1,0.1,0.2,0.2],得出新的[dy,dx,dh,dw]进行接下来的操作

(2)、将框的中心点向x方向移动dx乘框的宽度那么多距离,向y方向移动dy乘框 的高度那么多距离,然后将框的高度调整为高度乘e的dh次方,将框的宽度调整为宽 度乘e的dw次方。

(为什么以框的长宽为比例进行平移:这样对于不同大小的图片才是合理的)

(为什么放缩的比例是e的x次方:保证放缩的值是个正数)

2、对6000个经过微调裁剪的框进行nms算法(阈值0.7),留下最多1000个,这就是得出的proposal

 

六、RoIAlign:

1、首先根据公式k = k0+log2(sqrt(hw)/224)算出这1000个proposal要用P2、P3、P4、P5这四个feature_map中的哪个来进行RoIAlign进行特征提取(k为几就是P几,P2~P5有4个,所以k0为4,sqrt为根号,h和w为proposal的长和宽,面积大的proposal对应视野域大的feature_map(如P5),面积小的proposal对应视野域小的feature_map(如P2))(若k大于5则k=5,若k<2则k=2)

2、对每个proposal在其对应的feature_map上做RoIAlign,首先根据proposal坐标(y1,x1,y2,x2),找到该proposal在对应feature_map上的位置,设fm的长宽为h和w,则该proposal对应于fm上第h*y1列~h*y2列、w*x1行~w*x2行这块区域,对该区域的特征向量进行RoIAlign,输出固定的7*7大小的输出(pool_size=7),RoIAlign的具体操作见后例

 

七、Classifier:

对1000个proposal进行RoIAlign后得出1000个7*7*256的矩阵(因为进行RoIAlign操作的feature_map都是厚度为256的,对每层按上例方式进行RoIAlign,得出的是7*7*256的矩阵),将这1000个7*7*256矩阵送入分类网络中(网络结构见后图),得出1000*81的矩阵,表示每个proposal是这81个类中各个类的概率,概率最高的类则是这个proposal的类别,以及一个1000*81*4的回归参数,从中选出得分最高那类的回归参数对proposal进行调整并对超出window的部分进行裁剪,方式同之前。

 

八、Final:

此时得到了经过调整裁剪的1000个框,以及这些框所属的类别,以及信心值(即判定 为该类的概率),将这1000个框中,信心小于0.7的框删掉,判定为背景类的框删掉, 对同类别的框之间进行阈值为0.3的nms,得出最终的bounding-box。

 

九、Mask:

首先要对上面得出的n个bbox用同样的公式算出其对应的feature_map,同样在上面进 行RoIAlign,pool_size为14,得出14*14*256的矩阵,送入一段Mask-branch进行分割 (网络结构见后图),sigmoid后输出28*28*81的矩阵,只使用81层中的对应于该bbox 所属类的那层,大于0.5的位置判定为是该类,得到28*28的分割图,将其resize成bbox 的大小,得出分割结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附:

 

一、FPN

MASK RCNN

二、RPN

MASK RCNN

(最后一列的shape写错了..)

 

 

 

 

 

三、Classifier

MASK RCNN

四、Mask-branch

MASK RCNN 

五、RoIAlign示例:

 

1   2   3   4   5

6   7   8   9   10

11  12  13  14  15

16  17  18  19  20

21  22  23  24  25

(proposal在fm上的区域,对此进行RoIAlign)

 

1   5

-----假设pool_size是2-----> 21  25  

(RoIAlign后,只取4个角)

 

 

1   3    4

-----假设pool_size是3-----> 11  13   15  

21  23   25

(RoIAlign取四个角,其它的数刚好可以从5*5矩阵中均匀取得)

 

 

1       2.33    3.66     5

-----假设pool_size是4----->   7.66     9     10.33    11.6

14.33   15.66    17     18.33

21      22.33   23.66    25

(pool_size为4时,无法均分5*5的矩阵,要插值取得,5*5的矩阵长宽为4,要输出长宽为3的4*4的矩阵,则要均分的话就要对5*5矩阵每4/3距离取一个数,第一个数取左上角的1,然后隔4/3距离,落在2的右边1/3处,用双线性插值,得出该值2.33;再看第二行的7.66,是落在原矩阵6下方1/3处,插值而得;以及旁边的9,是落在原矩阵7、8、12、13之间,离7的面积为1/9处,经这4个数插值而得)

 

-----假设pool_size是1-----> 13

(RoIAlign是要固定四角的数的,但是poolsize为1,

则直接取矩阵最中心的数,这里不需要插值,为最中心的13)

 

另:https://blog.csdn.net/zijin0802034/article/details/77685438

 

相关文章: