如何用自己的数据训练MASK R-CNN模型

AiTechYun

编辑:chux

计算机一直很擅长数字处理,却苦于分析图像中的大量数据。直到最近,创建图形处理单元库已不仅仅用于游戏,现在我们可以利用数千个核心的原始力量来揭示图片背后的含义。

使用你的数据

我们将以形状数据集作为范例,其中颜色和大小随机的圆形、正方形和三角形分布在颜色随机的背景上。我们之前已经创建了一个COCO类型的数据集。如果你想学习如何转换自己的数据集,请查看如何用pycococreator将自己的数据集转换为COCO类型。

这次的重点将是自动标记图像中的所有形状,并找出每个图形的位置,精确到像素。这种任务叫做“对象分割”。在探索计算机视觉过程中,你可能也遇到过诸如“对象识别”、“类分割”和“对象检测”之类的术语。这些术语听起来很相似,一开始你可能会感到迷惑,那么就让我们看看它们各自的功能吧。下面是我们从每种类型中获取的信息示例,任务难度从左到右递增。

对象识别告诉我们图像中有什么,但不会提示位置和数量。类分割将位置信息添加到图像的不同类型的对象中。对象检测则将每个对象用边界框分隔开。这四种当中难度最大的就是我们要进行训练的对象分割。它为每个形状提供清晰的边界,这也能够得到前三种功能的结果。

使用这个简单的数据集,我们可以使用旧的计算机视觉概念,如用于检测圆和线的Hough或模板匹配来得到合适的结果。但使用深度学习,我们不需要改变方法,就可以在任何类型的图像数据集中得到相同类型的结果,而且都不用考虑我们要找的具体特征,这就像魔法一般神奇。

什么是MASK R-CNN?

在我们开始训练自己的Mask R-CNN模型前,首先来搞清楚这个名称的含义。我们从右到左来介绍。

“NN”就是指神经网络,这一概念受到了对生物神经元是如何工作的想象的启发。神经网络是连接到一起的神经元的容器,每个神经元根据其输入和内部参数输出信号。当我们训练神经网络时,我们调整神经元的内部参数,以便得到符合期望的输出。

“C”代表“卷积的”,CNN是专门为用图像学习而设计的,但与标准的神经网络相似。它学习的过滤器每次都以一小块为单位上下滑动(卷积)图像,而不是一次浏览整个图像。与常规的神经网络相比,CNN需要的参数和内存占用更少,这使得它们可以超越传统神经网络的限制,处理尺寸更大的图像。

简单的CNN擅长对象识别,但如果我们想要进行对象检测,我们需要知道其位置。所以R,就是区域位置。R-CNN能够在找到的物体周围绘制出边界框。现在的R-CNN已经发展得比原始的R-CNN更快,因此它们被称为“Fast R-CNN”和“Faster R-CNN”。Faster R-CNN在CNN终端加入了Region Proposal Network用来计划区域。如果在区域中发现了一个对象,那么就将这些区域作为边界框。

最后来解释一下“Mask”,它增加了像素级的分割,并创建了对象分割模型。它在网络中添加了一个额外的分支以创建二进制掩码,这与我们注释图像的做法类似。

介绍完了这一概念不同部分的含义和作用,现在让我们开始训练自己的Mask-RCNN。

准备好电脑

要运行这些示例,你需要Ubuntu 16.04系统和近期的nvidia显卡。我使用只有2 GB内存的GeForce 940 M来训练一小部分的网络,推荐你用11 GB或更多内存的nvidia显卡。如果你没有这些条件,你可以从Amazon Web Services或Google Cloud开始。

为了确保同步,我们将使用Docker来运行所有示例。Docker使用脚本创建系统的副本,因此你无需担心自己安装的问题。但是,在我们能够因自动设置变得轻松之前,首先我们需要准备好主机系统。这部分可能有点麻烦,但绝对值得。

装好Ubuntu 16.04系统后,我们需要安装nvidia显卡驱动以及CUDA (并行计算平台)。首先打开一个终端,运行以下命令来安装显卡驱动。

然后安装CUDA。

wget https://developer.nvidia.com/compute/cuda/9.1/Prod/local_installers/cuda-repo-ubuntu1604-9-1-local_9.1.85-1_amd64
sudo dpkg -i cuda-repo-ubuntu1604-9-1-local_9.1.85-1_amd64.deb
sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-toolkit-9-1 cuda-libraries-dev-9-1 cuda-libraries-9-1

现在来安装Docker,Docker-Compose和Nvidia-Docker。

wget -O get_docker.sh get.docker.com
chmod +x get_docker.sh
sudo ./get_docker
sudo apt-get install -y docker-ce=18.03.0~ce-0~ubuntu
sudo usermod -aG docker $USER
sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \ sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \ sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd

需要运行的命令很多,希望你那边能够顺利安装。现在我们终于可以运行Mask R-CNN系统了,重启电脑确保一切能够正常运行。

开始探索

