物体检测实战:使用 OpenCV 进行 YOLO 对象检测

article/2025/10/16 12:04:37

使用 OpenCV 进行 YOLO 对象检测

本文将教你如何使用YOLOV3对象检测器、OpenCV和Python实现对图像和视频流的检测。用到的文件有yolov3.weights、yolov3.cfg、coco.names,这三个文件的github链接如下:

GitHub - pjreddie/darknet: Convolutional Neural Networks

wget https://pjreddie.com/media/files/yolov3.weights
wget https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
wget https://github.com/pjreddie/darknet/blob/master/data/coco.names

什么是YOLO物体检测器?

YOLO 是一个单级检测器。

Redmon 等人于 2015 年首次提出,他们的论文 You Only Look Once: Unified, Real-Time Object Detection 详细介绍了一种能够进行超实时物体检测的物体检测器,在 GPU 上获得 45 FPS。

YOLO 经历了多次不同的迭代,包括 YOLO9000: Better, Faster, Stronger(即 YOLOv2),能够检测超过 9,000 个物体检测器。

Redmon 和 Farhadi 通过对对象检测和分类进行联合训练,能够实现如此大量的对象检测。作者使用联合训练同时在 ImageNet 分类数据集和 COCO 检测数据集上训练了 YOLO9000。

在 COCO 的 156 类版本上,YOLO9000 实现了 16% 的平均精度 (mAP),虽然 YOLO 可以检测 9,000 个单独的类,但准确度并不高。

Redmon 和 Farhadi 又发表了一篇新的 YOLO 论文,YOLOv3: An Incremental Improvement (2018)。 YOLOv3 比以前的模型大得多,但在我看来,它是 YOLO 系列对象检测器中最好的(这也是最后一篇,作者抗议将AI用于军事领域,告别了CV😭😭)。

我们将在这篇博文中使用 YOLOv3权重,是在 COCO 数据集上训练得到的。

COCO数据集由80个标签组成,包括:person,bicycle,car,motorbike,aeroplane,bus,train,truck,boat,traffic light,fire hydrant,stopsign,parking meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports ball,kite,baseball bat,baseball glove,skateboard,surfboard,tennis racket,bottle,wine glass,cup,fork,
knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot dog,pizza,donut,cake,chair,sofa,pottedplant,bed,diningtable,toilet,tvmonitor,laptop,mouse,remote,keyboard,cell phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy bear,hair drier,toothbrush。

项目结构

在终端中使用 tree 命令查看项目的结构,如下:

$ tree
.
├── images
│   └── 11.jpg
├── output
│   └── output.avi
├── videos
│   └── overpass.mp4
├── yolo-coco
│   ├── coco.names
│   ├── yolov3.cfg
│   └── yolov3.weights
├── yolo.py
└── yolo_video.py

我们今天的项目由 4 个目录和两个 Python 脚本组成。

目录(按重要性排序)是:

yolo-coco文件夹:YOLOv3 物体检测器模型文件

images文件夹:存放用于评估的图像。

videos文件夹 :存放用于评估的视频

output: 评估后的结果。

yolo.py:评估图像

yolo_video.py :评估视频

检测图像

新建文件yolo_objectdetection.py

# import the necessary packages
import numpy as np
import argparse
import time
import cv2
import osimage_path='11.jpg'
yolo='yolo_coco'
confidence_t=0.5
threshold=0.3
# 加载训练 YOLO 模型的 COCO 类标签
labelsPath = os.path.sep.join([yolo, "coco.names"])
LABELS = open(labelsPath).read().strip().split("\n")
# 初始化一个颜色列表来表示每个类标签
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3),dtype="uint8")
# YOLO 对象检测
print("[INFO] loading YOLO from disk...")
config_path = './yolo_coco/yolov3.cfg'
weights_path = './yolo_coco/yolov3.weights'
net = cv2.dnn.readNetFromDarknet(config_path, weights_path)

导入包。

