当前位置: 首页 > news >正文

yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)

在这里插入图片描述

要在YOLOv5中添加测距和测速功能,您需要了解以下两个部分的原理:

单目测距算法

  • 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法(如立体匹配)和基于深度学习的方法(如神经网络)。
  • 基于深度学习的方法通常使用卷积神经网络(CNN)来学习从图像到深度图的映射关系。

单目测距代码

单目测距涉及到坐标转换,代码如下:

def convert_2D_to_3D(point2D, R, t, IntrinsicMatrix, K, P, f, principal_point, height):"""例如:像素坐标转世界坐标Args:point2D: 像素坐标点R: 旋转矩阵t: 平移矩阵IntrinsicMatrix:内参矩阵K:径向畸变P:切向畸变f:焦距principal_point:主点height:Z_wReturns:返回世界坐标系点,point3D_no_correct, point3D_yes_correct"""point3D_no_correct = []point3D_yes_correct = []##[(u1,v1),#   (u2,v2)]point2D = (np.array(point2D, dtype='float32'))

在YOLOv5中添加单目测距功能的一种方法是,在训练集上收集带有物体标注和深度信息的数据。然后,可以使用深度学习模型(如卷积神经网络)将输入图像映射到深度图。训练完成后,您可以使用该模型来估计图像中物体的距离。
在这里插入图片描述

差帧算法(Frame Difference Algorithm)

  • 差帧算法是一种基于视频序列的帧间差异来计算物体速度的方法。它基于一个简单的假设:相邻帧之间物体的位置变化越大,物体的速度越快。
  • 差帧算法是一种基于视频序列的帧间差异来计算物体速度的方法。其原理是计算物体在相邻两帧之间的位置差异,然后通过时间间隔来计算物体的速度。

假设物体在第t帧和第(t-1)帧中的位置分别为pt和pt-1,则可以使用欧氏距离或其他相似度度量方法来计算它们之间的距离:

d = ||pt - pt-1||

其中||.||表示欧氏距离。然后,通过时间间隔Δt来计算物体的平均速度v:

v = d / Δt

其中,Δt表示第t帧和第(t-1)帧之间的时间间隔。在实际应用中,可以根据需要对速度进行平滑处理,例如使用移动平均或卡尔曼滤波等方法。

测速代码

以下是一个简单的差帧算法代码示例,用于计算物体在视频序列中的速度:```python
import cv2
import numpy as np# 读取视频文件
cap = cv2.VideoCapture('video.mp4')# 初始化参数
prev_frame = None
prev_position = None
fps = cap.get(cv2.CAP_PROP_FPS)  # 视频帧率
speeds = []  # 存储速度值while cap.isOpened():ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)if prev_frame is not None:# 计算当前帧和前一帧之间的位置差异flow = cv2.calcOpticalFlowFarneback(prev_frame, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)# 提取运动向量的x和y分量vx = flow[..., 0]vy = flow[..., 1]# 计算位置差异的欧氏距离distance = np.sqrt(np.square(vx) + np.square(vy))# 计算速度speed = np.mean(distance) * fpsspeeds.append(speed)# 可选:可视化结果flow_vis = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)flow_vis[..., 0] = np.arctan2(vy, vx) * (180 / np.pi / 2)flow_vis[..., 2] = cv2.normalize(distance, None, 0, 255, cv2.NORM_MINMAX)flow_vis = cv2.cvtColor(flow_vis, cv2.COLOR_HSV2BGR)cv2.imshow('Flow Visualization', flow_vis)if cv2.waitKey(1) & 0xFF == ord('q'):breakprev_frame = graycap.release()
cv2.destroyAllWindows()# 打印速度结果
print("速度列表:", speeds)

该代码使用OpenCV库中的`函数来计算相邻帧之间的光流向量,并通过欧氏距离计算位置差异。然后,通过视频的帧率计算速度,并将速度存储在一个列表中。你可以根据自己的需求对速度进行进一步处理或可视化。请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行调整和改进。

