Mask R-CNN 实现了实例分割, 目标检测, 姿态估计有效统一, 取得了很赞的效果.
Facebook 开源了基于 Caffe2 的源码实现 - Detectron.
但这里学习的是 matterport 开源的基于 Keras 和 TensorFlow 的 Mask R-CNN 版本 - matterport/Mask_RCNN.

Github - matterport/Mask_RCNN

论文细节可见: 论文阅读 - Mask R-CNN

基于 Keras 的 Mask R-CNN

该 Github 项目的实现, 基于: Python 3.4, Keras2.0.8, TensorFlow1.3.
依赖项可见 requirements.txt 文件.

模型可以输出图片中每一个实例的边界框和分割 masks.

项目组成:

[1] - 基于 FPN 和 ResNet101 的 Mask R-CNN 源码.
[2] - MS COCO 的训练代码.
[3] - MS COCO 的预训练模型权重.
[4] - Jupyter notebooks, 可视化每一步的检测过程.
[5] - multi-GPU 训练的并行模型类 ParallelModel class.
[6] - MS COCO 度量(AP) 的评测
[7] - 自定义数据集上的训练样例.

该代码的文档和设计, 易于扩展.
如果在研究中涉及该项目, 请添加引用.
如果在进行 3D Vision 研究, 可以查看 Matterport3D 数据集.

1. 开始文档

[1] - demo.ipynb. 简单的测试 Demo.
该文档给出测试样例: 采用 MS COCO 数据集预训练的模型分割图片中的目标物体. 可以对任意图片生成目标检测和实例分割结果.

[2] - train_shapes.ipynb, 在自定义数据集上训练 Mask R-CNN 教程.

[3] - (model.py, utils.py, config.py), Mask R-CNN 的主要实现和配置脚本.

[4] - inspect_data.ipynb, 可视化准备训练数据的不同预处理步骤.

[5] - inspec_model.ipynb, 深入了解物体检测和分割. 对流程的每一步进行可视化.

[6] - inspect_weights.ipynb, 检查训练的模型的权重, 寻找可能存在的异常和奇怪模式.

2. 检测的逐步拆解

为了便于理解和调试模型, 该项目提供了三个 notebooks, 进行可视化和逐步运行模型, 以分析每个点的输出情况:

[1] - inspect_data.ipynb

[2] - inspec_model.ipynb

[3] - inspect_weights.ipynb

例如:

2.1 Anchor 的排序与过滤

对于第一阶段的 RPN, Region Proposal Network, 进行可视化,并显示随着 anchor box 的改善所得到的 positive 和 negative anchors.

2.2 边界框改善(bounding box refinement)

这里给出了最终的检测 boxes 的示例(虚线框), 以及在第二阶段改善后的 boxes(实线框).

2.3 Mask 生成

生成的 Mask 示例. 这些 Masks 再进行处理, 得到最终的正确 Masks, 如 scaled.

2.4 网络层的激活值(layer activations)

一般情况下, 查看不同网络层的激活值能够有助于查看异常,如都是 0 或者噪声等.

2.5 权重直方图(weight histograms)

权重直方图也是模型调试的有用工具. 可以参看: inspect_weights.ipynb

2.6 TensorBoard 可视化 log

TensorBoard 是很有用的调试和可视化工具.
模型训练时, 每个 epoch 都会输出 losses log 和保存模型权重.

2.7 将不同部分组成最终结果

3. MS COCO 数据集上的模型训练

这里提供了在 MS COCO 数据集上训练的模型权重. 可以将其作为训练的起始点, 继续进行训练.

训练和评测代码: samples/coco/coco.py.

可以在 Jupyter notebook 中导入该模块, 或者直接运行下面的命令:

# 从 pre-trained COCO weights 开始训练新的模型
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=coco

# 从 ImageNet weights 开始训练新的模型
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=imagenet

# 从先前的训练状态继续训练模型
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=/path/to/weights.h5

# 从训练的最后模型继续进行训练. 会自动从模型路径寻找训练的最后权重.
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=last

也可以运行 COCO 评测代码:

# 对最后训练的模型进行 COCO 评测
python3 samples/coco/coco.py evaluate --dataset=/path/to/coco/ --model=last

训练设置, 学习率等其它参数的设置在: samples/coco/coco.py.

4. 自定义数据集上的模型训练

可以参考 颜色填充 - 基于 Mask R-CNN 和 TensorFlow 的实例分割, Splash of Color: Instance Segmentation with Mask R-CNN and TensorFlow, 介绍了在一个简单应用中, 从图片标注到模型训练,以及模型使用.

在自定义数据集上的模型训练, 主要需要扩展两个类:
[1] - Config - 包含默认配置. 可以根据需要, 添加子类, 修改对应的属性.
[2] - Dataset - 便于处理任何数据集. 不需要修改模型代码, 即可适用于新数据集. 也支持同时加载多种数据集.

具体 Demo, 可参考:

  • samples/shapes/train_shapes.ipynb
  • samples/coco/coco.py
  • samples/balloon/balloon.py
  • samples/nucleus/nucleus.py

5. 与论文的不同之处

该 Github 项目大部分是基于 Mask R-CNN 论文, 但有一些地方为了代码间接和泛化, 有些不同.
主要的区别如下:

[1] - 图像调整 Image Resizing - 为了支持每个 batch 训练多张图片, 这里将所有的图片调整为相同尺寸. 例如, MS COCO 图片尺寸调整为 1024x1024. 调整时, 保持了图片的长宽比. 因此, 如果图片不是方形的, 则补零. 论文里是调整图片短边尺寸为 800 px, 最大为 1000 px.

[2] - 边界框 Bounding Boxes - 某些数据只有边界框或者只有 mask 标注. 为了支持同时多个训练数据, 这里忽略数据集标注的边界框数据, 而是在线生成边界框标注. 将囊括所有 mask 像素的最小 box 作为边界框. 这样可以简化实现, 更易于进行图片增强.

[3] - 学习率 Learning Rate - 论文采用学习率为 0.02, 但这里发现 0.02 值太大, 经常出现发散, 尤其是 batchsize 很小时. 可能原因是 Caffe 和 TensorFlow 计算差值方式的不同(sum vs mean across batches and GPUs). 或者是, 官方实现采用了梯度裁剪. 这里也尝试了梯度裁剪, 但并没有太明显的效果. 作者发现, 采用较小的学习率不管怎样都可以很快收敛.

6. MS COCO 数据集

在 MS COCO 数据集上的训练, 需要:

7. 安装

Docker 版

[1] - 依赖项安装

pip3 install -r requirements.txt

[2] - 下载项目

git clone https://github.com/matterport/Mask_RCNN.git

[3] - 运行项目根目录中的 setup.py,安装:

python3 setup.py install

[4] - 下载预训练的 COCO 权重 - mask_rcnn_coco.h5

[可选] MS COCO 数据集所需工具 - pycocotools

8. 基于该模型的项目

[1] - [4K Video Demo]() by Karol Majek

[2] - Images to OSM: Improve OpenStreetMap by adding baseball, soccer, tennis, football, and basketball fields

[3] - Splash of Color

[4] - Segmenting Nuclei in Microscopy Images, Built for the 2018 Data Science Bowl
代码位于 samples/nucleus 路径.

[5] - Mapping Challenge: Convert satellite imagery to maps for use by humanitarian organisations.

Last modification:November 9th, 2020 at 10:18 pm