使用Mask R-CNN算法检测今世缘酒

我们先介绍计算机视觉人工智能两个重要的概念:图像分类和检测。图像分类目标是预测一张完整的图片属于哪个分类。物体检测需要搜索一张图片中所有的物体,然后分别标记这些物体是什么,同时需要计算出每个物体的边界和坐标,物体检测不仅要确定图片是什么还要告诉我们物体在图片中的具体位置。

很明显物体检测难度要比图像分类更高。但我们今天会介绍一个难度更高的物体检测segmentation,实体分割。实体分割除了像物体检测一样需要确定每个物体位置,它甚至会给我们物体所在图片上精确到每个像素点的位置,而不仅仅是一个物体的边界。实体分割算法让我们看到计算视觉技术强大,它可以应用于自动驾驶、机器人等其他更多领域。

本文主要简单介绍物体检测、实体分割它们之间的不同;并且使用Mask R-CNN架构实现实体分割算法。我们将使用Keras开源框架实现 Mask R-CNN framework。我们将介绍如何利用该技术应用于新零售应用场景。

物体检测和实体分割

深度学习能够帮助我们在计算机视觉领域达到空前计算精度,甚至超过人类,包括图片分类、物体检测和实体分割。我们先来了解一下他们之间算法有什么不同?如下图所示4种不同算法。

 

QQ20190205-144856@2x

a)图像识别算法,它可以识别出图片中物体并且准确预测物体标识bottle、cup、cube

b)物体检测算法,它可以准确识别出图片中每个物体,并且给出具体的边界位置

c)语义分割算法和实体分割算法搜索图片中每个物体,区分出背景和标识出每个物体,精确给出物体像素区域

语义分割算法有很多应用场景例如在自动驾驶应用中,它可以通过汽车摄像头获得图像和视频了解整个环境中的物体。语义分割算法也可能要求每个对象,不管是什么类,都要有唯一的标签。这种类型的分割称为全光分割。

重要的是要注意的是,全光分割是一个非常具有挑战性的问题,因为我们需要确保不仅输入图像中的每个像素都分配给一个标签,而且每个对象都有唯一的标签和分割。

另一方面,实例分割是一个比较容易的问题(与全光分割相比)。实例分割可以看作是对象检测和语义分割的混合体。
当对象检测生成一个边界框时,实例分割为每个单独的对象对象生成一个像素级的遮罩。然而,实例分割并不要求图像中的每个像素都与标签相关联。
如图提供了图像分类(左上)、对象检测(右上)、语义分割(左下)和实例分割(右下)的可视化效果。由于对于大多数问题,实例分割往往是一个更容易处理、更现实的用例,更不用说,对于这样一个任务,有更多的标记数据,我们将在本文中重点使用mask r-cnn框架执行实例分割。

什么是Mask R-CNN?

Mask R-CNN算法是2017年He et al发表一篇论文 Mask R-CNN builds on the previous object detection work of R-CNN, Fast R-CNN, and Faster R-CNN by Girshick et al.

Faster R-CNN架构类似于图像网分类网络的最后一层使用ROI Pooling module通过2个FC layers (each 4096-d)

最后输出层FC layers包含2各FC layers网络。一个FC layer是N + 1,作为预测每个物体分类标记,额外+1作为背景标识。第二个FC layer是4 × N网络它提供预测每个物体矩形边界。

这样,我们可以认为一个Faster R-CNN产生2个系列的数据:
•每个分类标签和概率
•每个物体边界预测
如下图所示

QQ20190205-150339@2x
如何将Faster R-CNN转换为Mask R-CNN,He et al. 论文中增加额外分支网络。这个分支网络预测实际物体Mask,如上图所示。

注意一个新的并行分支是如何在网络体系结构中引入的。掩蔽分支从ROI对齐模块中分离出来(这是对Girshick等人的改进。ROI池模块)在我们的fc层之前,然后由两个conv层组成,这些conv层负责自己创建遮罩Mask预测。

实际上,Mask R-CNN 只为 R-CNN框架引入了一点开销,并且仍然可以以大约5 fps的速度运行在一个GPU ResNet-101 backend上。此外,就像 Faster R-CNN和SSD一样,它可以利用不同的架构,如 ResNet, VGG, SqueezeNet, MobileNet等作为其后端/主干,从而减少大小并增加fps吞吐量。

了解Mask R-CNN输出Volume Size

在我们进入这一章之前,我认为有必要讨论一下Mask R-CNN的输出volume dimensions 。

the Faster R-CNN/Mask R-CNN 利用区域建议网络(RPN)生成可能包含对象的图像区域。这些区域中的每一个都是根据其“对象性得分”(即给定区域可能包含对象的可能性)进行排名的,然后保持前n个最有信心的对象性区域。
在原始Faster R-CNN公开论文中, Girshick et al. 设置N = 2, 000,但实际应用中我们使用一个更小N,例如N = 10,100,200,300它可以得到很好的结果。He et al. 设置N = 300在他公开的论文中,我们也使用这个值。
300多个ROI中的每一个都会经过网络的三个并行分支:

• 标识预测
• 边界区域预测
• Mask遮罩预测
在预测过程中,300个ROI中的每一个都经过非极大值抑制,并保留前100个检测盒,得到100×L×15×15的4d张量,其中L是数字。数据集中的类标签,15×15是每个L掩码的大小。例如,如果我们使用的是coco数据集,它有L=90个类,那么R-CNN Mask模块的体积大小为100×90×15×15。
执行正向传递之后,我们可以循环遍历每个检测到的边界框,找到对应概率最大的类标签索引,然后使用索引查找15×15Mask,100×90×15×15卷。
用伪代码编写的查找可能如下:instancemask=masks[i,classid],
其中i是当前检测的索引(即输出卷的第一维),classid是对应概率最大的类标签的索引。
在执行查找之后,我们现在有了InstanceMask,它是一个15×15的遮罩,代表第i个被检测对象的像素分割。
然后,我们可以将遮罩缩放回图像的原始尺寸,确保使用最近邻插值,从而获得原始图像的像素级遮罩。
提取一个15×15的遮罩,调整到原始图像尺寸,然后将遮罩覆盖在被检测对象上的示例如图所示。
那么,为什么是最近邻插值?对插值算法的讨论远远超出了本书的范围,更不用说是一个研究领域;然而,要点是最近邻插值将在调整大小时保留图像的所有原始值,而不引入新值。
虽然最近邻插值对人眼的吸引力较小,例如双线性或双三次插值,但这里的好处是我们在调整图像大小时不引入“新”对象/遮罩分配。在调整自己的遮罩大小时,请确保正在执行最近邻插值。

QQ20190205-152951@2x

安装Keras Mask R-CNN

1.下载开源Keras Mask R-CNN源码

Clone this repository https://github.com/matterport/Mask_RCNN

2.安装依赖类库

pip3 install -r requirements.txt

3.进入repository root directory运行Run setup

python3 setup.py install
4.点击下载pre-trained COCO weights (mask_rcnn_coco.h5) 。

5.训练自己样本和网络,预测图片如下图所示:今世缘海报中准确预测出今世缘酒JSY 0.9912,JSY OTHERS 0.9638。

WX20190122-184521@2x

今世缘移动访销系统中任意找了一张终端门店陈列图,准确预测今世缘酒数量和位置如下图所示。

 

WX20190122-185119@2x

沪公网安备 31010702002009号