追踪

而DeepSORT是一种目标跟踪算法,常与YOLOv5结合使用。

DeepSORT(Deep Learning + SORT)是一种基于深度学习和卡尔曼滤波的目标跟踪算法。它通过结合YOLOv5等目标检测器的输出和SORT(Simple Online and Realtime Tracking)算法的轨迹管理,实现对视频中目标的准确跟踪。

DeepSORT的主要特点如下:

  • 多目标跟踪:DeepSORT能够同时跟踪多个目标,并为每个目标生成唯一的ID,以便在不同帧之间进行关联。
  • 深度特征嵌入:DeepSORT使用深度学习模型(如ResNet)提取目标的特征向量,将其用于目标的身份验证和关联。
  • 卡尔曼滤波:DeepSORT使用卡尔曼滤波器来预测目标的位置和速度,并通过将检测和预测结果进行关联,提供平滑的目标轨迹。
  • 数据关联:DeepSORT使用匈牙利算法将当前帧的检测结果与上一帧的跟踪结果进行关联,以最大化目标标识的一致性

通过将YOLOv5和DeepSORT结合使用,可以实现准确的目标检测和连续的目标跟踪,从而在视频监控、自动驾驶、智能机器人等领域提供更加全面和高效的解决方案。这种结合能够在实时场景下处理大量目标,并为每个目标提供连续的轨迹信息,具有广泛的应用前景。

追踪代码

以下是一个简化的卡尔曼滤波算法的代码示例:

import numpy as npclass KalmanFilter:def __init__(self, state_dim, measurement_dim):# 初始化状态转移矩阵self.F = np.eye(state_dim)# 初始化测量矩阵self.H = np.eye(measurement_dim, state_dim)# 初始化状态估计self.x = np.zeros((state_dim, 1))# 初始化状态协方差矩阵self.P = np.eye(state_dim)# 初始化过程噪声协方差矩阵self.Q = np.eye(state_dim)# 初始化测量噪声协方差矩阵self.R = np.eye(measurement_dim)def predict(self):# 预测状态self.x = np.dot(self.F, self.x)# 预测状态协方差self.P = np.dot(np.dot(self.F, self.P), self.F.T) + self.Qdef update(self, z):# 计算预测残差y = z - np.dot(self.H, self.x)# 计算预测残差协方差S = np.dot(np.dot(self.H, self.P), self.H.T) + self.R# 计算卡尔曼增益K = np.dot(np.dot(self.P, self.H.T), np.linalg.inv(S))# 更新状态估计self.x = self.x + np.dot(K, y)# 更新状态协方差self.P = np.dot((np.eye(self.x.shape[0]) - np.dot(K, self.H)), self.P)# 示例用法
# 创建卡尔曼滤波器对象
kalman_filter = KalmanFilter(state_dim=2, measurement_dim=1)# 模拟测量值
measurements = [1.2, 1.7, 2.5, 3.6]# 进行预测和更新
for z in measurements:kalman_filter.predict()kalman_filter.update(np.array([[z]]))# 打印更新后的状态估计值print(kalman_filter.x)

上述代码是一个简单的一维卡尔曼滤波器的实现。您可以根据需要调整状态维度 state_dim 和测量维度 measurement_dim,并设置相应的状态转移矩阵 F、测量矩阵 H、过程噪声协方差矩阵 Q 和测量噪声协方差矩阵 R。然后,通过 predict() 方法进行预测,通过 update() 方法进行更新。

请注意,卡尔曼滤波算法的具体实现可能因应用场景而有所不同。这里提供的代码仅用于展示基本的卡尔曼滤波器结构和操作步骤,需要根据具体需求进行相应的调整和扩展。

总结

具体实现上述功能的步骤如下:
在这里插入图片描述

单目测距:

  • 收集训练数据集,包含物体标注和对应的深度信息。
    构建深度学习模型,例如使用卷积神经网络(如ResNet、UNet等)进行图像到深度图的映射。
  • 使用收集的数据集进行模型训练,优化深度学习模型。
  • 在YOLOv5中添加单目测距功能时,加载训练好的深度学习模型,并在检测到对象时,使用该模型估计距离。

