选自PyimageSearch网络
机器之心编译ide
参与:路雪、李泽南学习
使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是很是简单的,咱们只须要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能。
在本文中咱们将学习如何扩展原有的目标检测项目,使用深度学习和 OpenCV 将应用范围扩展到实时视频流和视频文件中。这个任务会经过 VideoStream 类来完成。测试
深度学习目标检测教程:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
ui
VideoStream 类教程:http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/命令行
如今,咱们将开始把深度学习+目标检测的代码应用于视频流中,同时测量 FPS 处理速度。线程
为了构建基于 OpenCV 深度学习的实时目标检测器,咱们须要有效地接入摄像头/视频流,并将目标检测应用到每一帧里。cdn
首先,咱们打开一个新文件,将其命名为 real_time_object_detection.py,随后加入如下代码:视频
咱们从第 2-8 行开始导入封包。在此以前,你须要 imutils 和 OpenCV 3.3。在系统设置上,你只须要以默认设置安装 OpenCV 便可(同时确保你遵循了全部 Python 虚拟环境命令)。blog
Note:请确保本身下载和安装的是 OpenCV 3.3(或更新版本)和 OpenCV-contrib 版本(适用于 OpenCV 3.3),以保证其中包含有深度神经网络模块。
下面,咱们将解析这些命令行参数:
与此前的目标检测项目相比,咱们不须要图像参数,由于在这里咱们处理的是视频流和视频——除了如下参数保持不变:
--prototxt:Caffe prototxt 文件路径。
--model:预训练模型的路径。
--confidence:过滤弱检测的最小几率阈值,默认值为 20%。
随后,咱们初始化类列表和颜色集:
在第 22-26 行,咱们初始化 CLASS 标签,和相应的随机 COLORS。有关这些类的详细信息(以及网络的训练方式),请参考:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
如今,咱们加载本身的模型,并设置本身的视频流:
咱们加载本身的序列化模型,提供对本身的 prototxt 和模型文件的引用(第 30 行),能够看到在 OpenCV 3.3 中,这很是简单。
下一步,咱们初始化视频流(来源能够是视频文件或摄像头)。首先,咱们启动 VideoStream(第 35 行),随后等待相机启动(第 36 行),最后开始每秒帧数计算(第 37 行)。VideoStream 和 FPS 类是 imutils 包的一部分。
如今,让咱们遍历每一帧(若是你对速度要求很高,也能够跳过一些帧):
首先,咱们从视频流中读取一帧(第 43 行),随后调整它的大小(第 44 行)。因为咱们随后会须要宽度和高度,因此咱们在第 47 行上进行抓取。随后将 frame 转换为一个有 dnn 模块的 blob(第 48 行)。
如今,咱们设置 blob 为神经网络的输入(第 52 行),经过 net 传递输入(第 53 行),这给咱们提供了 detections。
这时,咱们已经在输入帧中检测到了目标,如今是时候看看置信度的值,以判断咱们可否在目标周围绘制边界框和标签了:
咱们首先在 detections 内循环,记住一个图像中能够检测到多个目标。咱们还须要检查每次检测的置信度(即几率)。若是置信度足够高(高于阈值),那么咱们将在终端展现预测,并以文本和彩色边界框的形式对图像做出预测。让咱们逐行来看一下:
在 detections 内循环,首先咱们提取 confidence 值(第 59 行)。
若是 confidence 高于最低阈值(第 63 行),那么咱们提取类标签索引(第 67 行),并计算检测到的目标的坐标(第 68 行)。
而后,咱们提取边界框的 (x, y) 坐标(第 69 行),以后将用于绘制矩形和文本。
咱们构建一个文本 label,包含 CLASS 名称和 confidence(第 7二、73 行)。
咱们还要使用类颜色和以前提取的 (x, y) 坐标在物体周围绘制彩色矩形(第 7四、75 行)。
一般,咱们但愿标签出如今矩形上方,可是若是没有空间,咱们将在矩形顶部稍下的位置展现标签(第 76 行)。
最后,咱们使用刚才计算出的 y 值将彩色文本置于帧上(第 7七、78 行)。
帧捕捉循环剩余的步骤还包括:(1)展现帧;(2)检查 quit 键;(3)更新 fps 计数器:
上述代码块简单明了,首先咱们展现帧(第 81 行),而后找到特定按键(第 82 行),同时检查「q」键(表明「quit」)是否按下。若是已经按下,则咱们退出帧捕捉循环(第 8五、86 行)。最后更新 fps 计数器(第 89 行)。
若是咱们退出了循环(「q」键或视频流结束),咱们还要处理这些:
当咱们跳出(exit)循环,fps 计数器 中止(第 92 行),每秒帧数的信息向终端输出(第 9三、94 行)。
咱们关闭窗口(第 97 行),而后中止视频流(第 98 行)。
若是你到了这一步,那就能够作好准备用本身的网络摄像头试试看它是如何工做的了。咱们来看下一部分。
为了实时深度学习目标检测器正常运行,确保你使用本指南「Downloads」部分中的示例代码和预训练的卷积神经网络。(请打开原文连接,进入「Downloads」部分,输入本身的邮箱地址,获取所需代码和其余资料。)
打开终端,执行下列命令:
若是 OpenCV 可以访问你的摄像头,你能够看到带有检测到的目标的输出视频帧。我对样本视频使用了深度学习目标检测,结果以下:
图 1:使用深度学习和 OpenCV + Python 进行实时目标检测的短片。
注意深度学习目标检测器不只可以检测到人,还能检测到人坐着的沙发和旁边的椅子——全部都是实时检测到的!
今天的博客中,咱们学习了如何使用深度学习 + 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/
本文为机器之心编译,转载请联系本公众号得到受权。