深度学习+OpenCV,Python实现实时视频⽬标检测
使⽤ OpenCV 和 Python 对实时视频流进⾏深度学习⽬标检测是⾮常简单的,我们只需要组合⼀些合适的代码,接⼊实时视频,随后加⼊原有的⽬标检测功能。
在本⽂中我们将学习如何扩展原有的⽬标检测项⽬,使⽤深度学习和 OpenCV 将应⽤范围扩展到实时视频流和视频⽂件中。这个任务会通过 VideoStream 类来完成。
深度学习⽬标检测教程:
VideoStream 类教程:
现在,我们将开始把深度学习+⽬标检测的代码应⽤于视频流中,同时测量 FPS 处理速度。
使⽤深度学习和 OpenCV 进⾏视频⽬标检测
为了构建基于 OpenCV 深度学习的实时⽬标检测器,我们需要有效地接⼊摄像头/视频流,并将⽬标检测应⽤到每⼀帧⾥。
⾸先,我们打开⼀个新⽂件,将其命名为 real_time_object_detection.py,随后加⼊以下代码:
我们从第 2-8 ⾏开始导⼊封包。在此之前,你需要 imutils 和 OpenCV 3.3。在系统设置上,你只需要以默认设置安装 OpenCV 即可(同时确保你遵循了所有 Python 虚拟环境命令)。
Note:请确保⾃⼰下载和安装的是 OpenCV 3.3(或更新版本)和 OpenCV-contrib 版本(适⽤于 OpenCV 3.3),以保证其中包含有深度神经⽹络模块。
下⾯,我们将解析这些命令⾏参数:
与此前的⽬标检测项⽬相⽐,我们不需要图像参数,因为在这⾥我们处理的是视频流和视频——除了以下参数保持不变:--prototxt:Caffe prototxt ⽂件路径。
--model:预训练模型的路径。
--confidence:过滤弱检测的最⼩概率阈值,默认值为 20%。
随后,我们初始化类列表和颜⾊集:
在第 22-26 ⾏,我们初始化 CLASS 标签,和相应的随机 COLORS。有关这些类的详细信息(以及⽹络的训练⽅式),请参考:
python怎么导入numpy模块现在,我们加载⾃⼰的模型,并设置⾃⼰的视频流:
我们加载⾃⼰的序列化模型,提供对⾃⼰的 prototxt 和模型⽂件的引⽤(第 30 ⾏),可以看到在 Op
enCV 3.3 中,这⾮常简单。
下⼀步,我们初始化视频流(来源可以是视频⽂件或摄像头)。⾸先,我们启动 VideoStream(第 35 ⾏),随后等待相机启动(第 36⾏),最后开始每秒帧数计算(第 37 ⾏)。VideoStream 和 FPS 类是 imutils 包的⼀部分。
async注解失效现在,让我们遍历每⼀帧(如果你对速度要求很⾼,也可以跳过⼀些帧):
⾸先,我们从视频流中读取⼀帧(第 43 ⾏),随后调整它的⼤⼩(第 44 ⾏)。由于我们随后会需要宽度和⾼度,所以我们在第 47 ⾏上进⾏抓取。随后将 frame 转换为⼀个有 dnn 模块的 blob(第 48
⾏)。
python入门教程视屏现在,我们设置 blob 为神经⽹络的输⼊(第 52 ⾏),通过 net 传递输⼊(第 53 ⾏),这给我们提供了 detections。
这时,我们已经在输⼊帧中检测到了⽬标,现在是时候看看置信度的值,以判断我们能否在⽬标周围绘制边界框和标签了:
我们⾸先在 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 计数器:
上述代码块简单明了,⾸先我们展⽰帧(第 81 ⾏),然后到特定按键(第 82 ⾏),同时检查「q」键(代表「quit」)是否按下。如果已经按下,则我们退出帧捕捉循环(第 85、86 ⾏)。最后更新 fps 计数器(第 89 ⾏)。
如果我们退出了循环(「q」键或视频流结束),我们还要处理这些:
当我们跳出(exit)循环,fps 计数器停⽌(第 92 ⾏),每秒帧数的信息向终端输出(第 93、94 ⾏)。
我们关闭窗⼝(第 97 ⾏),然后停⽌视频流(第 98 ⾏)。
如果你到了这⼀步,那就可以做好准备⽤⾃⼰的⽹络摄像头试试看它是如何⼯作的了。我们来看下⼀部分。
实时深度学习⽬标检测的结果
为了实时深度学习⽬标检测器正常运⾏,确保你使⽤本指南「Downloads」部分中的⽰例代码和预训练的卷积神经⽹络。(请打开原⽂链接,进⼊「Downloads」部分,输⼊⾃⼰的邮箱地址,获取所需代码和其他资料。)
打开终端,执⾏下列命令:
如果 OpenCV 能够访问你的摄像头,你可以看到带有检测到的⽬标的输出视频帧。我对样本视频使⽤了深度学习⽬标检测,结果如下:
图 1:使⽤深度学习和 OpenCV + Python 进⾏实时⽬标检测的短⽚。
注意深度学习⽬标检测器不仅能够检测到⼈,还能检测到⼈坐着的沙发和旁边的椅⼦——所有都是实时检测到的!
总结
mockingbird完整版今天的博客中,我们学习了如何使⽤深度学习 + OpenCV + 视频流来执⾏实时⽬标检测。我们通过下列两个教程完成了这⼀⽬标:
1. 使⽤深度学习和 OpenCV 进⾏⽬标检测()
洛阳公积金商转公2. 在 OpenCV 上进⾏⾼效、线程化的视频流()
最终结果是基于深度学习的⽬标检测器可以处理 6-8 个 FPS 的视频(当然,这也取决于你的系统速度)。
你还可以通过以下途径进⼀步提升速度:
1. 跳过帧。
吊工字钢专用夹子2. 使⽤ MobileNet 的不同变体(速度更快,但是准确率下降)。
3. 使⽤ SqueezeNet 的量⼦化变体(我还未对此进⾏测试,但是我想应该会更快,因为它的⽹络⾜迹更⼩)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论