教程 | 深度学习 + OpenCV,Python 实现实时视频目标检测
选自 PyimageSearch
机器之心编译
参与:路雪、李泽南
使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能。
在本文中我们将学习如何扩展原有的目标检测项目,使用深度学习和 OpenCV 将应用范围扩展到实时视频流和视频文件中。这个任务会通过 VideoStream 类来完成。
深度学习目标检测教程:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
VideoStream 类教程:http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/
现在,我们将开始把深度学习 + 目标检测的代码应用于视频流中,同时测量 FPS 处理速度。
使用深度学习和 OpenCV 进行视频目标检测
为了构建基于 OpenCV 深度学习的实时目标检测器,我们需要有效地接入摄像头 / 视频流,并将目标检测应用到每一帧里。
首先,我们打开一个新文件,将其命名为 real_time_object_detection.py,随后加入以下代码:
Note:请确保自己下载和安装的是 OpenCV 3.3(或更新版本)和 OpenCV-contrib 版本(适用于 OpenCV 3.3),以保证其中包含有深度神经网络模块。
下面,我们将解析这些命令行参数:
--prototxt:Caffe prototxt 文件路径。
--model:预训练模型的路径。
--confidence:过滤弱检测的最小概率阈值,默认值为 20%。
随后,我们初始化类列表和颜色集:
现在,我们加载自己的模型,并设置自己的视频流:
下一步,我们初始化视频流(来源可以是视频文件或摄像头)。首先,我们启动 VideoStream(第 35 行),随后等待相机启动(第 36 行),最后开始每秒帧数计算(第 37 行)。VideoStream 和 FPS 类是 imutils 包的一部分。
现在,让我们遍历每一帧(如果你对速度要求很高,也可以跳过一些帧):
现在,我们设置 blob 为神经网络的输入(第 52 行),通过 net 传递输入(第 53 行),这给我们提供了 detections。
这时,我们已经在输入帧中检测到了目标,现在是时候看看置信度的值,以判断我们能否在目标周围绘制边界框和标签了:
在 detections 内循环,首先我们提取 confidence 值(第 59 行)。
如果 confidence 高于最低阈值(第 63 行),那么我们提取类标签索引(第 67 行),并计算检测到的目标的坐标(第 68 行)。
然后,我们提取边界框的 ( x, y ) 坐标(第 69 行),之后将用于绘制矩形和文本。
我们构建一个文本 label,包含 CLASS 名称和 confidence(第 72、73 行)。
我们还要使用类颜色和之前提取的 ( x, y ) 坐标在物体周围绘制彩色矩形(第 74、75 行)。
通常,我们希望标签出现在矩形上方,但是如果没有空间,我们将在矩形顶部稍下的位置展示标签(第 76 行)。
最后,我们使用刚才计算出的 y 值将彩色文本置于帧上(第 77、78 行)。
帧捕捉循环剩余的步骤还包括:(1)展示帧;(2)检查 quit 键;(3)更新 fps 计数器:
如果我们退出了循环(「q」键或视频流结束),我们还要处理这些:
我们关闭窗口(第 97 行),然后停止视频流(第 98 行)。
如果你到了这一步,那就可以做好准备用自己的网络摄像头试试看它是如何工作的了。我们来看下一部分。
实时深度学习目标检测的结果
为了实时深度学习目标检测器正常运行,确保你使用本指南「Downloads」部分中的示例代码和预训练的卷积神经网络。(请打开原文链接,进入「Downloads」部分,输入自己的邮箱地址,获取所需代码和其他资料。)
打开终端,执行下列命令:
注意深度学习目标检测器不仅能够检测到人,还能检测到人坐着的沙发和旁边的椅子——所有都是实时检测到的!
总结
今天的博客中,我们学习了如何使用深度学习 + OpenCV + 视频流来执行实时目标检测。我们通过下列两个教程完成了这一目标:
1. 使用深度学习和 OpenCV 进行目标检测(http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/)
2. 在 OpenCV 上进行高效、线程化的视频流(http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/)
最终结果是基于深度学习的目标检测器可以处理 6-8 个 FPS 的视频(当然,这也取决于你的系统速度)。
你还可以通过以下途径进一步提升速度:
1. 跳过帧。
2. 使用 MobileNet 的不同变体(速度更快,但是准确率下降)。
3. 使用 SqueezeNet 的量子化变体(我还未对此进行测试,但是我想应该会更快,因为它的网络足迹更小)。
原文链接:http://www.pyimagesearch.com/2017/09/18/real-time-object-detection-with-deep-learning-and-opencv/