用自己的数据训练Mask R-CNN目标检测/分割模型
摘要: 本文讲述了如何使用Mask-CNN对图像中的大量数据进行目标识别与目标分割。
计算机非常擅长数字运算,但对分析图像中的大量数据束手无策。直到最近找到了解决方法,即创建图像处理单元库,利用数千个内核的原始动力解锁图片背后的含义。
使用自己的数据
我们将使用一个示例数据集,它在随机色彩背景上由不同大小和颜色的圆圈、正方形和三角形组成。我已经创建了一个COCO-style版本,如果你想学习如何将图片转换成自己的数据集,请参阅前面的文章。
这一次我们的重点是自动标记图像中的所有形状,并标出每个图像精确到像素的位置。这类的任务称为“目标分割”。在计算机视觉中,有很多听起来类似的的术语,比如“物体识别(object recognition)”、“类分割(class segmentation)”、“目标检测(object detection)”,我们需要通过看它们做了什么来区分。下图展示了我们从这四个类型中所能获得的信息,从左到右,任务依次变得困难。
不同类型的图像处理目标识别告诉我们图像中有什么,而不是在什么地方或者有多少。类分割对图像中不同类型的对象添加位置信息。目标检测将图像中的每个对象通过边界框分割开。最后,这四个当中最难也是我们要训练的是——目标分割。它赋予每个对象一个清晰的边界,也能用来创建前三个的结果。
对于这种简单数据集,我们可以使用老式计算机视觉思路,例如Hough圈和线条检测或模板匹配来获得好的结果。但是通过深度学习,我们可以使用相同方法在几乎所有类型的图像数据集上获得相同类型的结果,而且无需考虑要找的是什么特征,这简直太神奇了。
Mask R-CNN是什么?
在训练自己的Mask R-CNN之前,让我们快速从右向左讲解一下名字的含义。
“NN”是神经网络,它的灵感来自于生物神经元的工作原理,神经网络是连接的神经元集合,每个神经元根据输入和内部参数输出信号。当训练神经网络时,我们要不断调整神经元的内部参数来获得期望的输出。
神经网络“C”代表“卷积”。CNNs是专门为图像学习而设计的,但在某些方面上与神经网络相似。它们的过滤器是通过在某个时间段在图像上某小块横向和纵向滑动进行的,而不是一次向穿过整个图像。CNN比常规的神经网络使用更少的参数和内存,这使得它们能够处理比传统神经网络更大的图像。
卷积普通的CNNs擅长目标识别,但是如果我们想要做目标检测,需要知道位置。这就是“R”“区域”。R-CNNs能够围绕对象画出边框。随着时间的推移,发展出了Fast R-CNN和Faster R-CNN。Faster R-CNN在CNN最后提出了Proposal生成网络,即如果在区域内发现对象,则这些区域就会被用作边框。
最后,“Mask”添加了像素级的分割,并创建了目标分割模型。它为网络添加了一个额外的分支来创建二进制掩码,这与我们在注释图像时所做的类似。
准备好电脑配置
要运行这些例子,你需要用最新nvidia显卡的Ubuntu 16.04系统。我可以使用只有2GB内存的GeForce 940M对一小部分网络进行训练,但是你最好使用11GB内存以上的nvidia卡。如果没有,你可以开始使用Amazon Web Services或谷歌云。
我们将使用Docker上运行来确保在同一页面。Docker通过脚本创建系统的副本,所以不必安装所有的小程序。但是在此之前需要准备好主机系统。
安装Ubuntu 16.4之后,我们需要安装NVIDIA图形驱动和CUDA(并行计算平台)。首先打开一个终端并运行以下命令来安装图形驱动程序。
然后安装CUDA
现在安装Docker、Docker- compose和Nvidia-Docker。
全部安装好后,重启电脑就可以运行我们的Mask C-RNN系统了。
开始实践
下载并提取deep-learning-explorer。里面包含mask-rcnn文件夹和一个数据文件夹。Data/shapes文件夹中包含数据测试集的压缩文件。提取出shapes.zip文件,并将annotations,shapes_train2018,shapes_test2018和shapes_validate2018移动到data/shapes文件夹中。
回到终端界面,cd进入到mask-rcnn/docker目录下,并运行docker-compose up。首次运行这个命令时,Docker需要几分钟准备从头开始构建系统。准备就绪时会显示如下:
Docker系统准备就绪将最后一行复制粘贴到web浏览器中,就会打开Jupyter Notebook。进入home/keras/mask-rcnn/notebooks目录,点击mask_rcnn.ipynb。现在您可以浏览每个笔记本单元并训练您自己的Mask R-CNN模型。幕后Keras与Tensorflow正在GPU上训练神经网络。如果你没有11GB显存的话,你可能会在“微调”步骤中遇到问题,但你应该能够用最少2GB的内存卡来训练网络顶端。
我们之所以不必花费数天或数周时间训练模型以及数以千计的例子就能获得不错的结果,是因为复制了之前真实的COCO数据集上完成的训练的权重(内部神经元参数)。由于大多数图像数据集具有相似的基本特征,比如颜色和模式,所以通常可以用一种模型的训练数据来训练另一个模型。这种复制数据称为迁移学习。
如果你滚动到笔记本的底部,你会发现我们只预测了大约37%的正确形状。但是可以通过将STEPS_PER_EPOCH增加到750(培训样本的总数)并运行5个或更多的epochs,来改进模型。
在训练期间或之后,你可以通过一些图表来查看TensorBoard的使用情况。首先需要登录到Docker容器中,启动并运行TensorBoard,然后在web浏览器中访问。过程为在终端运行docker ps,将显示所有运行的容器,使用CONTAINER ID的前两个字符启动Docker容器bash shell来训练模型。例如,我们的ID是d5242f7ab1e3,我们将使用docker exec - d5 bash来登录。运行tensorboard --logdir ~/data/shapes/logs --host 0.0.0.0,现在可以通过访问http://localhost:8877进入TensorBoard了。
现在,你已经根据自己的数据准备好训练Mask R-CNN模型了。
引用和资源:
deep-learning-explorer
pycococreator - 转换数据
R-CNN (arxiv)
Fast R-CNN (arxiv)
Faster R-CNN (arxiv)
Mask R-CNN (arxiv)
Stanford CS class notes
本文由北邮阿里云云栖社区组织翻译。
文章原标题《Train a Mask R-CNN model on your own data》
作者:waspinator
译者:奥特曼,审校:袁虎。
本文为云栖社区原创内容,未经允许不得转载。