如何使用Tensorflow对象检测进行像素级分类?
最近,Tensorflow添加了一些新的功能,现在我们可以扩展API来确定感兴趣的对象的像素和像素位置。请参见下面的例子:
代码的部分就不在这里赘述,详情可以参见(https://github.com/priya-dwivedi/Deep-Learning/blob/master/Mask_RCNN/Mask_RCNN_Videos.ipynb)
实例分割
实例分割是对象检测的一个扩展,其中一个二进制掩码(即对象和背景)与每个边界框关联。这允许对框内对象的范围进行更细粒度的信息。
那么我们什么时候会需要这种额外的粒度呢?我想到的一些例子是:
1.自动驾驶汽车——它的使用需要知道其他的车辆的在行驶过程中、停靠在路边时等等的确切的位置,或者是一个人过马路的地点、行驶的路径等。
2.机器人系统——如果机器人知道两个部件的准确位置,它们的行为就会表现的更好。
有几种算法实现了实例分割,但Tensorflow对象检测API所使用的算法是掩码RCNN。
Mask RCNN
让我们先从比较简单的地方说起。
Faster RCNN是一个非常好的算法,用于对象检测。Faster RCNN由两个阶段组成。第一阶段,称为区域提案网络(RPN),提出候选对象边界框。第二阶段,在本质上是Faster RCNN,从每个候选框中提取出使用RoIPool的特性,并进行分类和边界框的回归。两个阶段使用的特性可以共享,以获得更快的推理。
Mask R-CNN在概念上很简单:Faster RCNN对每个候选对象有两个输出,一个类标签和一个边界框偏移。为此,我们添加了输出对象掩码的第三个分支——这是一个二进制掩码,表示对象在边界框中的像素。但是额外的掩码输出与类和框输出不同,需要提取更精细的物体空间布局。为此,RCNN使用了下面描述的全卷积网络掩码RCNN文件(FCN)。
FCN是一种常用的语义分割算法。这个模型使用了不同的卷积和最大池化层,首先将图像解压到原始大小的1/32。然后在这个粒度级别上进行类别预测。最后,它使用了采样和反褶积来调整图像的大小。
因此,简而言之,我们可以说,Mask RCNN结合了两个网络——Faster RCNN和一个大型架构中的FCN。该模型的损失函数是在进行分类、生成边界框和生成掩码时的总损失。
Mask RCNN有一些额外的改进,使得它比FCN更加精确。你可以在他们的论文中了解更多。
实现
测试图像
要在图像上测试这个模型,你可以利用在Tensorflow网站上共享的代码。我测试了他们最轻量级的模型mask_rcnn_inception_v2_coco。只需下载模型并升级到tensorflow 1.5(这很重要!)请参阅下面的示例结果:
测试视频
对我来说,更有趣的练习是在You tube上运行这个模型。我用keepvid从你的tube上下载了一些视频。而且我喜欢看图书馆的电影,因为它可以操纵视频文件。
主要步骤是:
·使用VideoFileClip函数从视频中提取每个帧。
·fl_image函数是一个非常棒的函数,它可以接收图像并将其替换为修改后的图像。用它来对从视频中提取的每个图像进行对象检测。
·最后将所有修改后的剪辑图像合并到一个新的视频中。
下一个步骤
关于这个API的进一步探索,还有一些其他的想法:
·尝试更精确但高负荷的模型,看看他们有多大的不同。
·使用API在自定义数据集上训练掩码RCNN。接下来准备要做的事情。