使用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,并添加以下代码:我们从第2-8行开始导入数据包。在此之前,您需要imutils和OpenCV3.3。在系统设置上,您只需要使用默认设置安装OpenCV(还要确保您遵循所有Python虚拟环境命令)。注意:请务必下载并安装OpenCV3.3(或更高版本)和OpenCV-contrib版本(适用于OpenCV3.3)以确保包含深度神经网络模块。接下来,我们将解析这些命令行参数:与之前的对象检测项目相比,我们不需要图像参数,因为这里我们处理的是视频流和视频——除了以下参数保持不变:——prototxt:Caffeprototxt文件路径。--model:预训练模型的路径。--confidence:过滤weakdetections的最小概率阈值,默认值为20%。接下来,我们初始化类列表和颜色集:在第22-26行,我们初始化CLASS标签和相应的随机颜色。关于这些类的详细信息(以及网络是如何训练的),请参考:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/现在,我们加载我们自己的模型,并设置我们自己的视频流:我们加载我们自己的序列化模型,提供对我们自己的原型和模型文件的引用(第30行),你可以看到在OpenCV3.3中,这非常简单。接下来,我们初始化视频流(源可以是视频文件或相机)。首先,我们启动VideoStream(第35行),然后等待摄像头启动(第36行),最后开始计算每秒帧数(第37行)。VideoStream和FPS类是imutils包的一部分。现在,让我们遍历每一帧(如果速度快,也可以跳过一些帧):首先,我们从视频流中读取一个帧(第43行),然后调整它的大小(第44行OK)。由于稍后我们需要宽度和高度,我们在第47行获取它。然后使用dnn模块(第48行)将框架转换为blob。现在,我们将blob设置为神经网络的输入(第52行)并通过网络传递输入(第53行),这为我们提供了检测结果。至此,我们已经检测到输入帧中的对象,现在是时候查看置信度值,看看我们是否可以在对象周围绘制边界框和标签:我们首先循环检测,记住在image可以检测到多个目标。我们还需要检查每次检测的置信度(即概率)。如果置信度足够高(高于阈值),那么我们会在终端中显示预测并以文本和彩色边界框的形式对图像进行预测。让我们逐行看一下:在检测中循环,首先我们提取置信度值(第59行)。如果置信度高于阈值(第63行),则我们提取类标签索引(第67行)并计算检测到的对象的坐标(第68行)。然后我们提取边界框的(x,y)坐标(第69行),稍后将用于绘制矩形和文本。我们构建了一个包含CLASS名称和置信度的文本标签(第72、73行)。我们还使用类颜色和先前提取的(x,y)坐标在对象周围绘制彩色矩形(第74、75行)。通常,我们希望标签出现在矩形上方,但如果没有空间,我们将标签显示在矩形顶部的正下方(第76行)。***,我们使用刚刚计算的y值将彩色文本放置在框架上(第77、78行)。帧捕获循环的其余步骤包括:(1)显示帧;(2)检查退出键;(3)更新fps计数器:上面的代码块很简单,首先我们显示帧(第81行),然后找到特定的键(第82行),同时检查“q”键(代表“quit”)是否被按下。如果是,我们退出帧捕获循环(第85、86行)。***更新fps计数器(第89行)。如果我们退出循环(“q”键或视频流结束),我们也会处理这个:当我们退出循环时,fps计数器停止(第92行),每秒帧数信息输出到航站楼(93号线、94号线)。我们关闭窗口(第97行),然后停止视频流(第98行)。如果您已经做到这一点,请准备好试用您自己的网络摄像头,看看它是如何工作的。让我们继续下一部分。实时深度学习对象检测的结果要使实时深度学习对象检测器正常工作,请确保您使用本指南“下载”部分中的示例代码和预训练的卷积神经网络。(请打开原链接,进入“下载”部分,输入邮箱,获取所需代码等信息。)打开终端,执行以下命令:如果OpenCV可以访问你的相机,你可以看到目标的输出视频帧。请注意,深度学习对象检测器不仅能够检测到人,还能检测到人坐的沙发和旁边的椅子——所有这些都是实时的!总结今天的博客,我们学习了如何使用深度学习+OpenCV+视频流来执行实时对象检测。我们通过以下两个教程完成了此操作:使用深度学习和OpenCV进行对象检测(http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/)高效,将视频流式传输到OpenCV(http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/)最终结果是基于深度学习的对象检测器,可以以6-8FPS的速度处理视频(当然,这也取决于您的系统速度)。您可以通过以下方式进一步提高速度:跳帧。使用不同的MobileNet变体(更快,但不太准确)。使用SqueezeNet的量化变体(我没有测试过这个,但我想它应该更快,因为它的网络占用空间更小)。原文:http://www.pyimagesearch.com/2017/09/18/real-time-object-detection-with-deep-learning-and-opencv/【本文为专栏《HeartoftheMachine》,微信公众号《机器之心(id:almosthuman2014)》】点此查看该作者更多好文