定义全局参数:

  • image_path:定义图片的路径。

  • yolo:定义模型存放的路径

  • confidence_t:过滤弱检测的最小概率。

  • threshold:非最大值抑制阈值。

接下来,加载了所有的类 LABELS。然后,为每个标签分配随机颜色。

加载权重文件。

# 加载我们的输入图像并获取其空间维度
image = cv2.imread(image_path)
(H, W) = image.shape[:2]
# 从输入图像构建一个blob,然后执行一个前向传播
# 通过 YOLO 对象检测器,输出边界框和相关概率
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),swapRB=True, crop=False)
net.setInput(blob)
start = time.time()
# 获取网络输出层信息(所有输出层的名字),设定并前向传播
outInfo = net.getUnconnectedOutLayersNames()
# 得到各个输出层的、各个检测框等信息,是二维结构。
layerOutputs = net.forward(outInfo)

加载输入图像并提取其尺寸。

从 YOLO 模型取出输出层名称。

构建一个 blob(第 48 和 49 行)。

cv2.dnn.blobFromImage(image[, scalefactor[, size[, mean[, swapRB[, crop[, ddepth]]]]]])
作用:
对图像进行预处理,包括减均值,比例缩放,裁剪,交换通道等,返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入)

参数:

  • image:输入图像(1、3或者4通道)

可选参数

  • scalefactor:图像各通道数值的缩放比例
  • size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200
  • mean:用于各通道减去的值,以降低光照的影响(e.g. image为bgr3通道的图像,mean=[104.0, 177.0, 123.0],表示b通道的值-104,g-177,r-123)
  • swapRB:交换RB通道,默认为False.(cv2.imread读取的是彩图是bgr通道)
  • crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸
  • ddepth:输出的图像深度,可选CV_32F 或者 CV_8U.

通过我们的 YOLO 网络执行前向传递

显示 YOLO 的推理时间

接下来我们实现图像的可视化操作:

# 分别初始化检测到的边界框、置信度和类 ID 的列表
boxes = []
confidences = []
classIDs = []
# 循环输出
for output in layerOutputs:# 遍历每个检测结果for detection in output:# 提取物体检测的类ID和置信度(即概率)scores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]# 过滤精度低的结果if confidence > confidence_t:# 延展边界框坐标,计算 YOLO 边界框的中心 (x, y) 坐标,然后是框的宽度和高度box = detection[0:4] * np.array([W, H, W, H])(centerX, centerY, width, height) = box.astype("int")# 使用中心 (x, y) 坐标导出边界框的上角和左角x = int(centerX - (width / 2))y = int(centerY - (height / 2))# 更新边界框坐标、置信度和类 ID 列表boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)
# 使用非极大值抑制来抑制弱的、重叠的边界框
idxs = cv2.dnn.NMSBoxes(boxes, confidences, confidence_t,threshold)
# 确保至少存在一个检测
if len(idxs) > 0:# 遍历我们保存的索引for i in idxs.flatten():# 提取边界框坐标(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])# 在图像上绘制一个边界框矩形和标签color = [int(c) for c in COLORS[classIDs[i]]]cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,0.5, color, 2)
# show the output image
cv2.imshow("Image", image)
cv2.waitKey(0)

初始化列表:

  • box :我们围绕对象的边界框。
  • 置信度:YOLO 分配给对象的置信度值。 较低的置信度值表明对象可能不是网络认为的那样。 从上面的命令行参数中记住,我们将过滤掉不满足 0.5 阈值的对象。
  • classIDs :检测到的对象的类标签。

循环遍历每个 layerOutputs。

循环输出中的每个检测项。

提取 classID 和置信度。

过滤掉弱检测项。
到这里已经得到了高精度的检测项,然后:

延展边界框坐标,以便可以在原始图像上正确显示它们。

提取边界框的坐标和尺寸。 YOLO 以以下形式返回边界框坐标: (centerX, centerY, width, and height) 。

使用此信息计算出边界框的左上角 (x, y) 坐标。

