深度学习 + OpenCV,Python实现实时目标评估

电脑杂谈  发布时间:2020-02-14 10:00:37  来源:网络整理

opencv 年龄识别_opencv 识别 年龄_opencv目标识别程序

使用 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),以确保其中包括有深度神经网络模块。

下面,我们将解析这种命令行参数:

opencv 年龄识别_opencv目标识别程序_opencv 识别 年龄

与此前的目标评估项目相比,我们不需要图像参数,因为在这里我们处理的是视频流和视频——除了下面参数保持不变:

--prototxt:Caffe prototxt 文件路径。

--model:预训练模型的模式。

--confidence:过滤弱测量的最小概率阈值,默认值为 20%。

随后,我们初始化类列表和颜色集:

在第 22-26 行,我们初始化 CLASS 标签,和相应的随机 COLORS。有关这些类的具体信息(以及网络的训练方法),请参考:

现在,我们加载自己的建模,并修改自己的视频流:

我们加载自己的序列化模型,提供对自己的 prototxt 和建模文件的引用(第 30 行),可以发现在 OpenCV 3.3 中,这相当简单。

下一步,我们初始化视频流(来源可以是视频文件或)。首先,我们启动 VideoStream(第 35 行),随后等待相机开启(第 36 行),最后开始每秒帧数计算(第 37 行)。VideoStream 和 FPS 类是 imutils 包的一部分。

opencv目标识别程序_opencv 识别 年龄_opencv 年龄识别

现在,让我们遍历每一帧(如果你对速度规定很高,也可以跳过一些帧):

首先,我们从视频流中读取一帧(第 43 行),随后调整它的大小(第 44 行)。由于我们很快会必须宽度跟高度,所以我们在第 47 行上进行抓取。随后将 frame 转换为一个有 dnn 模块的 blob(第 48 行)。

现在,我们设定 blob 为神经网络的输入(第 52 行),通过 net 传递输入(第 53 行),这帮我们提供了 detections。

这时,我们将要在输入帧中检测至了目标,现在是之后看看置信度的值,以判定我们能够在目标周边绘制边界框和标签了:

我们首先在 detections 内循环,记住一个图像中可以测试到多个目标。我们还必须复查每次测试的置信度(即概率)。如果置信度足够高(高于阈值)opencv目标识别程序,那么我们将在终端展现预测,并以文本跟彩色边界框的方式对图像作出分析。让我们逐行来看一下:

在 detections 内循环,首先我们提取 confidence 值(第 59 行)。

如果 confidence 高于最低阈值(第 63 行),那么我们提取类标签索引(第 67 行),并计算测量至的目标的坐标(第 68 行)。

然后,我们提取边界框的 (x, y) 坐标(第 69 行),之后将用于绘制矩形和文本。

我们构建一个文本 label,包含 CLASS 名称和 confidence(第 72、73 行)。

我们需要使用类材质跟之前提取的 (x, y) 坐标在物体周围描绘白色圆形(第 74、75 行)。

opencv 年龄识别_opencv目标识别程序_opencv 识别 年龄

通常,我们期望标签出现在矩形上方,但是即使没有空间,我们将在圆形底部稍下的位置展示标签(第 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」部分中的样例代码跟预训练的卷积神经网络。(请开启原文链接opencv目标识别程序,进入「Downloads」部分,输入自己的邮件地址,获取所需代码跟其它资料。)

opencv 年龄识别_opencv目标识别程序_opencv 识别 年龄

打开终端,执行以下命令:

如果 OpenCV 能够访问你的,你可以看见带有检测到的目标的输出视频帧。我对样本视频使用了深度学习目标评估,结果如下:

图 1:使用深度学习和 OpenCV + Python 进行即时目标评估的短片。

注意深度学习目标检测器不仅无法评估到人,还能检测到人坐着的茶几和周围的桌子——所有都是实时检测至的!

总结

今天的博客中,我们学习了怎样使用深度学习 + OpenCV + 视频流来执行即时目标测量。我们借助以下两个教程完成了这一目标:

1. 使用深度学习和 OpenCV 进行目标检测()

2. 在 OpenCV 上进行高效、线程化的视频流()

最终结果是基于深度学习的目标检测器可以处理 6-8 个 FPS 的视频(当然,这也取决于你的系统速度)。

你还可以借助以下方式进一步提高速度:

1. 跳过帧。

2. 使用 MobileNet 的不同变体(速度很快,但是准确率下降)。

3. 使用 SqueezeNet 的量子化变体(我还已为此进行测试,但是我想应该会很快,因为它的网络足迹最小)。

作者:机器之心


本文来自电脑杂谈,转载请注明本文网址:
http://xinshanjie.com/a/jisuanjixue/article-140721-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 拓跋什翼键
      拓跋什翼键

      王健林也没有错

    • 李妍
      李妍

      如果生虫是真的

    • 李云鹏
      李云鹏

      导致北洋舰队大东沟海战失利

    热点图片
    拼命载入中...