差帧算法:

  • 对视频序列进行物体检测和跟踪,获取物体在连续帧中的位置信息。
  • 计算相邻帧之间物体位置的差异,可以使用欧氏距离或其他相似度度量方法。
  • qq 1309399183
  • 将差异除以时间间隔,得到物体的平均速度。

追踪算法

除了DeepSORT,还有一些其他常见的目标追踪算法:

  1. SORT(Simple Online and Realtime Tracking):一个简单但高效的在线实时目标追踪算法,通过卡尔曼滤波器和匈牙利算法实现目标匹配。

  2. MOSSE(Minimum Output Sum of Squared Error):一种基于相关滤波器的目标追踪算法,使用最小输出平方误差来更新模板。

  3. KCF(Kernelized Correlation Filter):一种基于相关滤波器的目标追踪算法,使用核函数来建立目标与模板之间的关系。

  4. TLD(Tracking-Learning-Detection):一种结合了目标检测和跟踪的方法,使用学习算法来提高目标模型的准确性。

  5. ECO(Efficient Convolution Operators):一种基于傅里叶变换的目标追踪算法,能够快速计算目标模板与搜索区域之间的相似度。

  6. C-COT(Context-aware Correlation Tracking):一种基于上下文感知的目标追踪算法,使用上下文信息来提高目标模板的鲁棒性。

  7. StapleTrack:一种基于稀疏表示的目标追踪算法,使用稀疏编码来提取目标的特征表示。

这些追踪算法各有优缺点,具体应用时需要根据实际需求选择合适的算法。

相关文章:

yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)

