自从深度学习被应用到计算机视觉领域,目标检测算法在短时间内有了很大的进步,甚至有人为了抢个车位用上了Mask R-CNN进行自动检测
能有这样的神仙操作,多亏了Mask R-CNN在物体检测中能得到像素级别的检测结果。Mask R-CNN能够对每一个目标物体,不仅给出其边界框,并且对边界框内的各个像素是否属于该物体进行标记!
本文选自《深度学习与目标检测》一书,带我们一同来了解一下这个神奇的Mask R-CNN~
2017年,Kaiming He等人提出了针对实例分割(instance segmentation)的Mask R-CNN模型[1],将Mask R-CNN看成在Faster R-CNN基础上进行的扩展,在其已有的基于边界框识别的分支上添加了一个并行的用于预测目标掩码的分支,以完成实例分割任务。
实例分割简介
语义分割(semantic segmentation)通常是在像素级别上进行的,用于标注不同的类别。
例如,在自动驾驶项目中,一个类别可能是指行人、车辆、广告牌或者其他模型需要识别的类别。模型通过学习,最终会形成对行人、车辆、广告牌等不同类别的划分标准。但是,若仅进行语义分割,有时会出现问题,如图。
语义分割
上图是一幅标注得很精确的语义分割图片,不仅不同类别之间的边界清晰,而且分类准确。但是,图中所有的车都被标注成“车”这个类别(因为图片上的车之间有重叠,所以有些算法在理解这个信息时就会遇到问题)。毕竟这不是一辆长度为一个街区长度的履带式车辆,而是一系列前后排列的、单独停在路边的车辆。
语义分割只能区分不同的类别,但不能区分不同的实例(两辆车虽为同一类别,但它们作为不同实例的区别并不能在语义分割中体现)。
这时,实例分割的意义就显现出来了。实例分割可以作为目标检测与语义分割的结合,它不仅能在图像中正确地将目标检测出来,还能对每个目标实例进行精准的分割,效果如图。
实例分割
实例分割是在语义分割的基础上对不同的实例进行逐像素的分割。
与语义分割相比,实例分割对属于同一个类别的不同目标实例进行了区分。这样的标注更容易让自动驾驶车辆模型取得满意的结果。尽管基于实例的标注会花费较长的时间,但是对企业级的标注项目而言,可以通过这个细微的变化大幅提升精确度,进而得到更优秀的算法。
COCO数据集的像素级标注
Mask R-CNN的训练是在COCO数据集上进行的。
在COCO数据集的目标检测任务中,检测结果的保存格式有两种:一种是使用一个2D边界框来定位图像中不同的目标(在对定位精度要求较高的应用中显得有些粗糙);另一种是逐像素对目标进行分割(相应地,图像中的每个像素都会被标注出来)。尽管不同的标注方式来源于不同的项目需求,但近年来对像素级别的实例分割的需求正在增加。
COCO数据集逐像素分割的总体思路是:提供每一个目标实例在整幅图像的每个像素上的分割掩码(segmentation mask),用1和0区分目标和背景,掩码的像素级标签使用行程长度编码(run-length encoding,RLE)机制。RLE是一种简单、高效的二进制掩码储存格式。RLE首先将向量(或者向量化的图像)划分为一系列分段的连续区域,对每个区域储存其长度。例如,当 M=[0 0 1 1 1 0 1]时,其RLE计数为 [2 3 1 1],而当 M=[1 1 1 1 1 1 0] 时,其RLE计数为 [0 6 1]。RLE 计数的奇数位置上表示的总是0的数量。
[1] K. He, G. Gkioxari, P. Dollar, et al. Mask R-CNN. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017, PP(99):1-1.