当前位置:K88软件开发文章中心编程资讯编程资讯08 → 文章内容

教程 | 如何使用Docker、TensorFlow目标检测API和OpenCV实现实时目标检测和视频处理

减小字体 增大字体 作者:华军  来源:华军资讯  发布时间:2019-2-11 18:20:19

原标题:教程 | 如何使用Docker、TensorFlow目标检测API和OpenCV实现实时目标检测和视频处理选自TowardsDataScience作者:Léo Beaucourt机器之心编译参与:李诗萌、路雪本文展示了如何使用 Docker 容器中的 TensorFlow 目标检测 API,通过网络摄像头执行实时目标检测,同时进行视频后处理。作者使用的是 OpenCV 和 Python3 多进程和多线程库。本文重点介绍了项目中出现的问题以及作者采用的解决方案。完整代码地址:https://github.com/lbeaucourt/Object-detection用 YouTube 视频进行视频处理测试动机我是从这篇文章《Building a Real-Time Object Recognition App with Tensorflow and OpenCV》(https://towardsdatascience.com/building-a-real-time-object-recognition-app-with-tensorflow-and-opencv-b7a2b4ebdc32)开始探索实时目标检测问题,这促使我研究 Python 多进程库,使用这篇文章(https://www.pyimagesearch.com/2015/12/21/increasing-webcam-fps-with-python-and-opencv/)中介绍的方法提高每秒帧数(frames per second,FPS)。为了进一步加强项目的可移植性,我试着将自己的项目整合到 Docker 容器中。这一过程的主要困难在于处理流入和流出容器的视频流。此外,我还在项目中添加了视频后处理功能,这一功能也使用了多进程,以减少视频处理的时间(如果使用原始的 TensorFlow 目标检测 API 处理视频,会需要非常非常长的时间)。在我的个人电脑上可以同时进行高性能的实时目标检测和视频后处理工作,该过程仅使用了 8GB 的 CPU。用于数据科学的 Docker鉴于大量文章对 TensorFlow 目标检测 API 的实现进行了说明,因此此处不再赘述。作为一名数据科学家,我将展示如何在日常工作中使用 Docker。请注意,我用的是来自 Tensorflow 的经典 ssd_mobilenet_v2_coco 模型。我在本地复制了模型(.pb 文件)和对应的标签映射,以便后续个人模型的运行。我相信现在使用 Docker 已经是数据科学家最基础的技能了。在数据科学和机器学习的世界中,每周都会发布许多新的算法、工具和程序,在个人电脑上安装并测试它们很容易让系统崩溃(亲身经历!)。为了防止这一悲惨事件的发生,我现在用 Docker 创建数据科学工作空间。你可以在我的库中找到该项目的相关 Docker 文件。以下是我安装 TensorFlow 目标检测的方法(按照官方安装指南进行):同样,我还安装了 OpenCV:建立图像会花几分钟的时间,但是之后用起来就会又快又容易。实时目标检测首先我试着将目标检测应用于网络摄像头视频流。《Building a Real-Time Object Recognition App with Tensorflow and OpenCV》完整地介绍了这项工作的主体部分。困难在于如何将网络摄像头视频流传送到 Docker 容器 中,并使用 X11 服务器恢复输出流,使视频得以显示出来。将视频流传送到容器中使用 Linux 的话,设备在 /dev/ 目录中,而且通常可以作为文件进行操作。一般而言,你的笔记本电脑摄像头是「0」设备。为了将视频流传送到 docker 容器中,要在运行 docker 图像时使用设备参数:对 Mac 和 Windows 用户而言,将网络摄像头视频流传送到容器中的方法就没有 Linux 那么简单了(尽管 Mac 是基于 Unix 的)。本文并未对此进行详细叙述,但 Windows 用户可以使用 Virtual Box 启动 docker 容器来解决该问题。从容器中恢复视频流解决这个问题时花了我一些时间(但解决方案仍旧不尽如人意)。我在 http://wiki.ros.org/docker/Tutorials/GUI 网页发现了一些使用 Docker 图形用户界面的有用信息,尤其是将容器和主机的 X 服务器连接,以显示视频。首先,你必须要放开 xhost 权限,这样 docker 容器才能通过读写进 X11 unix socket 进行正确显示。首先要让 docker 获取 X 服务器主机的权限(这并非最安全的方式):在成功使用该项目后,再将控制权限改回默认值:创建两个环境变量 XSOCK 和 XAUTH:XSOCK 指 X11 Unix socket,XAUTH 指具备适当权限的 X 认证文件:最后,我们还要更新 docker 运行的命令行。我们发送 DISPLAY 环境变量,为 X11 Unix socket 和带有环境变量 XAUTHORITY 的 X 认证文件安装卷:现在我们可以运行 docker 容器了,而它完成后是这样的:

教程 | 如何使用Docker、TensorFlow目标检测API和OpenCV实现实时目标检测和视频处理