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 数据集.

<h2>1 开始文档</h2>

  • demo.ipynb. 简单的测试 Demo. 该文档给出测试样例: 采用 MS COCO 数据集预训练的模型分割图片中的目标物体. 可以对任意图片生成目标检测和实例分割结果.</p>
  • <p>train_shapes.ipynb, 在自定义数据集上训练 Mask R-CNN 教程.</p>
  • <p>(model.py, utils.py, config.py), Mask R-CNN 的主要实现和配置脚本.</p>
  • <p>inspect_data.ipynb, 可视化准备训练数据的不同预处理步骤.</p>
  • <p>inspec_model.ipynb, 深入了解物体检测和分割. 对流程的每一步进行可视化.</p>
  • <p>inspect_weights.ipynb, 检查训练的模型的权重, 寻找可能存在的异常和奇怪模式.</p>

<h2>2 检测的逐步拆解</h2>

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

例如:

<h3>2.1 Anchor 的排序与过滤</h3>

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

<h3>2.2 边界框改善(bounding box refinement)</h3>

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

<h3>2.3 Mask 生成</h3>

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

<h3>2.4 网络层的激活值(layer activations)</h3>

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

<h3>2.5 权重直方图(weight histograms)</h3>

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

<h3>2.6 TensorBoard 可视化 log</h3>

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

<h3>2.7 将不同部分组成最终结果</h3>

<h2>3. MS COCO 数据集上的模型训练</h2>

这里提供了在 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.

<h2>4. 自定义数据集上的模型训练</h2>

可以参考 颜色填充 - 基于 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

<h2>5. 与论文的不同之处</h2>

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

  • [1] - 图像调整 Image Resizing - 为了支持每个 batch 训练多张图片, 这里将所有的图片调整为相同尺寸. 例如, MS COCO 图片尺寸调整为 1024x1024. 调整时, 保持了图片的长宽比. 因此, 如果图片不是方形的, 则补零. 论文里是调整图片短边尺寸为 800 px, 最大为 1000 px.</p>
  • <p>[2] - 边界框 Bounding Boxes - 某些数据只有边界框或者只有 mask 标注. 为了支持同时多个训练数据, 这里忽略数据集标注的边界框数据, 而是在线生成边界框标注. 将囊括所有 mask 像素的最小 box 作为边界框. 这样可以简化实现, 更易于进行图片增强.</p>
  • <p>[3] - 学习率 Learning Rate - 论文采用学习率为 0.02, 但这里发现 0.02 值太大, 经常出现发散, 尤其是 batchsize 很小时. 可能原因是 Caffe 和 TensorFlow 计算差值方式的不同(sum vs mean across batches and GPUs). 或者是, 官方实现采用了梯度裁剪. 这里也尝试了梯度裁剪, 但并没有太明显的效果. 作者发现, 采用较小的学习率不管怎样都可以很快收敛.</p>

<h2>6. MS COCO 数据集</h2>

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

Docker 版

<h2>7. 安装</h2>

  • 依赖项安装
pip3 install -r requirements.txt
  • 克隆项目
git clone https://github.com/matterport/Mask_RCNN.git
  • 运行项目根目录中的 setup.py
python3 setup.py install
  • <p>下载预训练的 COCO 权重 - mask_rcnn_coco.h5</p>
  • <p>[可选] MS COCO 数据集所需工具 - pycocotools</p>

<h2>8. 基于该模型的项目</h2>

Last modification:October 9th, 2018 at 09:31 am