在这个网站(github.com/waspinator/deep-learning-explorer)下载并解压deep-learning-explorer。你会找到mask-rcnn文件夹和一个数据文件夹。另一个压缩文件中有我们的测试数据集。解压shapes.zip文件,将annotations,shapes_train2018,shapes_test2018shapes_validate2018移到data/shapes中。

回到终端,cd进入mask-rcnn/docker,然后运行dockdocker。首次运行这个命令时,DockerDocker将从头开始创建系统,因此可能需要等几分钟,这之后就很快了。一旦准备好了你就会看到这样的提示:

把最后一行粘贴到浏览器中,你就会进入Jupyter Notebook网站。依次点击home/keras/mask-rcnn/notebooks/mask_rcnn.ipynb,现在你可以遍历所有Notebook,并训练自己的Mask R-CNN模型。用Keras和Tensorflow在后台训练gpu上的神经网络。如果你没有11GB内存的显卡,那么你可以在调整这一步上出现问题,不过就算是只有2GB内存的显卡,也可以训练网络最上面的部分。

我们不用花费数天或数周的时间来训练模型,也没有成千上万的例子,但我们还能得到相当好的结果,是因为我们从真正的COCO数据集之前的训练中复制了权重(内部神经元参数)。由于大多数图像数据集都有相似的基本特征,比如颜色和模式,所以训练一个模型得出的数据通常可以用来训练另一个模型。以这种方式复制数据的方法叫做迁移学习。

在notebook的底部你会发现预测出正确形状的概率只有37%。你可以将STEPS_PER_EPOCH增加到750(训练样本总数),并且运行5次或更多以使模型做出更好的预测。

在训练期间或训练后,你可以用TensorBoard查看图表确认进展。我们需要登录我们刚刚启动的Docker容器,然后在web浏览器中访问它之前运行TensorBoard。在终端运行docker ps,这样你就能看到所有运行中的容器。使用CONTAINER ID的前两个字符启动训练模型的Docker容器中的bash shell。例如,ID是d5242f7ab1e3,我们使用docker exec -it d5 bash登录。现在我们已经在容器中了,运行tensorboard –logdir ~/data/shapes/logs –host 0.0.0.0,这样你就可以访问http://localhost:8877获取TensorBoard。

现在尝试一下用自己的数据来训练Mask R-CNN模型吧。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

Python验证码识别:利用pytesser识别简单图形验证码

来源: j_hao104 my.oschina.net/jhao104/blog/647326 一、探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图...

61610
来自专栏about云

TensorFlow ML cookbook 第一章7、8节 实现激活功能和使用数据源

问题导读: 1、TensorFlow中有哪些激活函数? 2、如何运行激活函数? 3、TensorFlow有哪些数据源? 4、如何获得及使用数据源? 上...

4878
来自专栏Pytorch实践

Tensorflow常见模型及工程化方法

Tensorflow在深度学习模型研究中起到了很大的促进作用,灵活的框架免去了研究人员、开发者大量的自动求导代码工作。本文总结一下常用的模型代码和工程化需要的代...

3206
来自专栏北京马哥教育

20行 Python 代码实现验证码识别

一、探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如...

6108
来自专栏Pytorch实践

Tensorflow常见模型及工程化方法

Tensorflow在深度学习模型研究中起到了很大的促进作用,灵活的框架免去了研究人员、开发者大量的自动求导代码工作。本文总结一下常用的模型代码和工程化需要的代...

1934
来自专栏机器学习算法工程师

深度学习必备---用Keras和直方图均衡化---数据增强

作者:王抒伟 编辑:王抒伟 算了 爱看多久看多久 在读这技术文章之前,请大家想象一个标准河南口音的娃在读这篇文章,那么你不知不觉,你的嘴角就上扬咯。 俺、...

1.8K4
来自专栏专知

【资源】Python实现多种模型(Naive Bayes, SVM, CNN, LSTM, etc)用于推文情感分析

【导读】近日,Abdul Fatir 在自己的CS5228课程报告使用不同的方法进行Tweets情感分析(作为二分类问题),并对这些方法的性能进行比较,主要是基...

47210
来自专栏AI研习社

Github 项目推荐 | 由文本生成人脸图像 —— T2F

T2F 结合了最近的两个架构 StackGAN 和 ProGAN,用于从文本描述中合成面部,该项目使用 Face2Text 数据集,每个数据集包含 400 个图...

1202
来自专栏ATYUN订阅号

使用Python完成你的第一个学习项目

你是否想使用python进行机器学习但却难以入门? 在这篇教程中,你将用Python完成你的第一个机器学习项目。 在以下的教程中,你将学到: 下载并安装P...

74111
来自专栏贾志刚-OpenCV学堂

使用Tensorflow Object Detection API实现对象检测

Tensorflow Object Detection API自从发布以来,其提供预训练模型也是不断更新发布,功能越来越强大,对常见的物体几乎都可以做到实时准确...

1463

扫码关注云+社区

领取腾讯云代金券