更新 box 、 confidences 和 classIDs 列表。

然后使用NMS过滤冗余和无关的边界框。

接下主要将结果绘制到图片上。

运行结果:

https://gitee.com/wanghao1090220084/cloud-image/raw/master/image-20220107195644079.png

检测视频

现在我们已经学习了如何将 YOLO 对象检测器应用于单个图像,接下来尝试检测视频或者摄像头中的物体。

新建 yolo_video.py 文件并插入以下代码:

import numpy as np
import imutils
import time
import cv2
import osyolo = 'yolo_coco'
confidence_t = 0.5
threshold = 0.3
output = 'output.avi'

导入需要的包

定义全局参数:

  • yolo:定义模型存放的路径
  • confidence_t:过滤弱检测的最小概率。
  • threshold:非最大值抑制阈值。
  • output:输出的视频结果
# 加载YOLO 模型训练的 COCO 类标签
labelsPath = os.path.sep.join([yolo, "coco.names"])
LABELS = open(labelsPath).read().strip().split("\n")
# 初始化颜色列表
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8")
# 配置 YOLO 权重和模型配置的路径
weightsPath = os.path.sep.join([yolo, "yolov3.weights"])
configPath = os.path.sep.join([yolo, "yolov3.cfg"])
# 加载在 COCO 数据集(80 个类)上训练的 YOLO 对象检测,并获取YOLO输出层的名称
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
# 获取网络输出层信息(所有输出层的名字),设定并前向传播
outInfo = net.getUnconnectedOutLayersNames()
# 初始化视频流、指向输出视频文件的指针和帧尺寸
vs = cv2.VideoCapture(0)
writer = None
(W, H) = (None, None)
# 获取文件的总帧数。
try:prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \else cv2.CAP_PROP_FRAME_COUNTtotal = int(vs.get(prop))print("[INFO] {} total frames in video".format(total))
except:print("[INFO] could not determine # of frames in video")print("[INFO] no approx. completion time can be provided")total = -1

这段代码的步骤:

读取类别。

给每个类别初始化颜色。

设置YOLO权重文件的路径。

加载YOLO权重文件。

获取输出层信息。

初始化VideoCapture对象。

初始化视频编写器和帧尺寸。

获取总帧数,以便估计处理整个视频需要多长时间。

# loop over frames from the video file stream
while True:# 从文件中读取下一帧(grabbed, frame) = vs.read()# 如果帧没有被抓取,那么已经到了流的末尾if not grabbed:break# 如果框架尺寸为空,则给他们赋值if W is None or H is None:(H, W) = frame.shape[:2]# 从输入帧构造一个 blob,然后执行 YOLO 对象检测器的前向传递,得到边界框和相关概率blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416),swapRB=True, crop=False)net.setInput(blob)start = time.time()layerOutputs = net.forward(outInfo)end = time.time()# 分别初始化检测到的边界框、置信度和类 ID 的列表boxes = []confidences = []classIDs = []# 循环输出for output in layerOutputs:# 遍历每个检测结果for detection in output:# 提取物体检测的类ID和置信度(即概率)scores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]# 过滤精度低的结果if confidence > confidence_t:# 缩放边界框坐标,计算 YOLO 边界框的中心 (x, y) 坐标,然后是框的宽度和高度box = detection[0:4] * np.array([W, H, W, H])(centerX, centerY, width, height) = box.astype("int")# 使用中心 (x, y) 坐标导出边界框的上角和左角x = int(centerX - (width / 2))y = int(centerY - (height / 2))# 更新边界框坐标、置信度和类 ID 列表boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)# 使用非极大值抑制来抑制弱的、重叠的边界框idxs = cv2.dnn.NMSBoxes(boxes, confidences, confidence_t,threshold)# 确保至少存在一个检测if len(idxs) > 0:# 遍历保存的索引for i in idxs.flatten():# 在图像上绘制一个边界框矩形和标签(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])# 确保至少存在一个检测color = [int(c) for c in COLORS[classIDs[i]]]cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)text = "{}: {:.4f}".format(LABELS[classIDs[i]],confidences[i])cv2.putText(frame, text, (x, y - 5),cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)cv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFF# check if the video writer is Noneif writer is None:# initialize our video writerfourcc = cv2.VideoWriter_fourcc(*'XVID')writer = cv2.VideoWriter('output.avi', fourcc, 30, (int(frame.shape[1]), int(frame.shape[0])))# some information on processing single frameif total > 0:elap = (end - start)print("[INFO] single frame took {:.4f} seconds".format(elap))print("[INFO] estimated total time to finish: {:.4f}".format(elap * total))# write the output frame to diskwriter.write(frame)
# release the file pointers
print("[INFO] cleaning up...")
writer.release()
vs.release()

