Mask R-CNN 实现了实例分割, 目标检测, 姿态估计有效统一, 取得了很赞的效果.
Facebook 开源了基于 Caffe2 的源码实现 - Detectron.
但这里学习的是 matterport 开源的基于 Keras 和 TensorFlow 的 Mask R-CNN 版本 - 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 数据集上的训练, 需要:
- pycocotools
- MS COCO Dataset
- 下载 5K minival 和 35K validation-minus-minival 子数据集. 更多细节参考 Faster R-CNN 实现.
7. 安装
[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.
17 comments
博主你好,我是小白一枚,想请教一些目标检测计数方面的研究问题,你看方便吗?
你好,请问是什么问题呢
是麦穗上的小穗计数问题,博主有了解吗
这里貌似传不了图片,不然对着图片描述好一点
博主,我用这个代码测试,最后的输出图片怎么没有把物体框出来和是什么类别
有修改过代码吗?或者输入图片尺寸是多少?有可能是框线条和字体太小.
博主你好,请问一下,使用单张图片测试分割时需要8秒,怎样能快一些呢?
是包含模型加载的时间吗,GPU是哪个,Keras 加载模型可能是会久.
不包含模型加载过程,训练用的服务器,测试时用的1060,分割单张图片需要三四秒,但是一起分割多张,平均每张不到一秒,您知道这是怎么回事吗?
如果是 1060,单张加模型加载时间差不多要这么久的. 多张的时候是只加载了一次模型.
谢谢大佬,麻烦您啦,想问一下Mask-Rcnn调参的话,都有哪些参数时需要调节的呢?loss需要训练到多少呢?
训练调参吗? 一般会涉及显卡数量、学习率、batchsize 等常用的,还涉及 loss 函数的选择. loss 降低到多少取决于具体情况.
嗯嗯,大佬,上面智慧驾驶和气球得那种实时分割有示例嘛
实时分割?那需要更换 backbone 模型了,比如 mobilenet 之类的.
嗷嗷,这样呀,大佬你有计算分割效果的代码嘛?计算分割图像和实际图像的交并比(像素级)那种。
这个项目里就有的,https://github.com/matterport/Mask_RCNN/blob/master/mrcnn/utils.py 脚本里的 compute_overlaps_masks(mask1, mask2) 函数.
谢谢谢谢!