Mask R-CNN Keras 对象检测 对象分割 像素掩码
原文链接
Mask R-CNN Keras 对象检测 对象分割 像素掩码
在 2019年7月16日 上张贴 由 hotdog发表回复
Mask R-CNN Keras
在本教程中,您将学习如何使用 Keras 和Mask R-CNN来执行实例分段(使用和不使用GPU)。
使用Mask R-CNN,我们可以执行以下两项操作:
对象检测,为我们提供图像中每个对象的(x,y)边界框坐标。
实例分割,使我们能够为图像中的每个单独对象获取 像素掩码。
通过Mask R-CNN进行实例分割的示例可以在本教程顶部的图像中看到 – 请注意我们不仅拥有图像中对象的边界框,而且还为每个对象提供了像素方式的蒙版同样,使我们能够分割每个单独的对象(仅对象检测不会给我们的东西)。
实例分割与 Mask R-CNN 一起,推动了我们在计算机视觉中看到的“神奇”的一些最新进展,包括自动驾驶汽车,机器人等等。
在本教程的其余部分中,您将学习如何将 Mask R-CNN 与 Keras 一起使用,包括如何在您自己的图像上执行实例分割。
要了解有关Keras和Mask R-CNN的更多信息,请继续阅读!
寻找这篇文章的源代码?
Keras Mask R-CNN
在本教程的第一部分中,我们将简要介绍Mask R-CNN架构。从那里,我们将查看该项目的目录结构,然后在我们的系统上安装Keras + Mask R-CNN。
然后,我将向您展示如何使用 Python 实现Mask R-CNN和Keras。
最后,我们将Mask R-CNN应用于我们自己的图像并检查结果。
我还将分享有关如何在您自己的自定义数据集上训练Mask R-CNN模型的资源。
Mask R-CNN 的历史
图1: He等人的Mask R-CNN架构。实现对象检测和逐像素实例分割。这篇博文使用Keras来处理在COCO数据集上训练的Mask R-CNN模型。
用于实例分割的Mask R-CNN模型已经从用于对象检测的三个先前架构发展而来:
R-CNN:向网络呈现输入图像,在图像上运行选择性搜索,然后使用预先训练的CNN将来自选择性搜索的输出区域用于特征提取和分类。
Fast R-CNN:仍然使用选择性搜索算法来获取区域提议,但添加了感兴趣区域(ROI)池模块。从要素图中提取固定大小的窗口,并使用这些要素获取最终的类标签和边界框。好处是网络现在可以端到端训练。
Faster R-CNN:引入区域提案网络(RPN),将区域提案直接烘焙到架构中,减少了对选择性搜索算法的需求。
Mask R-CNN 算法建立在之前 Faster R-CNN,使网络能够不仅执行对象检测 而且对像素实例的分割.
项目结构
继续使用今天博客文章的“下载”部分下载代码和预先训练的模型。让我们来看看我们的Keras Mask R-CNN项目结构
我们的项目包括测试 图像/ 目录以及三个文件:
coco_labels .txt :由81个类别标签的逐行列表组成。第一个标签是“背景”类,所以通常我们说有80个类。
mask_rcnn_coco .h5 :我们预先训练的Mask R-CNN模型权重文件,将从磁盘加载。
maskrcnn_predict .py :Mask R-CNN演示脚本加载标签和模型/权重。从那里,对通过命令行参数提供的测试图像进行推断。您可以使用我们自己的图像或 “下载”中 包含的images /目录中的任何一个进行测试 。
在我们回顾今天的脚本之前,我们将安装Keras + Mask R-CNN,然后我们将简要回顾COCO数据集。
安装Keras Mask R-CNN
使用pip,git和setup .py直接引用Keras + Mask R-CNN安装过程 。我建议您在今天的项目的专用虚拟环境中安装这些软件包,这样您就不会使系统的软件包树复杂化。
首先,安装所需的Python包
$ pip install numpy scipy
$ pip install pillow scikit-image matplotlib imutils
$ pip install "IPython[all]"
$ pip install tensorflow # or tensorflow-gpu
$ pip install keras h5py 如果您的计算机上安装了GPU,CUDA和cuDNN,请务必安装 tensorflow – gpu。
$ pip install opencv-contrib-python接下来,我们将在Keras中安装Mask R-CNN的Matterport实现
$ git clone https://github.com/matterport/Mask_RCNN.git
$ cd Mask_RCNN
$ python setup.py install最后,在虚拟环境中启动Python解释器,以验证是否已成功安装Mask R-CNN + Keras和OpenCV
$ python
>>> import mrcnn
>>> import cv2
>>>如果没有导入错误,您的环境现在可以用于今天的博客文章。
Mask R-CNN和COCO
我们今天在这里使用的Mask R-CNN模型是在COCO数据集上预先训练的。
此数据集包含总共80个类(加上一个背景类),您可以从输入图像中检测和分割(第一个类是背景类)。我 在与此帖相关的“下载”中包含了名为coco_labels .txt的标签文件 ,但出于方便,我已将它们包含在此处:
在下一节中,我们将学习如何使用Keras和Mask R-CNN来检测和分割这些类中的每一个。
用Keras和Python实现Mask R-CNN
让我们开始实现Mask R-CNN分段脚本。
打开 maskrcnn_predict .py
第2-11行导入我们所需的包。
该 mrcnn 从Matterport 导入实现 Mask R-CNN的。从 mrcnn ,我们将使用 Config 创建一个自定义子类,我们的配置, modellib 加载我们的模型,以及 可视化 绘制我们的面具。
让我们继续并解析我们的命令行参数
我们的脚本需要三个命令行参数:
– weights 权重 :在COCO上预训练的Mask R-CNN模型权重的路径。
– labels :COCO类的路径标记文本文件。
– image :我们的输入图像路径。我们将对通过命令行提供的图像执行实例分割。
使用第二个参数,让我们继续加载我们的 CLASS_NAMES 和 COLORS
第24行将COCO类标签名称直接从文本文件加载到列表中。
从那里, 第28-31行为 每个类标签生成随机的,不同的 颜色。该方法来自Matterport在GitHub上的Mask R-CNN实现。
让我们继续构建我们的 SimpleConfig 类
我们的 SimpleConfig 类继承自Matterport的Mask R-CNN Config (第33行)。
配置为 NAME (第35行)。
从那里我们设置 GPU_COUNT 和 IMAGES_PER_GPU (即批处理)。如果您安装了GPU和tensorflow – gpu,那么Keras + Mask R-CNN将自动使用您的GPU。如果没有,将改为使用您的CPU。
注意:我在使用单个Titan X GPU的机器上执行了今天的实验,因此我将GPU_COUNT 设置 为1 。虽然我的12GB GPU在技术上可以同时处理多个图像(在训练期间或在预测期间,如在此脚本中),但我决定设置 IMAGES_PER_GPU = 1, 因为大多数读者不会拥有具有尽可能多内存的GPU。如果您的GPU可以处理它,请随意增加此值。
然后将我们的 NUM_CLASSES设置为等于CLASS_NAMES 列表的长度 (第45行)。
接下来,我们将初始化配置并加载我们的模型
第48行实例化我们的 配置 。
然后,使用我们的 配置 , 第53-55行加载我们 在COCO数据集上预训练的Mask R-CNN 模型。
让我们继续并 执行实例分割
第59-61行加载并预处理我们的 图像 。我们的模型需要RGB格式的图像,所以我们使用 cv2。cvtColor 交换颜色通道(相比之下OpenCV的默认BGR颜色通道排序)。
然后,65行 通过网络执行图像的前向传递, 以进行物体检测和逐像素掩模预测。
剩下的两个代码块将处理结果,以便我们可以使用OpenCV可视化对象的边界框和掩码
为了可视化结果,我们首先循环对象检测(第68行)。在循环内部,我们:
获取唯一的 classID 整数(第71行)。
提取 当前检测的 掩码(第72行)。
确定 用于 可视化 蒙版的 颜色(第73行)。
使用半透明alpha 通道(第76行)在对象上 应用/绘制我们预测的像素方式蒙版。
从这里开始,我们将为图像中的每个对象绘制边界框和类标签+得分文本
第80行将我们的图像转换 回BGR(OpenCV的默认颜色通道排序)。
在 第83行,我们开始循环对象。在循环内部,我们:
提取边界框坐标, classID , 标签 和 分数 (第86-89行)。
计算 边界框和文本的 颜色(第90行)。
绘制每个边界框(第93行)。
连接类/概率 文本 (第94行),然后在图像顶部绘制它 (第95-97行)。
一旦完成该过程,结果输出 图像 将显示在屏幕上,直到按下一个键(第100-101行)。
Mask R-CNN和Keras结果
现在我们已经实现了Mask R-CNN脚本,让我们试一试。
确保您已使用本教程的“下载”部分下载源代码。
您需要知道命令行参数的概念才能运行代码。如果您不熟悉,请在尝试执行代码之前阅读argparse和命令行参数。
准备好后,打开终端并执行以下命令
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/30th_birthday.jpg
图2:在COCO上训练的面具R-CNN模型创建了侏罗纪公园吉普车(卡车)的像素图,我的朋友和我在庆祝我的30岁生日时。
在我30岁生日那天,我的妻子找到了一个人带着我们在费城的侏罗纪公园吉普车上驾驶我们- 这里我和我最好的朋友都在自然科学院外面。
请注意,不仅为每个对象(即人和吉普车)生成边界框,而且还有像素方式的蒙版!
让我们尝试另一个图像
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/couch.jpg
图3:我的狗Janie已经使用Keras和Mask R-CNN深度学习模型从沙发和椅子上分割出来。
这是我的狗Janie的超级可爱照片,躺在沙发上:
尽管绝大多数沙发都不可见,但是 Mask R-CNN 仍然能够将其标记为这样。
Mask R-CNN能够正确标记图像中的狗。
即使我的咖啡杯几乎看不见,Mask R-CNN也可以给杯子贴上标签(如果你仔细观察,你会看到我的咖啡杯是侏罗纪公园的杯子!)
Mask R-CNN无法正确标记的图像的唯一部分是沙发的后部,它错误地作为椅子 – 仔细观察图像,你可以看到Mask R-CNN如何犯错误(区域确实看起来很像椅子而不是沙发的一部分。
这是使用Keras + Mask R-CNN进行实例分割的另一个例子
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/page_az.jpg
图4:Mask R-CNN分段图像(使用Keras,TensorFlow和Matterport的Mask R-CNN实现创建)。
让我们将Mask R-CNN应用于最终图像
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/ybor_city.jpg
图5: Keras + Mask R-CNN,带有来自Ybor City的图片的Python。
我最喜欢去美国的城市之一是Ybor City – 我喜欢这个地区(也许是公鸡在这个城市受到保护并且可以自由地漫游)。
在这里你可以看到我和这样一只公鸡 – 注意我们每个人如何被Mask R-CNN正确标记和分割。您还会注意到Mask R-CNN模型能够对每辆车进行本地化并标记总线!
Mask R-CNN可以实时运行吗?
此时你可能想知道是否可以实时运行Keras + Mask R-CNN,对吧?
正如您在上面的“Mask R-CNN的历史”部分所知,Mask R-CNN基于Faster R-CNN物体探测器。
Faster R-CNNs 是令人难以置信的计算量很大,而当你在物体检测的顶部添加例如分割,模型只变得更计算昂贵,因此:
在CPU上, Mask R-CNN无法实时运行。
但是在GPU上, Mask R-CNN可以达到5-8 FPS。
如果您想半实时运行Mask R-CNN,则需要GPU。
摘要
在本教程中,您学习了如何使用Keras + Mask R-CNN来执行实例分段。
与仅为您提供图像中对象的边界框(x,y)坐标的对象检测不同,实例分割更进一步,为每个对象生成像素方式的蒙版。
使用实例分割我们实际上可以部分从图像的对象。
为了执行实例分割,我们使用了Matterport Keras + Mask R-CNN实现。
然后我们创建了一个Python脚本:
构建了Mask R-CNN的配置类(包括和不包含GPU)。
从磁盘加载Keras + Mask R-CNN架构
预处理我们的输入图像
检测到图像中的对象/蒙版
可视化结果
我希望你喜欢今天的帖子!
源代码下载
下载链接 https://hotdog29.com/?p=643
原文链接
Mask R-CNN Keras 对象检测 对象分割 像素掩码
文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24Keras Mask R-CNN/,2009年7月16日访问
相关文章