定义了一个 while 循环,然后抓取第一帧。

检查它是否是视频的最后一帧。 如果是,我们需要中断 while 循环。

如果框架尺寸为None,则给他们赋值。

构建一个 blob 并将其通过网络,获得预测。

初始化列表:

  • box :我们围绕对象的边界框。
  • 置信度:YOLO 分配给对象的置信度值。 较低的置信度值表明对象可能不是网络认为的那样。 从上面的命令行参数中记住,我们将过滤掉不满足 0.5 阈值的对象。
  • classIDs :检测到的对象的类标签。

循环遍历每个 layerOutputs。

循环输出中的每个检测项。

提取 classID 和置信度。

过滤掉弱检测项。
到这里已经得到了高精度的检测项,然后:

延展边界框坐标,以便可以在原始图像上正确显示它们。

提取边界框的坐标和尺寸。 YOLO 以以下形式返回边界框坐标: (centerX, centerY, width, and height) 。

使用此信息计算出边界框的左上角 (x, y) 坐标。

更新 box 、 confidences 和 classIDs 列表。

然后使用NMS过滤冗余和无关的边界框。

接下主要将结果绘制到帧上。

运行结果:

完整代码:
https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/74968249


http://chatgpt.dhexx.cn/article/Umgqr12c.shtml

相关文章

传统物体检测

传统物体检测 1. 特征2. 模板匹配3. 颜色直方图4. 空间分拣5. 梯度特征6. HOG 特征7. 特征融合8. 搭建分类器8.1 数据标注8.2 数据预处理8.3 训练分类器8.4 交叉验证 9. 滑动窗口9.1 多尺度窗口9.2 Hog子采样窗口搜索(Hog Sub-sampling Window Search) 10. Multiple Detections…

计算机视觉之旅-进阶-物体检测

1. 物体检测概念 计算机视觉中的物体检测是指在图像中检测和定位特定目标对象,它是计算机视觉中一个基本而又重要的问题。 物体检测的目的就是在输入图像中检测所关心的目标对象,并给出其边界框和类别信息。典型的输出包括: - 边界框:表示目标对象在图像中的位置和大小。常用…

物体检测技术的简单介绍

1. 物体检测技术概念 物体检测技术,通常是指在一张图像中检测出物体出现的位置及对 应的类别,主要包括物体类别、 x m i n x_{min} xmin​、 y m i n y_{min} ymin​、 x m a x x_{max} xmax​与 y m a x y_{max} ymax​。它是一项非常基础的任 务&…

Opencv项目实战:05 物体检测

1,效果展示 为此,我专门还去查了查,怎么将视频转化为gif图,不知不觉中,我又多学会了一项技能。 OK!cool,效果很不错,今天需要搭配一些文件,都是可以从官网里找到的,那么我为了方便,专门去学习怎么在GitHub上托管项目,还下载了VScode和Git,我太难受了,如果不是要写…

百万youtube高清视频数据集采集

HD-VILA-100M是什么? HD-VILA-100M是一个大规模、高分辨率、多样化的视频语言数据集,有助于多模态表示学习。 数据统计 该数据集共包含330万个视频,视频质量较高,均衡分布在15个类别中。 下载(Download) 您可以通…

