数据中心 频道

如何用Tensorflow对象检测进行像素级分类

  【IT168 资讯】最近,Tensorflow添加了一些新的功能,现在我们可以扩展API来确定感兴趣的对象的像素和像素位置。请参见下面的例子:

如何使用Tensorflow对象检测进行像素级分类?

  代码的部分就不在这里赘述,详情可以参见(https://github.com/priya-dwivedi/Deep-Learning/blob/master/Mask_RCNN/Mask_RCNN_Videos.ipynb)

  实例分割

  实例分割是对象检测的一个扩展,其中一个二进制掩码(即对象和背景)与每个边界框关联。这允许对框内对象的范围进行更细粒度的信息。

  那么我们什么时候会需要这种额外的粒度呢?我想到的一些例子是:

  1.自动驾驶汽车——它的使用需要知道其他的车辆的在行驶过程中、停靠在路边时等等的确切的位置,或者是一个人过马路的地点、行驶的路径等。

  2.机器人系统——如果机器人知道两个部件的准确位置,它们的行为就会表现的更好。

  有几种算法实现了实例分割,但Tensorflow对象检测API所使用的算法是掩码RCNN。

  Mask RCNN

  让我们先从比较简单的地方说起。  

如何使用Tensorflow对象检测进行像素级分类?
Mask RCNN 架构
  

  Faster RCNN是一个非常好的算法,用于对象检测。Faster RCNN由两个阶段组成。第一阶段,称为区域提案网络(RPN),提出候选对象边界框。第二阶段,在本质上是Faster RCNN,从每个候选框中提取出使用RoIPool的特性,并进行分类和边界框的回归。两个阶段使用的特性可以共享,以获得更快的推理。

  Mask R-CNN在概念上很简单:Faster RCNN对每个候选对象有两个输出,一个类标签和一个边界框偏移。为此,我们添加了输出对象掩码的第三个分支——这是一个二进制掩码,表示对象在边界框中的像素。但是额外的掩码输出与类和框输出不同,需要提取更精细的物体空间布局。为此,RCNN使用了下面描述的全卷积网络掩码RCNN文件(FCN)。

如何使用Tensorflow对象检测进行像素级分类?
▲全卷积网络体系结构

    FCN是一种常用的语义分割算法。这个模型使用了不同的卷积和最大池化层,首先将图像解压到原始大小的1/32。然后在这个粒度级别上进行类别预测。最后,它使用了采样和反褶积来调整图像的大小。

  因此,简而言之,我们可以说,Mask RCNN结合了两个网络——Faster RCNN和一个大型架构中的FCN。该模型的损失函数是在进行分类、生成边界框和生成掩码时的总损失。

  Mask RCNN有一些额外的改进,使得它比FCN更加精确。你可以在他们的论文中了解更多。

  实现

  测试图像

  要在图像上测试这个模型,你可以利用在Tensorflow网站上共享的代码。我测试了他们最轻量级的模型mask_rcnn_inception_v2_coco。只需下载模型并升级到tensorflow 1.5(这很重要!)请参阅下面的示例结果:

如何使用Tensorflow对象检测进行像素级分类?
▲在风筝图像上的Mask RCNN

  测试视频

  对我来说,更有趣的练习是在You tube上运行这个模型。我用keepvid从你的tube上下载了一些视频。而且我喜欢看图书馆的电影,因为它可以操纵视频文件。

  主要步骤是:

  ·使用VideoFileClip函数从视频中提取每个帧。

  ·fl_image函数是一个非常棒的函数,它可以接收图像并将其替换为修改后的图像。用它来对从视频中提取的每个图像进行对象检测。

  ·最后将所有修改后的剪辑图像合并到一个新的视频中。

  下一个步骤

  关于这个API的进一步探索,还有一些其他的想法:

  ·尝试更精确但高负荷的模型,看看他们有多大的不同。

  ·使用API在自定义数据集上训练掩码RCNN。接下来准备要做的事情。

0
相关文章