深度学习 + OpenCV,Python实现实时视频目标检测
off999 2024-09-29 16:04 13 浏览 0 评论
选自PyimageSearch
机器之心编译
参与:路雪、李泽南
使用 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 和 OpenCV 3.3。在系统设置上,你只需要以默认设置安装 OpenCV 即可(同时确保你遵循了所有 Python 虚拟环境命令)。
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(第 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 进行实时目标检测的短片。
注意深度学习目标检测器不仅能够检测到人,还能检测到人坐着的沙发和旁边的椅子——所有都是实时检测到的!
总结
今天的博客中,我们学习了如何使用深度学习 + 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 的量子化变体(我还未对此进行测试,但是我想应该会更快,因为它的网络足迹更小)。
相关推荐
- 「Python条件结构」if…else实现判断奇偶数
-
功能要求用户从键盘上输入一个整数,判断该数是奇数还是偶数。说明:能被2整除的整数叫偶数,不能被2整除的叫奇数;即该数除以2后余数为0时该数为偶数,否则该数为奇数。求余数运算符为“%”。实例代码num...
- Python if else条件语句详解
-
前面我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为顺序结构。但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿...
- python基础篇: python中的流程控制,你都了解吗?
-
在之前的文章中大致的介绍过python中的流程控制语句,今天通过一些案例来详细了解一下python中的流程语句。目前python中流程控制语句,包含如下,如有遗漏欢迎留言补充。在python中条件判断...
- python中if语句
-
if语句用来判断,当不同的条件成立去做与之对应事情;格式如下:if条件:执行代码条件为True才会去做执行代码布尔类型(bool)说到布尔类型,就像开关只有两个值一样,布尔类型的值只有两个...
- python中的循环语句到底难不难
-
好多初学者会有一种这样的心里:循环难不难?该怎么学习?下面来给大家分析下.Python中的循环语句并不难,但需要理解其核心逻辑和应用场景。以下是针对零基础学习者的清晰解析,通过对比、示例和常见误...
- Python6大基础运算符,看完这篇之后会让你有一个彻底认识
-
昨天我们准备好了Python程序所需要的的东西,那么今天我们开始了解Python的各种基础运算符,这些要是不熟悉下来你后面的路也会走的很艰难Python支持基础运算符,常见的算术运算符有+、-、*、/...
- Python基础:条件语句和循环语句
-
下面会详细讲解一下Python关于条件语句和循环语句,会包含一些示例代码。我们首先来介绍条件语句(if-else),然后再讨论循环语句(for和while循环)。条件语句(if-else)在Pytho...
- Python合集之Python循环语句(一)
-
在上一节的合集中,我们了解了Python流程控制语句中if语句的嵌套及条件表达会的相关知识,本节我们将进一步了解一下Python循环语句中的while语句的相关知识。在日常生活中很多问题都无...
- Python“三步”即可爬取,毋庸置疑
-
声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...
- 「Python条件结构」if…else实现三角形判断
-
功能要求编写程序,判断输入的三个数是否能构成三角形的三个边。如果可以,打印“可以构成三角形”;如果不可以,打印“不可以构成三角形”。构成三角形的条件是:三条边都等于0,且任何2条边的边长之和都大于第三...
- Python中检查对象是否具有某个属性的方法
-
技术背景在Python编程中,经常会遇到需要检查一个对象是否具有某个特定属性的情况。例如,在调用对象的属性之前,需要先确认该属性是否存在,以避免引发AttributeError异常。以下将介绍几种常见...
- Python条件语句:从入门到精通
-
导语条件语句是编程中的基础概念,它允许我们根据不同的条件执行不同的代码块。在Python中,条件语句的灵活性和易读性使其成为编写逻辑判断和流程控制的强大工具。本教程将带您深入了解Python条件语句的...
- 简单学Python——条件语句if
-
条件语句是用来判断给定的条件是否满足(表达式值是否为0或False),并根据判断的结果(真或假)决定执行的语句。Python条件语句用的是if或if和else、elif等搭配实现的。代码执行的过程:i...
- Python合集之Python跳转语句(一)
-
在上一节的合集中,我们了解了Python循环嵌套语句的相关知识,本节我们将进一步了解一下Python跳转语句中的break的相关知识。当循环条件一直满足时,程序会一直执行下去,如果希望在中间离开循环...
- 新手学Python避坑,学习效率狂飙! 八、Python 布尔值判断
-
布尔值判断系统知识在Python里,布尔类型仅有两个值:True和False,它们常被用于条件判断。下面从几个方面展开介绍:1.布尔运算逻辑与(and):只有当两个操作数都为True时,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (54)
- python安装路径 (54)
- python类型转换 (75)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python斐波那契数列 (51)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)