100多万个视频短片数据集来啦!

本文经授权转载自 IEEE电气电子工程师学会(ID: IEEE_China) 想象一下,如果我们必须向外星人解释地球上发生的所有行为。我们可以为他们提供非小说类书籍或BBC纪录片。我们可以尝试口头解释什么是电臀舞。但是,实际上,没…

大数据视频课程汇总

1.由于未经视频版权方授权,很可能会被下架,请各位需要的同仁及时下载,如果被下架,请留言说明。 2.视频为大数据梅峰谷整理,所有视频不加密,不收费,不做机构的宣传品,(因为微信和各大…

视频分类数据集介绍

视频分类数据集 在视频分类项目中,有很多经典的公开数据集,目前主要的数据集如列表所示: 重点介绍三个中等规模的数据集。 1. UCF101 动作识别数据集,从youtube收集而得,共包含101类动作。其中每类动作由25个人做动作…

Python毕业设计 抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕…

大数据分析视频全套

一、全套视频总览 二、大数据分析之level2 三、大数据分析之level3 四、大数据分析之level4 五、课程相关资料 具体详细内容及目录结构如下: 注: 大数据分析与大数据开发的区别在于:本套课程涵盖算法更多,需掌握python语言&#…

AI大数据可视化EasyCVR视频融合平台的部署操作流程详解

EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频直播、云端录像、云存储、…

音视频造数据的路

目录 1、多路数据制造 (1)合并多路 (2) 视频修改分辨率 (3) 修改视频码率 (4)修改帧率 2、音频流多声道合成 (1)双声道合并单声道 (2&…

音视频数据介绍

1、前言 在诸如安防系统标准GB28181和“电网视频监控系统及接口”中,固定视频流的传输格式为PS格式。PS流和TS流的概念是在MPEG2的ISO/IEC-13818标准的第一部分“系统”中提出的。其提出的目的是提供MPEG2编码比特的存储与传输方案。 2、先介绍PS封装中的…

互联网海量视频数据的存储

原文链接:http://www.docin.com/p-86312184.html?docfromrrela 一、背景 互联网内容提供方式转变:用户创造内容。视频应用、网络游戏、搜索引擎等互联网衍生业务迅速发展,使得海量数据存储、管理和处理成为当今互联网公司面临的严峻问题。这…

浅析大数据时代下的视频技术发展趋势以及AI加持下视频场景应用

视频技术的发展可以追溯到19世纪初期的早期实验。到20世纪初期,电视技术的发明和普及促进了视频技术的进一步发展。 1)数字化:数字化技术的发明和发展使得视频技术更加先进。数字电视信号具有更高的清晰度和更大的带宽,可以更快地…

音视频数据方案

一点点想法:还请各路大神多多指点! 技术栈: 1、数据存储、数据缓存、数据索引:springboot redis mysql elasticSearch 2、数据抓取:python mysqlBeautifulSoup、Selenium、lxml 3、图片分析:pythonPill…

浅析基于EasyCVR视频技术构建工业园区视频安防大数据监管平台的方案

随着社会经济的快速发展,越来越多的工业园区也正在加快智能化建设的步伐,为入驻企业提供舒适、安全、科技、智慧的办公及生产环境。在建设园区的智能化安防视频监管平台时,需要满足两方面的需求:一是园区内部及周边公共区域安全防…

某马大数据全套视频

某马大数据 01、阶段一 Python大数据开发基础 01、第一章大数据介绍及开发环境 02、第二章 linux命令 03、第三章 MySQL数据库 04、第四章 excel的使用 05、第五章 kettle的使用 06、第六章 数据分析及可视化 07、第七章 大数据框架与数仓基础 08、第八章 数仓实战项目 …

视频观看行为高级分析(大数据分析)

今天介绍一下我们的视频观看行为高级分析功能。 一、观看行为分析 观看行为分析,基于Polyv大数据分析,能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示,Polyv云点播视频的每一次播放,都会产…

【毕业设计】基于大数据的抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,…