OpenCV+python实现实时目标检测功能


Posted in Python onJune 24, 2020

环境安装

  1. 安装Anaconda,官网链接Anaconda
  2. 使用conda创建py3.6的虚拟环境,并激活使用
conda create -n py3.6 python=3.6 //创建
	conda activate py3.6 //激活

OpenCV+python实现实时目标检测功能

3.安装依赖numpy和imutils

//用镜像安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple imutils

4.安装opencv

(1)首先下载opencv(网址:opencv),在这里我选择的是opencv_python‑4.1.2+contrib‑cp36‑cp36m‑win_amd64.whl 。
(2)下载好后,把它放到任意盘中(这里我放的是D盘),切换到安装目录,执行安装命令:pip install opencv_python‑4.1.2+contrib‑cp36‑cp36m‑win_amd64.whl

代码

首先打开一个空文件命名为real_time_object_detection.py,加入以下代码,导入你所需要的包。

# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2

2.我们不需要图像参数,因为在这里我们处理的是视频流和视频——除了以下参数保持不变:
?prototxt:Caffe prototxt 文件路径。
?model:预训练模型的路径。
?confidence:过滤弱检测的最小概率阈值,默认值为 20%。

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--prototxt", required=True,
	help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
	help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2,
	help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

3.初始化类列表和颜色集,我们初始化 CLASS 标签,和相应的随机 COLORS。

# initialize the list of class labels MobileNet SSD was trained to
# detect, then generate a set of bounding box colors for each class
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
	"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
	"dog", "horse", "motorbike", "person", "pottedplant", "sheep",
	"sofa", "train", "tvmonitor"]
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))

4.加载自己的模型,并设置自己的视频流。

# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

# initialize the video stream, allow the cammera sensor to warmup,
# and initialize the FPS counter
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)
fps = FPS().start()

首先我们加载自己的序列化模型,并且提供对自己的 prototxt文件 和模型文件的引用
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
下一步,我们初始化视频流(来源可以是视频文件或摄像头)。首先,我们启动 VideoStreamvs = VideoStream(src=0).start(),随后等待相机启动time.sleep(2.0),最后开始每秒帧数计算fps = FPS().start()。VideoStream 和 FPS 类是 imutils 包的一部分。

5.遍历每一帧

# loop over the frames from the video stream
while True:
	# grab the frame from the threaded video stream and resize it
	# to have a maximum width of 400 pixels
	frame = vs.read()
	frame = imutils.resize(frame, width=400)

	# grab the frame from the threaded video file stream
	(h, w) = frame.shape[:2]
	blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),
		0.007843, (300, 300), 127.5)

	# pass the blob through the network and obtain the detections and
	# predictions
	net.setInput(blob)
	detections = net.forward()

首先,从视频流中读取一帧frame = vs.read(),随后调整它的大小imutils.resize(frame, width=400)。由于我们随后会需要宽度和高度,接着进行抓取(h, w) = frame.shape[:2]。最后将 frame 转换为一个有 dnn 模块的 blob,cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),0.007843, (300, 300), 127.5)
现在,我们设置 blob 为神经网络的输入net.setInput(blob),通过 net 传递输入detections = net.forward()

6.这时,我们已经在输入帧中检测到了目标,现在看看置信度的值,来判断我们能否在目标周围绘制边界框和标签。

# loop over the detections
	for i in np.arange(0, detections.shape[2]):
		# extract the confidence (i.e., probability) associated with
		# the prediction
		confidence = detections[0, 0, i, 2]

		# filter out weak detections by ensuring the `confidence` is
		# greater than the minimum confidence
		if confidence > args["confidence"]:
			# extract the index of the class label from the
			# `detections`, then compute the (x, y)-coordinates of
			# the bounding box for the object
			idx = int(detections[0, 0, i, 1])
			box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
			(startX, startY, endX, endY) = box.astype("int")

			# draw the prediction on the frame
			label = "{}: {:.2f}%".format(CLASSES[idx],
				confidence * 100)
			cv2.rectangle(frame, (startX, startY), (endX, endY),
				COLORS[idx], 2)
			y = startY - 15 if startY - 15 > 15 else startY + 15
			cv2.putText(frame, label, (startX, y),
				cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)

在 detections 内循环,一个图像中可以检测到多个目标。因此我们需要检查置信度。如果置信度足够高(高于阈值),那么将在终端展示预测,并以文本和彩色边界框的形式对图像作出预测。
在 detections 内循环,首先我们提取 confidence 值,confidence = detections[0, 0, i, 2]。如果 confidence 高于最低阈值(if confidence > args["confidence"]:),那么提取类标签索引(idx = int(detections[0, 0, i, 1])),并计算检测到的目标的坐标(box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]))。然后,我们提取边界框的 (x, y) 坐标((startX, startY, endX, endY) = box.astype("int")),将用于绘制矩形和文本。接着构建一个文本 label,包含 CLASS 名称和 confidence(label = "{}: {:.2f}%".format(CLASSES[idx],confidence * 100))。还要使用类颜色和之前提取的 (x, y) 坐标在物体周围绘制彩色矩形(cv2.rectangle(frame, (startX, startY), (endX, endY),COLORS[idx], 2))。如果我们希望标签出现在矩形上方,但是如果没有空间,我们将在矩形顶部稍下的位置展示标签(y = startY - 15 if startY - 15 > 15 else startY + 15)。最后,我们使用刚才计算出的 y 值将彩色文本置于帧上(cv2.putText(frame, label, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2))。

7.帧捕捉循环剩余的步骤还包括:展示帧;检查 quit 键;更新 fps 计数器。

# show the output frame
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF

	# if the `q` key was pressed, break from the loop
	if key == ord("q"):
		break

	# update the FPS counter
	fps.update()

上述代码块简单明了,首先我们展示帧(cv2.imshow("Frame", frame)),然后找到特定按键(key = cv2.waitKey(1) & 0xFF),同时检查「q」键(代表「quit」)是否按下。如果已经按下,则我们退出帧捕捉循环(if key == ord("q"):break),最后更新 fps 计数器(fps.update())。

8.退出了循环(「q」键或视频流结束),我们还要处理以下。

# stop the timer and display FPS information
fps.stop()
print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

运行文件目录有以下文件:

OpenCV+python实现实时目标检测功能

到文件相应的目录下:cd D:\目标检测\object-detection执行命令:python real_time_object_detection.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel

OpenCV+python实现实时目标检测功能

演示

这里我把演示视频上传到了B站,地址链接目标检测

补充

项目github地址object_detection链接。
本项目要用到MobileNetSSD_deploy.prototxt.txtMobileNetSSD_deploy.caffemodel,可以去github上下载项目运行。

到此这篇关于OpenCV+python实现实时目标检测功能的文章就介绍到这了,更多相关python实现目标检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现简单的TCP代理服务器
Oct 08 Python
python求解水仙花数的方法
May 11 Python
Python数据类型详解(二)列表
May 08 Python
python机器学习之决策树分类详解
Dec 20 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
python根据url地址下载小文件的实例
Dec 18 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 #Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 #Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 #Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 #Python
你需要学会的8个Python列表技巧
Jun 24 #Python
pytorch实现查看当前学习率
Jun 24 #Python
在pytorch中动态调整优化器的学习率方式
Jun 24 #Python
You might like
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
Python正则表达式匹配ip地址实例
2014/10/09 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
护理职业应聘自荐书
2013/09/29 职场文书
六查六看剖析材料
2014/02/15 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
工作经验交流材料
2014/12/30 职场文书
拾金不昧感谢信
2015/01/21 职场文书
保护校园环境倡议书
2015/04/28 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书