Mask R-CNN实例分割模型热力图+可视化
前言
实例分割(Instance Segmentation)是视觉经典四个任务中相对最难的一个,它既具备语义分割(Semantic Segmentation)的特点,需要做到像素层面上的分类,也具备目标检测(Object Detection)的一部分特点,即需要定位出不同实例,即使它们是同一种类。本次介绍二阶段实例分割的代表性方法Mask R-CNN
一、Mask R-CNN
Mask R-CNN算法的主要步骤为:
- 首先,将输入图片送入到特征提取网络得到特征图。
- 然后对特征图的每一个像素位置设定固定个数的ROI(也可以叫Anchor),然后将ROI区域送入RPN网络进行二分类(前景和背景)以及坐标回归,以获得精炼后的ROI区域。
- 对上个步骤中获得的ROI区域执行论文提出的ROIAlign操作,即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来。
- 最后对这些ROI区域进行多类别分类,候选框回归和引入FCN生成Mask,完成分割任务。
Mask R-CNN利用R-CNN得到的物体框来区分各个实例,然后针对各个物体框对其中的实例进行分割。显而易见的问题便是,如果框不准,分割结果也会不准。因此对于一些边缘精度要求高的任务而言,这不是一个较好的方案。同时由于依赖框的准确性,这也容易导致一些非方正的物体效果比较差。
二、代码详解
这是代码的链接(Tensorflow版本):https://github.com/matterport/Mask_RCNN
配置文件安装和数据集下载就不再赘述,详细过程可以参考上面的连接。
1.环境配置
- Python 3.4+
- TensorFlow 1.3+
- Keras 2.0.8+
- Jupyter Notebook
- Numpy, skimage, scipy, Pillow, cython, h5py
2.数据集下载
实验选用xBD遥感数据集,该数据集可以到xView2官网上进行下载。
3.代码修改
配置文件信息config.py
class InferenceConfig(coco.CocoConfig):
# Set batch size to 1 since we'll be running inference on
# one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
GPU_COUNT = 1
IMAGES_PER_GPU = 1
config = InferenceConfig()
config.display()
Configurations:
BACKBONE_SHAPES [[256 256]
[128 128]
[ 64 64]
[ 32 32]
[ 16 16]]
BACKBONE_STRIDES [4, 8, 16, 32, 64]
BATCH_SIZE 1
BBOX_STD_DEV [ 0.1 0.1 0.2 0.2]
DETECTION_MAX_INSTANCES 100
DETECTION_MIN_CONFIDENCE 0.5
DETECTION_NMS_THRESHOLD 0.3
GPU_COUNT 1
IMAGES_PER_GPU 1
IMAGE_MAX_DIM 1024
IMAGE_MIN_DIM 800
IMAGE_PADDING True
IMAGE_SHAPE [1024 1024 3]
LEARNING_MOMENTUM 0.9
LEARNING_RATE 0.002
MASK_POOL_SIZE 14
MASK_SHAPE [28, 28]
MAX_GT_INSTANCES 100
MEAN_PIXEL [