基于YOLOv5的视频计数 — 汽车计数实现
在视频中计数对象可能看起来有挑战性,但借助Python和OpenCV的强大功能,变得令人意外地易于实现。在本文中,我们将探讨如何使用YOLO(You Only Look Once)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单的步骤,使初学者能够轻松跟随。
本文将分为以下几个部分:
需求
启发式:汽车计数
检测过滤
启发式:实现
结论
需求
在我们深入了解该过程之前,让我们确保已安装所需的库。主要需要:
PyTorch:通过PyTorch Hub,我们将访问Ultralytics存储库以下载Yolov5模型。
OpenCV:用于加载、操作和显示视频的所有实用程序。
Matplotlib(可选):我们将使用此实用程序在多边形内进行点验证。
如代码片段1所示,requirements.txt文件中列出了这些要求。
opencv-python==4.8.1.78
torch==2.1.0
matplotlib==3.8.0
ultralytics==8.0.203
pandas==2.1.2
requests==2.31.0
一旦我们查看了主要要求,就该了解我们将开发用于从视频中计数对象的启发式的时间了。
启发式:汽车计数
在此示例中,我们将使用一个视频场景,其中将对汽车进行计数。图2显示了一个示例帧。
用于计数汽车的视频帧
为了计数汽车,我们将使用Yolov5来检测视频中的对象。基于检测到的对象,我们将过滤与汽车、公共汽车和卡车有关的类别。由于检测基于边界框(具有坐标xmin、ymin、xmax、ymax的多边形),我们将需要获取每个边界框的中心点(xc, yc),该中心点将是我们对象的参考点。
最后,我们将绘制一个多边形,该多边形将是计数对象的参考,也就是说,如果对象的参考点在多边形内,我们将增加对象计数器,否则计数器不受影响。在下图中,我们可以看到多边形和多边形内的汽车数量的表示。
检测(绿色点)、多边形(红色线)和计数器
到此为止,我们已经知道了需求是什么,以及我们将实施用于计数对象的启发式的方法。现在可以加载模型:Yolov5 Nano
在本例中,我们将使用Yolov5的nano版本(即yolov5n),我们将通过PyTorch Hub从Ultralytics存储库中扩展它。同样,为了加载和在每一帧上生成迭代器,我们将使用OpenCV(即cv2),下述代码是具体的实现方式:
import cv2
import torchVIDEO_PATH="data/traffic.mp4"
HUB="ultralytics/yolov5"
YOLO="yolov5n"def count_cars(cap: cv2.VideoCapture):model = torch.hub.load(HUB, model=YOLO, pretrained=True)while cap.isOpened():status, frame = cap.read()if not status:break# Detection filtering and heuristic# will be implemented here.cv2.imshow("frame", frame)if cv2.waitKey(10) & 0xFF == ord('q'):breakcap.release()if __name__ == '__main__':cap = cv2.VideoCapture(VIDEO_PATH)count_cars(cap)
正如我们所看到的,我们已经定义了count_cars()函数,我们将在整个项目中对其进行更新。在4-6行,我们定义了视频所在路径、hub和模型名称的变量。从那里,让我们迅速跳到31-32行,在那里通过初始化cap对象加载视频,然后将其传递给count_cars()函数。
返回到第10行,通过PyTorch Hub,我们下载并初始化了yolov5n模型。随后,在第12行,我们生成一个迭代器,只要有要显示的帧,它就会保持活动状态。一旦帧完成,与迭代器相关的对象就会被释放(第26行)。
在第13行,我们读取帧,验证是否成功读取,并显示它们(第21行)。在这一部分,将出现一个窗口,用于查看从此迭代器显示的视频。最后,第23行是在按q键时删除弹出窗口。
检测过滤
过滤检测是指从Yolo预测中提取感兴趣的类别的过程。在这种情况下,我们将过滤掉分数大于0.5且类别为汽车、公共汽车或卡车的检测。同样,我们将需要找到边界框的中心点,我们将其用作对象的参考点。下面代码显示了这两个函数的实现。
import pandas as pddef get_bboxes(preds: object):df = preds.pandas().xyxy[0]df = df[df["confidence"] >= 0.5]df = df[df["name"].isin(["car", "bus", "truck"])]return df[["xmin", "ymin", "xmax", "ymax"]].values.astype(int)def get_center(bbox):center = ((bbox[0] + bbox[2]) // 2, (bbox[1] + bbox[3]) // 2)return center
正如我们所看到的,我们定义了两个函数get_bboxes()和get_center()。get_bboxes()函数(第3行)旨在提取所有分数大于0.5并过滤掉已经提到的类别的预测,返回一个坐标形式的边界框的numpy数组[xmin, ymin, xmax, ymax]。
get_center()函数(第10行)接收一个带有边界框坐标的numpy数组,并使用方程xc, yc = (xmin + xmax) // 2, (ymin + ymax) // 2分别计算中心点。
在这一点上,我们已经下载了模型,过滤了预测,并获得了每个对象的中心点。现在,我们唯一需要的是生成决定启发式区域的多边形。因此,让我们继续下一节!
启发式:实现
我们将定义的多边形可能会因视频、透视等而有所不同。在这种情况下,例如此示例,我们将使用8个点,如下图所示:
具有坐标的多边形
一旦我们定义了多边形,我们唯一需要做的就是验证每个对象的参考点是否在多边形内。如果在多边形内,我们就会增加一个计数器,如果不在,我们就继续。
import cv2
import numpy as np
import matplotlib.path as mplPathPOLYGON = np.array([[333, 374],[403, 470],[476, 655],[498, 710],[1237, 714],[1217, 523],[1139, 469],[1009, 393],
])def is_valid_detection(xc, yc):return mplPath.Path(POLYGON).contains_point((xc, yc))def count_cars(cap: object):model = torch.hub.load(HUB, model=YOLO, pretrained=True)while cap.isOpened():status, frame = cap.read()if not status:breakpreds = model(frame)bboxes = get_bboxes(preds)detections = 0for box in bboxes:xc, yc = get_center(box)if is_valid_detection(xc, yc):detections += 1
让我们注意到在第5行,我们定义了多边形。在第17行,我们定义了关键函数:is_valid_detection(),它旨在验证参考点(xc, yc)是否在多边形内。这个函数在第37行调用,如果为真,它会增加有效检测计数器,否则什么也不做。
最后,为了可视化,我们将添加一些OpenCV行来显示计数器、每辆检测到的汽车的参考点和多边形。
def count_cars(cap: object):model = torch.hub.load(HUB, model=YOLO, pretrained=True)while cap.isOpened():status, frame = cap.read()if not status:breakpreds = model(frame)bboxes = get_bboxes(preds)detections = 0for box in bboxes:xc, yc = get_center(box)if is_valid_detection(xc, yc):detections += 1# Draw poit of reference for each detectioncv2.circle(img=frame, center=(xc, yc), radius=5, color=(0,255,0), thickness=-1)# Draw bounding boxes for each detectioncv2.rectangle(img=frame, pt1=(box[0], box[1]), pt2=(box[2], box[3]), color=(255, 0, 0), thickness=1)# Draw the countercv2.putText(img=frame, text=f"Cars: {detections}", org=(100, 100), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=3, color=(0,0,0), thickness=3)# Draw the polygoncv2.polylines(img=frame, pts=[POLYGON], isClosed=True, color=(0,0,255), thickness=4)# Display framecv2.imshow("frame", frame)
结论
在本文中,我们看到了如何从视频中实现一个对象计数器。我们开发了一种计算汽车、卡车和公共汽车的实现,基于一个定义的多边形,即如果对象在多边形内,计数器就会增加。
· END ·
HAPPY LIFE
本文仅供学习交流使用,如有侵权请联系作者删除
相关文章:

基于YOLOv5的视频计数 — 汽车计数实现
在视频中计数对象可能看起来有挑战性,但借助Python和OpenCV的强大功能,变得令人意外地易于实现。在本文中,我们将探讨如何使用YOLO(You Only Look Once)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…...

jetson nano 串口通信
目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…...

Vue基础入门(三):Vue3的使用
Vue3的使用 一、首页案例修改 修改首页的信息:是在之前介绍的HelloWorld.vue文件中进行内容的修改。 页面展示效果: 此时就看到了我们新添加的文字了! 同样的我们开发代码的时候只需要修改了项目中的内容然后保存就会自动刷新的浏览器&…...

基于M估计样本一致性算法的点云平面拟合
平面拟合 1、算法简介2、参考文献3、实现效果4、相关代码 1、算法简介 RANSAC 是在给定模型和距离阈值 T T T的情况下,通过寻找最小代价 C C C来确定内点数据并拟合模型。如式(1)所示的代价函数,当点到模型的距离 e e e小于阈值 T…...

【VRTK】【VR开发】【Unity】8-可交互对象
课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 之前我们只是用了一个简单方块作为可交互对象。其实可交互对象可以有许多细节设置,包括具体抓握物体的哪个点,指定抓握的方向,指定Secondary Acti…...

Huggingface 超详细介绍
Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…...

pycharm 怎么切换Anaconda简单粗暴
(1)创建一个环境 (2)选择一下自己conda的安装路径中conba.exe (3)选择存在的环境,一般会自动检测到conda创建有哪些环境,导入就行...
笔记二十二、使用路由state进行传递参数
22.1 父组件设置state路由参数 <NavLink toclassify state{{param_C: this.state.name, param_D: this.state.age}} className{this.activeStyle}>classify</NavLink> 父组件 Home/index.jsx import React from "react"; import {NavLink, Outlet} from…...
2023 OI 总结
2023 O I 2023 \space OI 2023 OI ここは总 • 结です ここは总\space• \space结です ここは总 • 结です 我也不知道要写些什么,就随便写了 csp/s第一题10min出ac思路,结果写炸了qwq,被旁边的大哥影响稍微有点大,没调完第一题…...

ESP32-Web-Server编程-HTML 基础
ESP32-Web-Server编程-HTML 基础 概述 HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html 文件中。 当浏览器向 web 服务器请求网页时,一个 HTML 文件被发送给浏览器,浏览器解释该文件的内容,…...

【docker】docker安装与优化
目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…...

https到底把什么加密了?
首先直接说结论, https安全通信模式,是使用TLS加密传输所有的http协议。再重复一遍,是所有! 通常将TLS加密传输http这个通信过程称为https,如果使用协议封装的逻辑结构来表达就是: IP TCP TLS 【 HTTP 】…...
python爬虫防乱码方案
python爬虫防乱码方案 一、chardet库 自动检测编码:使用 Python 库 chardet 可以自动检测文本的编码,然后使用检测到的编码来解码文本。你可以尝试使用 chardet 库来检测编码,然后解码网页内容。 案例 import requests import chardet…...
Java 语言的入门级教程有哪些?
1、Java SE 1.1、Java基础 基础概念/语法:面向对象(继承、封装、多态)基础、包、类、接口、方法、对象、属性、第一个 Java 程序。 数据类型: 1)基本数据类型8种:byte、short、int、long、float、doubl…...
STM32算法
1.通过编码器对返回的错误速度进行滤波 #define MOTOR_BUFF_CIRCLE_SIZE 4 #define STATIC_ENCODER_VALUE 6int32_t LMotor_Encoder_buff[MOTOR_BUFF_CIRCLE_SIZE] {0}; uint8_t LEindex 0; int32_t LMotor_Encoder_last 0; int32_t L_Encoder_change 0;int32_t RMotor_…...
论文阅读 (106):Decoupling maxlogit for out-of-distribution detection (2023 CVPR)
文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 预备知识3 方法3.1 MaxLogit3.2 改进MaxCosine和MaxNorm3.3 DML 1 概述 1.1 要点 题目:解耦最大logit分布外检测 (Decoupling maxlogit for out-of-distribution detection) 方法: 提出了一种心机基于log…...

毅速丨3D打印随形水路为何受到模具制造追捧
在模具制造行业中,随形水路镶件正逐渐成为一种革命性的技术,其提高冷却效率、优化产品设计、降低成本等优点,为模具制造带来了巨大的创新价值。 随形水路是一种根据产品形状定制的冷却水路,其镶件可以均匀地分布在模具的表面或内部…...

【LeetCode:1670. 设计前中后队列 | 数据结构设计】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
OpenCV将两张图片拼接成一张图片
OpenCV将两张图片拼接成一张图片 示例代码1示例代码2代码示例3示例代码4 可以用opencv或者numpy的拼接函数,直接将两张图拼接到一起,很简单方便,参考代码2,推荐此方式。新建图片,将两张图片的像素值填充到新图片对应位…...

4G5G智能执法记录仪在保险公司车辆保险远程定损中的应用
4G智能执法记录仪:汽车保险定损的**利器 随着科技的不断进步,越来越多的智能设备应用到日常生活中。而在车辆保险定损领域,4G智能执法记录仪的出现无疑是一大**。它不仅可以实现远程定损,还能实现可视化操作、打印保单以及数据融…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...