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,还有一些其他常见的目标追踪算法:
-
SORT(Simple Online and Realtime Tracking):一个简单但高效的在线实时目标追踪算法,通过卡尔曼滤波器和匈牙利算法实现目标匹配。
-
MOSSE(Minimum Output Sum of Squared Error):一种基于相关滤波器的目标追踪算法,使用最小输出平方误差来更新模板。
-
KCF(Kernelized Correlation Filter):一种基于相关滤波器的目标追踪算法,使用核函数来建立目标与模板之间的关系。
-
TLD(Tracking-Learning-Detection):一种结合了目标检测和跟踪的方法,使用学习算法来提高目标模型的准确性。
-
ECO(Efficient Convolution Operators):一种基于傅里叶变换的目标追踪算法,能够快速计算目标模板与搜索区域之间的相似度。
-
C-COT(Context-aware Correlation Tracking):一种基于上下文感知的目标追踪算法,使用上下文信息来提高目标模板的鲁棒性。
-
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 发送 重启、关闭、宕机ÿ…...

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保存它们大有裨益,因为如果不以某种方式进行存储…...

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的占…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...