当前位置:   article > 正文

Mask Rcnn详解_maskrcnn损失函数

maskrcnn损失函数

Mask RCNN介绍

Mask R-CNN是何恺明在ICCV 2017上发表的实例分割模型(Instance segmentation),实例分割主要在目标检测的基础上获得每个目标的分割掩码。

模型结构及数据变化推理

模型基本结构由:backbone(FPN)+RPN+RoI Align+预测头( box, class, mask)几部分组成,输入图像,输出预测的目标类别(class)、目标位置框(box)、基于目标框的掩码(mask)三部分,为便于理解模型使用中数据的变化,本文忽略batch这一维度,相当于直接输入一张图像进行数据推理。

backbone(FNP)

backbone:骨干网络,通过一系列卷积池化+残差拼接,获得图像的深度特征信息(feature map)

FNP:特征金字塔,在骨干网络卷积过程中,其中间层会产生不同尺度的特征信息 ,大小分别为原图大小的1/4,1/8,1/16,1/32,1/64,这些尺度不同、深度不同的特征信息更利于全面获取图像的高低维度信息,将这些选择不同尺寸的特征信息共同称为特征金字塔,也就是后续要利用的feature map。

输入:图像 [3, image_height, image_weight]
最后输出:[channe, 1/4image_height, ,1/4image_weight]……[channe, 1/64image_height, ,1/64*image_weight] 代表5个尺度的特征量,其中channe代表特征通道数。

RPN

RPN:Region Proposal Network,用于利用backbone产生的feature map 生成感兴趣区域候选框Proposal ,感兴趣区域就是可能有目标的区域

输入:back bone的输出,[channe, 1/4image_height, , 1/4*image_weight ] ……,
输出:卷积生成两束分支,分别是bbox,class 共同代表候选框信息,它们是成对出现的,个数是一系列候选框,这些候选框经过非极大值抑制等筛选才会形成真正的候选框,真正候选框才有id(ROI_id)
(1)bbox:now_height, now_weight, k, 4
(2)class:now_height, now_weight, k, 2
上述公式代表在输入图上每个像素点上产生K个候选框,now_heigh指的输入的特征的尺度宽高。K一般是3,代表3个锚框(anchor),数字4代表预测的anchor的放缩比例,数字2代表该候选框是否含有目标(0,1),即前景和背景的概率,该输出信息除了用于向后传递,还参与损失计算。

RPN处理后的输出bbox和class 和生成的所有anchor进行进一步处理:
用class输出进行得分排序筛选,获得6000个得分靠前的anchor
用bbox输出对筛选后的anchor进行回归纠正,得到更准确的anchor
删除不合理的anchor,如超出原图的
NMS筛选,得到2000个anchor

ROI Align

经过RPN生成并筛选的anchor候选框与backbone输出的feature map相结合,生成ROI Align的输入roi信息,结合过程如下:
输入:bbox++feature map
输出:roi(roi_id, roi_height, roi_weight, channel)
具体细节:对将NMS得到的anchor进行判断,判断其应该在哪个尺度上的feature map进行roi采用,具体判断方式主要是利用anchor的大小生成一个判断指标。得出判断结果后将anchor转化到具体尺寸下的大小,并扣去该位置下的对应feature map,注意这儿anchor的是个坐标点是通过双向线性插值取得的(参考faster rcnn中的实现)。

在特征通道上采样生成的ROI需要resize,生成大小相同的ROI特征,t同样涉及双向线性插值。

输入:roi(roi_id, roi_height, roi_weight, channel)
输出:roi_id, channel, poolsize, poolsize

roi_id代表RPN后经过筛选的有用的候选框的id;
channel代表feature map的一样的多少层的特征通道数量,poolsize就代表将不同的候选框resize成大小一样的矩形,方面后续数据处理。

预测头( box, class, mask)

利用ROI Align输出,生成真正的预测结果数据
主要是卷积池化全连接生成两个分支(类别边框预测分支、掩码预测分支)
注意ROI其实分别为两个分支独立运行了两遍,生成的poolsize不相同,分贝为77和1414

box, class分支

就是利用卷积池化全连接,分别预测class和box
输入roi_id, channel,7,7
输出:
class(roi_id,numclass),numclass代表每个类别的概率;
box(roi_id, numclass,4),代表每个类别下的box信息,数字4代表 y1,x1,y2,x2。最终计算损失时只会取一个类别下的box信息。

mask分支

利用卷积池化反卷积,为每个目标候选框生成一个掩码(0,1填充)
输入:[roi_id, channel,14,14]
输出:[roi_id,numclass, 28,28],代表为每个可能的类别都生成了掩码,计算损失时指只会去一个掩码
(1),注意,掩码虽然是28*28的方阵,而目标框是大小长宽不一的矩形,计算掩码顺时时会先将方阵转换到对应候选框的大小,再计算掩码信息。

模型训练流程

了解了基本的框架和数据走向,介绍训练过程中,具体细节(待补充2022.10.5)

模型推理(测试)流程

推理过程中数据处理流程;(待补充,2022.10.5)

(补充)损失计算

损失的计算非常有特色(待补充,2022.105)
Mask Rcnn一共有5个损失函数分别是:

1、rpn网络的两个损失:RPN的class、bbox输出和input_rpn_match、input_rpn_bbox两两对应的损失
这个损失的具体理解建议结合代码进行理解。主要是以下两个参数的由来。
(参考大佬博主 https://blog.csdn.net/u012655441/article/details/122304099的代码理解)
input_rpn_match:对于真实的前景目标,从所有原生图像的所有anchor 中,依照目标是否存在和IOU两方面找到最接近真实目标的anchor,为这些anchor赋予正负样本以及box的转化比例
input_rpn_bbo:与上相同,就是从所有anchor和真实目标标签中生成的

2、类别边框预测分支的两个损失:就是输出类别边框和真实类别边框两两建立损失。

3、以及mask分支的损失函数:就是预测mask和真实mask建立损失。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号