要在YOLOv5中添加测距和测速功能,您需要了解以下两个部分的原理: 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法(如立体匹配)和基于深度学习的方法(如神经网…...

flink 读取 apache paimon表,查看source的延迟时间 消费堆积情况

paimon source查看消费的数据延迟了多久 如果没有延迟 则显示0 官方文档 Metrics | Apache Paimon...

无人机在融合通信系统中的应用

无人驾驶飞机简称“无人机”,是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞行器,现今无人机在航拍、农业、快递运输、测绘、新闻报道多个领域中都有深度的应用。 在通信行业中,无人机广泛应用于交通,救援,消…...

MySQL库的操作

目录 创建数据库创建数据库案例字符集和校验规则查看系统默认字符集以及校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响 操纵数据库查看数据库修改数据库删除数据库数据库备份和恢复表的备份和恢复查看连接情况 创建数据库 创建数据库的…...

服务器解析漏洞有哪些?IIS\APACHE\NGINX解析漏洞利用

解析漏洞是指在Web服务器处理用户请求时,对输入数据(如文件名、参数等)进行解析时产生的漏洞。这种漏洞可能导致服务器对用户提供的数据进行错误解析,使攻击者能够执行未经授权的操作。解析漏洞通常涉及到对用户输入的信任不足&am…...

Https图片链接下载问题

1. 获取方法 入参是一个Url, 和一个随机的名称. 返回值是MultipartFile, 这里因为我这里需要调接口传到服务器, 这里也可以直接通过inputStream进行操作. 按需修改 /*** 通过Url获取文件** param url* param fileName 随机产生一个文件名, 可以是uuid等* return* throws Excep…...

Wireshark在移动网络中的应用

第一章:Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧:过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章:网络协议分析 2.1 网络协议分析:TCP、UDP、ICMP等 2.2 高级协议分析:HTTP…...

Leetcode 1901. 寻找峰值 II(Java + 列最大值 + 二分)

题目 1901. 寻找峰值 II 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中任意两个相邻格子的值都 不相同 。找出 任意一个 峰值 mat[i][j] 并 返回其位置 [i,j] 。你可以假设整个矩阵周边…...

RabbitMQ 消息持久化

默认情况下,exchange、queue、message 等数据都是存储在内存中的,这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失。 RabbitMQ 提供了持久化来解决这个问题,持久化后,如果 RabbitMQ 发送 重启、关闭、宕机&#xff…...

Opencv实验合集——实验四:图片融合

1.概念 图像融合是将两个或多个图像结合在一起,创建一个新的图像的过程。这个过程的目标通常是通过合并图像的信息来获得比单个图像更全面、更有信息量的结果。图像融合可以在许多领域中应用,包括计算机视觉、遥感、医学图像处理等。 融合的方法有很多…...

Java复习

CH1 Java Fundamentals 1.1 Java Features(java特色) 1.1 Simplicity: simple grammar, rich library 简单好用: 语法简单,库文件丰富 1.2 Pure OO: everything is object! 所有程序都是对象 1.3 Security: memory access,…...

腾讯云微服务11月产品月报 | TSE 云原生 API 网关支持 WAF 对象接入

2023年 11月动态 TSE 云原生 API 网关 1、支持使用私有 DNS 解析 服务来源支持私有 DNS 解析器,用户可以添加自己的 DNS 解析器地址进行私有域名解析,适用于服务配置了私有域名的用户。 2、支持 WAF 对象接入 云原生 API 网关对接 Web 安全防火墙&…...

性能优化-待处理

1 性能优化-循环展开...

Linux: sysctl: network: ip_no_pmtu_disc,容易搞混的参数名称

这个参数的迷惑性在于双重否定,字面意思是关闭PMTU发现的功能。如果设置为1,代表关闭;如果是0,代表不关闭pmtu发现的功能。所以说明里,有disable/enable,就容易搞混。所以要甄别网上的某些博客的说明,不要被误导。 ip_no_pmtu_disc - INTEGER Disable Path MTU Discover…...

关于“Python”的核心知识点整理大全26

目录 10.3.9 决定报告哪些错误 10.4 存储数据 10.4.1 使用 json.dump()和 json.load() number_writer.py number_reader.py 10.4.2 保存和读取用户生成的数据 对于用户生成的数据,使用json保存它们大有裨益,因为如果不以某种方式进行存储&#xf…...

Axure中继器完成表格的增删改查的自定义元件(三列表格与十列表格)

目录 一、中继器 1.1 定义 1.2 特点 1.3 适用场景 二、三列表格增删改查 2.1 实现思路 2.2 效果演示 三、十列表格增删改查 3.1 实现思路 3.2 效果演示 一、中继器 1.1 定义 在Axure中,"中继器"通常指的是界面设计中的一个元素,用…...

刚clone下来的项目如何上传到新的仓库

查看当前项目的git信息 git remote -v 查看git目录上传到哪个路径下 拉下的项目如何上传到新的仓库 git clone xxxcd xxxrm -r .git 删除原有的git信息,有问题一直回车git init 初始化gitgit add . git commit -m ‘xxx’git remote add origin 远程库地址&#…...

面试题总结(十五)【ARMstm32】【华清远见西安中心】

ARM Cortex-M,Cortex-R,Cortex-A的区别和差异是什么? ARM Cortex-M,Cortex-R和Cortex-A是ARM架构下的不同处理器系列,针对不同的应用领域和需求进行了优化和设计。它们之间的区别和差异主要体现在以下几个方面: 1. 应用领域&#…...

助听器概述

助听器概述 什么是助听器? 助听器是一种放置在耳内或耳后的小型电子设备。助听器可以放大声音,使听力损失的人能够提高他们的听力和言语理解能力。 今天有许多不同类型的助听器,包括处方助听器和非处方 (OTC) 助听器…...

学习k8s

学习k8s 我为什么要用k8s 和其他部署方式的区别是什么? 传统部署方式 java --> package --> 放到服务器上 --> Tomcat 如果是同时进行写操作,会存在并发问题. 用户 --网络带宽–> 服务器 -->服务 同一个服务器上,多个服务: 网络资源的占用 内存的占用 cpu的占…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...