原文:MaskScoringRCNN理解 - 知乎 - 2019.04.30
Mask RCNN 作为实例分割的经典之作,其是在 Faster rcnn 的基础上,增加mask分支. Mask 分支的输入是RPN阶段获取到的 proposal boxes(满足与ground truth大于阈值0.5). 输出是该区域内预测得到的mask图.
Mask Rcnn的创新点还主要在于ROIAlign,为了解决多次取整偏移造成的像素偏差.
但,在实例分割中,往往采用实例分类的置信度(confidence of instance classification) 作为 mask 质量分数(quality score). 而,采用实例 mask 和 GT mask 的 IoU 作为 mask 质量,往往是与分类置信度关联性不大的.
Mask Scoring RCNN 是 MaskRCNN 两年后的改良版本,其创新点在于,剔除MaskIOU分支,通过计算mask分支得到的 mask 与ground truth对应的mask之间的像素级别的IoU值,来衡量分割的精确程度.
图 1. Mask RCNN 和 Mask Scoring RCNN 对比. 边界框与GT 重合度高且分类置信度高时,mask 结果并不够好.
Mask Scoring RCNN和Mask RCNN 类似,只是在Mask RCNN 的基础上,增加了MaskIOU分支,整个网络是端到端的.
Mask Scoring RCNN 针对的是所强调的 Mask RCNN 中 mask 的置信度不能很好的反应分割质量的问题.
Mask RCNN 中,损失函数计算为:
$$ L = L_{cls} + L_{box} + L_{mask} $$
即为:分类置信度的损失函数、box 回归的损失函数、mask 分割的损失函数,三者之和.
$L_{cls}$ 和 $L_{box}$ 与 Faster RCNN 相同.
$L_{mask}$ 为新增分支的 mask 分割的损失函数,假设有 K 个类别,则 mask 分支的输出维度为 Kxmxm. 其中,m 为 feature map 的长宽. 每个 mxm 的 feature map 的值都是该类别的二值化结果(使用 sigmoid 计算). 但,实际上最后计算的 loss 是,其 GT 对应的类别 k 所对应的二值化 mxm mask;而其他类别所产生的 mask 对 loss 计算是没有贡献的. $L_{mask}$ 的计算方式为,平均二值化交叉熵损失函数.
而,在实例分割中,可以得到一个位置精确且置信度很高的bbox,但是对应的mask可能是不准确的. 因此,Mask Scoring RCNN 提出计算 MaskIOU 的方式,利用分类的置信和 maskiou 值的乘积作为该mask的置信.
由于Mask Scoring RCNN 和 Mask RCNN 的大致过程是一样的,在这里详细描述训练过程中loss计算的方式的比对,突出其特点.
在前向计算阶段,MaskIoU head 分支仅用于修正 mask 的置信度(bbox的置信confidence* iouRatio).
详细地说,步骤就是:
[1] - 假设RCNN 阶段输出 N 个 bounding boxes, 利用SoftNMS从中挑选top-k个(k=100)boxes
[2] - 这些boxes送到mask分支生成 multi-class masks.(截止到此是标准的maskrcnn的前向过程)
[3] - 把这些top-k个 mask 送到MaskIOU 分支,得到 iou 比值, 因此,mask score= confidence*maskiou.