YOLO11解决方案之速度估算探索

概述

Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。

YOLO速度估算结合物体检测和跟踪技术,使用YOLO11 模型检测每帧中的物体,跨帧跟踪这些物体,计算它们在一段时间内的移动情况,然后利用物体在帧间移动的距离和帧频来估算其速度。可为交通分析、自动驾驶、安全分析等各种场景提供高效的速度估计。本文使用Python实现了简单的演示界面,可以在图像中画线或者框,运行推理,输出叠加了类别和速度的视频。

Ultralytics提供了CLI和Python例子,展示如何使用速度估算解决方案。

CLI:

# Run a speed example
yolo solutions speed show=True# Pass a source video
yolo solutions speed source="path/to/video.mp4"# Adjust meter per pixel value based on camera configuration
yolo solutions speed meter_per_pixel=0.05

Python:

import cv2from ultralytics import solutionscap = cv2.VideoCapture("path/to/video.mp4")
assert cap.isOpened(), "Error reading video file"# Video writer
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
video_writer = cv2.VideoWriter("speed_management.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))# Initialize speed estimation object
speedestimator = solutions.SpeedEstimator(show=True,  # display the outputmodel="yolo11n.pt",  # path to the YOLO11 model file.fps=fps,  # adjust speed based on frame per second# max_speed=120,  # cap speed to a max value (km/h) to avoid outliers# max_hist=5,  # minimum frames object tracked before computing speed# meter_per_pixel=0.05,  # highly depends on the camera configuration# classes=[0, 2],  # estimate speed of specific classes.# line_width=2,  # adjust the line width for bounding boxes
)# Process video
while cap.isOpened():success, im0 = cap.read()if not success:print("Video frame is empty or processing is complete.")breakresults = speedestimator(im0)# print(results)  # access the outputvideo_writer.write(results.plot_im)  # write the processed frame.cap.release()
video_writer.release()
cv2.destroyAllWindows()  # destroy all opened windows

SpeedEstimator参数

基本参数

名称类型默认值说明
modelstrNoneYOLO Model 文件路径.
fpsfloat30.0视频帧率.
max_histint5跟踪物体进行速度/方向计算的最多历史点数.
meter_per_pixelfloat0.05缩放因子,用于将像素距离转换为实际单位。
max_speedint120视觉叠加中的最高限速(用于警报)。

SpeedEstimator支持使用track参数:

参数类型默认值说明
trackerstr'botsort.yaml'指定要使用的跟踪算法, bytetrack.yamlbotsort.yaml.
conffloat0.3设置检测的置信度阈值;数值越低,跟踪的物体越多,但可能会出现误报。
ioufloat0.5设置交叉重叠 (IoU) 阈值,用于过滤重叠检测。
classeslistNone按类别索引筛选结果。例如 classes=[0, 2, 3] 只跟踪指定的类别(class在COCO数据集定义)。
verboseboolTrue控制跟踪结果的显示,提供被跟踪物体的可视化输出。
devicestrNone指定用于推理的设备(例如: cpu, cuda:00). 允许用户选择CPU 、特定GPU 或其他计算设备运行模型。

可视化参数:

参数类型默认值说明
showboolFalse如果 True在一个窗口中显示注释的图像或视频。有助于在开发或测试过程中提供即时视觉反馈。
line_widthNone or intNone指定边界框的线宽。如果 None则根据图像大小自动调整线宽,使图像更加清晰。
show_confboolTrue在标签旁显示每次检测的置信度得分。让人了解模型对每次检测的确定性。
show_labelsboolTrue在可视输出中显示每次检测的标签。让用户立即了解检测到的物体。

GUI演示

这里使用Tkinter编写一个简单界面,演示速度估算应用。

从文件菜单打开一个mp4文件,显示第一帧图像。

在图像上画检测线或者检测框。

在这里插入图片描述

矩形绘制完成后,可以使用鼠标右键拖动改变角度。

然后“开始演示”,物体名称及其速度叠加在跟踪物体上方。

在这里插入图片描述

如果verboseTrue,控制台输出当前帧的信息。

0: 384x640 15 cars, 24.0ms
Speed: 1.7ms preprocess, 24.0ms inference, 2.2ms postprocess per image at shape (1, 3, 384, 640)
🚀 Results ****: SolutionResults(out_count=9, classwise_count={'car': {'IN': 0, 'OUT': 8}, 'bus': {'IN': 0, 'OUT': 1}, 'truck': {'IN': 0, 'OUT': 0}}, total_tracks=15)

GUI演示程序代码

本演示程序定义了两个类:VideoProcessorApp类和VideoProcessor类。

class VideoProcessorApp:def __init__(self, root):self.root = rootself.root.title("视频处理应用演示")self.root.geometry("900x700")# 设置中文字体self.font = ('SimHei', 10)# 视频和图像处理相关变量self.cap = Noneself.video_path = ""self.original_frame = Noneself.current_frame = Noneself.processed_frames = []self.is_playing = Falseself.is_processing = Falseself.is_paused = Falseself.draw_mode = None  # 'line' 或 'rectangle'self.start_point = Noneself.end_point = Noneself.drawing = Falseself.output_file = ""self.rect_angle = 0  # 矩形旋转角度self.rect_center = None  # 矩形中心点self.rect_points = None  # 矩形四个顶点self.pause_event = threading.Event()self.video_processor = Noneself._dt_buffer = []self._last_time = time.perf_counter()self.count = 0self.count_read  = 0self.frame_reading_done = False  # 标志位self.object_count = {}# 多线程相关self.frame_queue = Queue(maxsize=60)self.result_queue = Queue(maxsize=60)self.writer_queue = Queue(maxsize=60)self.stop_threads = False# 创建界面组件self.create_menu()self.create_widgets()# 绑定鼠标事件self.canvas.bind("<Button-1>", self.on_mouse_click)self.canvas.bind("<B1-Motion>", self.on_mouse_drag)self.canvas.bind("<ButtonRelease-1>", self.on_mouse_release)self.canvas.bind("<Button-3>", self.on_right_click)self.canvas.bind("<B3-Motion>", self.on_right_drag)self.canvas.bind("<ButtonRelease-3>", self.on_right_release)

VideoProcessor类专门处理视频帧,其中调用了solutions.SpeedEstimator类:

self.speedestimator = solutions.SpeedEstimator(show=False,model="yolo11n.pt",region=pts,fps=fps,  # adjust speed based on fpsclasses=[2,5,7],verbose = False,)

由于读写视频文件和进行神经网络推理均需要较大的计算量,本演示代码使用多线程分别处理读、写、显示和推理,以最大化利用计算机资源,提高处理速度。

def start_processing(self):if self.cap is None or not self.cap.isOpened():messagebox.showerror("错误", "请先打开视频文件")returnif self.video_processor is None:messagebox.showerror("错误", "请先绘制线条或矩形")returnif self.is_processing:messagebox.showinfo("提示", "正在处理视频,请等待")returnself.processed_frames.clear()self.is_processing = Trueself.is_playing = Trueself.is_paused = Falseself.stop_threads = Falseself.process_button.config(state=tk.DISABLED)self.pause_button.config(state=tk.NORMAL)self.stop_button.config(state=tk.NORMAL)self.pause_event.set()# 启动多线程self.reader_thread = threading.Thread(target=self.frame_reader)self.processor_thread = threading.Thread(target=self.frame_processor)self.display_thread = threading.Thread(target=self.result_display)self.writer_thread = threading.Thread(target=self.video_writer_worker)# 设置线程优先级try:self.reader_thread.priority = 'ABOVE_NORMAL'self.processor_thread.priority = 'HIGH'self.writer_thread.priority = 'ABOVE_NORMAL'except:pass# 启动线程self.reader_thread.start()self.processor_thread.start()self.display_thread.start()self.writer_thread.start()

其中的推理线程代码如下:

 def frame_processor(self):"""专用模型推理线程"""while not self.stop_threads:if self.is_paused:time.sleep(0.01)continuetry:start_time = time.time()frame = self.frame_queue.get(timeout=0.1)processed, self.object_count = self.video_processor.process_frame(frame)self.count += 1if not self.stop_threads:self.result_queue.put(processed, timeout=0.1)except Empty:continueexcept Exception as e:print(f"Frame processor error: {str(e)}")break

依据计算机视觉技术估算的速度并非精确的速度,不同的图像和其他因素,会造成不同的估算速度差异,在实际应用中,需要使用测速雷达等设备进行标定,调整计算参数,才能有实用价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识C++:模版

本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2. 显式实例化&#xff1a;在函数名后的<>中指定模…

人工智能100问☞第27问:神经网络与贝叶斯网络的关系?

神经网络与贝叶斯网络是两种互补的智能模型:神经网络通过多层非线性变换从数据中学习复杂模式,擅长大规模特征提取和预测,而贝叶斯网络基于概率推理建模变量间的条件依赖关系,擅长处理不确定性和因果推断。两者的融合(如贝叶斯神经网络)结合了深度学习的表征能力与概率建…

【node.js】入门基础

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的核心特点1.2 Node.js适用场景 2. 第一个Node.js程序2.1 创建并运行Hello World2.2 创建简单的HTTP服务器 3. Node.js核心概念3.1 模块系统3.1.1 创建和导出模块3.1.2 导入和使用模…

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%

百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日&#xff0c;百度飞桨团队正式发布了 PaddleOCR 3.0 版本&#xff0c;并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展&#xff0c;进一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL开发实战指南(AIDL版)

Android 14 Binderized HAL开发实战指南&#xff08;AIDL版&#xff09; 环境要求 Android 14源码编译环境AOSP android-14.0.0_r7分支Soong build系统Java 17 & NDK r25c 项目结构 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是欢乐。 时间是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能从容面对…

交安安全员:交通工程安全领域的关键角色

在交通工程这个庞大而复杂的领域中&#xff0c;交安安全员扮演着举足轻重的角色&#xff0c;他们是安全的捍卫者&#xff0c;是交通工程顺利推进的重要保障。​ 交安安全员&#xff0c;专门从事公路水运工程施工企业安全生产管理工作。他们的专业身份由交通运输部门颁发的交安…

实验-设计一个应用系统(计算机组成原理)

目录 一. 实验内容 二. 实验步骤 &#xff08;1&#xff09;七段数码管显示模块 &#xff08;2&#xff09;指令模块 &#xff08;3&#xff09;控制模块 &#xff08;4&#xff09;ALU模块 &#xff08;5&#xff09;CPU模块 三. 实现效果 四. 实验环境 五. 实验小结…

【博客系统】博客系统第四弹:令牌技术

令牌机制 为什么不能使用 Session 实现登录功能&#xff1f; 传统思路&#xff1a; 登录页面把用户名密码提交给服务器。服务器端验证用户名密码是否正确&#xff0c;并返回校验结果给前端。如果密码正确&#xff0c;则在服务器端创建 Session。通过 Cookie 把 sessionId 返回…

【瑞数3代】药监评审中心逆向分析 | 后缀MmEwMD参数

1.目标 目标网址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫话机器学习系列】274.基尼指数(Gini Index)

决策树中的基尼指数&#xff08;Gini Index&#xff09;详解 —— 从公式理解到实际应用 在构建决策树模型时&#xff0c;一个核心问题是&#xff1a;如何选择最优的特征来进行节点划分&#xff1f; 这就涉及到了“划分准则”的问题。常见的准则有信息增益、信息增益率以及本文…

R语言学习--Day07--T分布与T检验

昨天我们介绍了R中用于对数据进行分类的聚类分析的方法&#xff0c;接下来我们来看T分布。 T分布 T分布适用于帮我们估计整组数据&#xff08;较小的数据量&#xff0c;一般小于30&#xff09;的真实值在哪一个区间&#xff0c;具体是计算置信区间&#xff08;一般为95%&#…

数据结构与算法-线性表-双向链表(Double Linked List)

1 线性表 1.4 双向链表&#xff08;Double Linked List&#xff09; 双向链表的结点中有两个指针域&#xff0c;一个指向直接后继&#xff0c;另一个指向直接前驱&#xff0c;主要是为了解决前向查找的问题。 双向链表结构&#xff1a; 书籍和视频教程都只讲解了插入和删除的…

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例&#xff0c;并对其进行汉化和自定义配置。首先&#xff0c;通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着&#xff0c;通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…

C++23 新增扁平化关联容器详解

文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…

使用zap,对web应用/API接口 做安全检测

https://www.zaproxy.org/getting-started/ 检测方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 执行baseline测试 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 执行api测试 docker run -t ghcr.io/zaproxy/zaproxy…

Qt—模态与非模态对话框

Qt—模态与非模态对话框 核心概念 ​模态对话框​​&#xff1a;强制用户优先处理当前窗口&#xff0c;阻塞指定范围的用户交互。​非模态对话框​​&#xff1a;允许用户自由切换窗口&#xff0c;无交互限制。 一、模态对话框类型与行为 1. 应用级模态&#xff08;Applica…

Axure高保真CRM客户关系管理系统原型

一套出色的CRM&#xff08;客户关系管理&#xff09;系统&#xff0c;无疑是企业管理者掌控客户动态、提升销售业绩的得力助手。今天&#xff0c;就为大家介绍一款精心打造的Axure高保真CRM客户关系管理系统原型模板&#xff0c;助你轻松开启高效客户管理之旅。 这款CRM原型模…

【羊圈——状压 + DP / 记忆化搜索DP】

题目 一般DP代码&#xff08;注意&#xff0c;这里只能向外推(起始状态是f(1,0)&#xff0c;不能向内推&#xff08;不然会导致之前的羊圈被割裂&#xff09;&#xff09; #include <bits/stdc.h> using namespace std;const int MAX_N 210; const int MAX_M 16;int n…

讲解Mysql InnoDB的MVCC

1. 定义 MVCC是多版本并发控制&#xff08;Multi - Version Concurrency Control&#xff09;的缩写。它是InnoDB存储引擎实现高并发控制的一种机制。在数据库系统中&#xff0c;多个事务可能会同时对数据进行读写操作&#xff0c;而MVCC通过为数据行保存多个版本来解决并发事务…