深度学习 + OpenCV,Python实现实时视频目标检测

作者: 机器之心 2017-09-22 11:45:10

使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能。

在本文中我们将学习如何扩展原有的目标检测项目,使用深度学习和 OpenCV 将应用范围扩展到实时视频流和视频文件中。这个任务会通过 VideoStream 类来完成。

  • 深度学习目标检测教程:https://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
  • VideoStream 类教程:https://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,随后加入以下代码:

使用深度学习和 OpenCV 进行视频目标检测

我们从第 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。有关这些类的详细信息(以及网络的训练方式),请参考:https://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(第 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 能够访问你的摄像头,你可以看到带有检测到的目标的输出视频帧。

注意深度学习目标检测器不仅能够检测到人,还能检测到人坐着的沙发和旁边的椅子——所有都是实时检测到的!

总结

今天的博客中,我们学习了如何使用深度学习 + OpenCV + 视频流来执行实时目标检测。我们通过下列两个教程完成了这一目标:

  • 使用深度学习和 OpenCV 进行目标检测(https://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/)
  • 在 OpenCV 上进行高效、线程化的视频流(https://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/)

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

你还可以通过以下途径进一步提升速度:

  • 跳过帧。
  • 使用 MobileNet 的不同变体(速度更快,但是准确率下降)。
  • 使用 SqueezeNet 的量子化变体(我还未对此进行测试,但是我想应该会更快,因为它的网络足迹更小)。

原文:

https://www.pyimagesearch.com/2017/09/18/real-time-object-detection-with-deep-learning-and-opencv/

【本文是51CTO专栏机构“机器之心”的原创译文,微信公众号“机器之心( id: almosthuman2014)”】

戳这里,看该作者更多好文

深度学习 OpenCV Python
上一篇:人工智能重构未来学校 帮助解决教育难题 下一篇:学习机器学习前,你首先要掌握这些概率论基础知识
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

快来!建立你的第一个Python聊天机器人项目

利用Python,我们可以实现很多目标,比如说建立一个你专属的聊天机器人程序。聊天机器人程序不光满足个人需求,它对商业组织和客户都非常有帮助。大多数人喜欢直接通过聊天室交谈,而不是打电话给服务中心。

读芯术 ·  2天前
从TensorFlow到Theano:横向对比七大深度学习框架

最近,来自数据科学公司 Silicon Valley Data Science 的数据工程师 Matt Rubashkin(UC Berkeley 博士)为我们带来了深度学习 7 种流行框架的深度横向对比,希望本文能对你带来帮助。

AI小师弟 ·  3天前
2020年搞深度学习需要什么样的GPU:请上48G显存

在 lambda 最新的一篇显卡横向测评文章中,开发者们探讨了哪些 GPU 可以再不出现内存错误的情况下训练模型。当然,还有这些 GPU 的 AI 性能。

机器之心 ·  2020-02-19 15:16:42
为什么用Go编写机器学习的基础架构,而不是Python?

虽然Python是使用广泛的语言,并用于每个主要的机器学习框架中。然而,你能想象?在Cortex(将机器学习模型部署为API的开放源代码平台之一)代码库中,87.5%的代码都是使用GO编写。

读芯术 ·  2020-02-14 13:13:04
一个案例掌握深度学习

近期我们将连载一个深度学习专题,由百度深度学习技术平台部主任架构师毕然分享,让你快速入门深度学习,参与到人工智能浪潮中。

佚名 ·  2020-02-12 17:10:54
20条理由告诉你,为什么当前的深度学习成了人工智能的死胡同?

在深度学习刚刚进入视线时,大多数AI研究人员嗤之以鼻,但短短几年后,它的触角已经横跨医疗、教育、汽车等众多领域。

AI科技评论 ·  2020-02-10 13:36:30
2020,人工智能和深度学习未来的五大趋势

虽然近年来人工智能经常成为热门议题,但它还远未实现真正的成就。人工智能技术发展的主要障碍在于投资成本,投资成本影响短期内的回报。而当时机成熟时,投资AI的公司却可以获得巨大的回报。在最近的一份报告中,麦肯锡预测人工智能领头企业未来将会实现现金流翻倍。

CSDN App ·  2020-02-09 17:27:29
Golang还是Python?哪种语言更适合AI?

Google所开发的Golang正在成为机器学习和AI的主流编程语言,全球已有数百万用户。那么很多IT技术人员肯定会有这样的疑问,前些年火起来的Python在科学计算及AI领域也有广泛应用,那么这两者今后谁才是AI的菜呢?

橘子键盘手 ·  2020-02-07 12:55:29
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载