如何利用Tensorflow和OpenCV构建实时对象识别程序?

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

引言
在本文中,将逐步介绍如何使用Tensorflow(TF)的新对象检测API和Python 3中OpenCV如何轻松构建自己的实时对象识别应用程序。

下面是正在运行的应用程序:

目的与动机

Google发布了新的TensorFlow对象检测API。第一版包含:

  • 预先训练的模型(尤其是重点放在轻量模型上,以便它们可以在移动设备上运行)

  • Jupyter笔记本示例,其中包含一个已发布的型号

  • 非常方便的脚本,可用于例如在您自己的数据集上对模型进行重新训练。

我们希望能充分理解这个新东西,并且花费一些时间来建立一个简单的实时对象识别演示。

目标检测演示

首先,我们下载了TensorFlow模型库,然后查看了他们发布的注释。它基本上遍历了使用预训练模型的所有步骤。在他们的示例中,他们使用了“带有Mobilenet的SSD”模型,但是我们也可以在他们称为“ Tensorflow检测模型”的情况下下载其他一些经过预先训练的模型。这些模型是在COCO数据集上训练的,并随模型速度(慢速,中度和快速)和模型性能而变化。

接下来我们要做的是运行示例。该示例实际上有据可查。本质上,这就是它的作用:

  1. 导入所需的软件包,例如TensorFlow,PIL等。

  2. 定义一些变量,例如类别数,模型名称等。

  3. 下载模型(.pb — protobuf)并将其加载到内存中。

  4. 加载一些代码,例如标签转换器的索引。

  5. 通过两张图像测试代码。

注意:在运行示例之前,请注意查看设置说明。protobuf的编译部分尤其重要:

# From tensorflow/models/research/protoc object_detection/protos/*.proto --python_out=.

然后,我们获取了他们的代码并进行了相应的修改:

  • 删除模型下载部分

  • TensorFlow会话没有“ with”语句,因为这是一个巨大的消耗,尤其是当每次需要在每个流之后启动会话时

  • 不需要PIL,因为OpenCV中的视屏流已经存在于numpy数组中(PIL也是非常大的消耗,特别是在将其用于读取图像时)

然后,我们使用OpenCV将其与网络摄像头连接。那里有许多示例解释了如何做到这一点,甚至是官方文档。

通常,许多OpenCV示例的实现并不是真正的最佳选择,例如,OpenCV中的某些功能受I/O限制。因此,我们不得不想出各种解决方案来解决此问题:

从网络摄像机读取帧会导致大量I/O。我们的想法是使用多处理库将这部分内容完全移到另一个Python进程中。关于Stackoverflow的一些解释为什么它不起作用,但我没有对此进行更深入的研究。在Adrian Rosebrock的网站“ pyimagesearch”上一个很好的示例,该示例使用线程代替,从而大大提高了我们的fps。

每次启动应用程序时,将冻结的模型加载到内存中都是很大消耗。而且我们已经为每次运行使用了一个TF会话,但这仍然很慢。在这种情况下,我们使用了多处理库将对象检测部分的繁重工作转移到多个进程中。应用程序的初始启动会很慢,因为每个进程都需要将模型加载到内存中并启动TF会话,但是在此之后,程序的并行性将极大提高运行效率。

注意:如果像我们在Mac OSX上使用OpenCV 3.1,则一段时间后OpenCV的VideoCapture可能会崩溃。如果已经存在问题,切换回OpenCV 3.0则可以解决此问题。

下载1:OpenCV-Contrib扩展模块中文版教程
(0)

相关推荐