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

news2024/11/29 10:40:18

在这里插入图片描述

要在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_w

    Returns:返回世界坐标系点,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:
        break

    gray = 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) * fps

        speeds.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'):
            break

    prev_frame = gray

cap.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 np

class 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.Q

    def 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:一种基于稀疏表示的目标追踪算法,使用稀疏编码来提取目标的特征表示。

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

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

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

相关文章

nodejs 使用 ws/socket.io 模块 websocket 即时通讯

源码 koa-mongodb-template ws 模块 下载 npm install ws简单使用 服务端代码 const WebSocket require("ws"); const WebSocketServer WebSocket.WebSocketServer;const wss new WebSocketServer({ port: 8080 });// 监听客户端连接 wss.on("connectio…

Python Pandas 通过loc/iloc修改局部数据(第9讲)

Python Pandas 通过loc/iloc修改局部数据(第9讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

一款视频行为分析系统,可轻松开发安全行为检测

系列版本介绍 基于视频行为分析系统v4系列版本可以在不用考虑流媒体音视频开发,编解码开发,界面开发等情况下, 只需要训练自己的模型,开发自己的行为算法插件,就可以轻松开发出任何你想要的安全行为检测,比…

【MYSQL】--MySQL的安装以及基础

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

【Python秘技】用Python实现千图成像,千字成像,编程炫技必备!

一个千图成像,千字成像的程序,开源给大家玩玩。 用她的名字组成她的照片会不会很酷呢? 后续会完善更多功能,打包为程序。 源代码在这里:https://github.com/w-x-x-w/Thousand-Image-Generator 讲解在这里&#xff…

建筑模板怎么选?

在建筑领域,选择合适的模板材料对于确保工程质量、提高施工效率和控制成本至关重要。目前,常见的建筑模板主要有钢模板、塑料模板和木模板三种类型,每种都有其独特的优势和局限性。本文将对这些模板类型进行分析,并特别推荐广西生…

生物化学 荒诞医学史笔记:重金属(暂记)

“理论基础” 四液说 根据希罗多德的说法,古埃及人为了维持自身健康,每月都会使用催吐剂。希波克拉底也提倡定期呕吐。之后的好几千年中,这种建议不断出现。直到最近几十年,催吐剂还被认为是医学处方的重要组 成部分。 大…

这个食堂管理大招,再不知道就晚了!

随着社会的不断发展,餐饮行业也在不断创新和进步。在这个数字化时代,智能技术为各行各业提供了更高效、便捷的解决方案。 食堂作为人们日常生活中不可或缺的一部分,也迎来了智能化的时代。智慧收银系统不仅提高了食堂的运营效率,还…

论文Rebuttal常见格式与模板之中篇

论文Rebuttal常见格式与模板之中篇 前言5. Rebuttal可能遇到的问题5.4 实验不充分5.5 语法,结构,参考文献遗漏等问题5.6 非热点问题,研究意义? 6. 针对AC Message下篇笔记链接Rebuttal模板的好文 前言 这里承接上一篇笔记&#x…

WEB渗透—PHP反序列化(五)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

原知因,正成为中产群体“精准抗衰”新选择

惧怕衰老,渴望长寿,是全人类的共同属性。而在现代生命科学的加持下,科学家们的勇气也前所未有的可畏,人类长寿基因发现者Nir Barzilai就是其中最具代表性的一位。作为人类史上首个抗衰老临床研究TAME的负责人,这位大佬…

初学gitrepo的种种

经过各种折腾之后,发现git其实还是很简单的; 首先你需要两台机器,一台作为服务器,一台作为开发机器,开发机器从服务器上拉取代码。 目 目录 git建仓 开发机器拉取代码 初始化仓代码 repo管理 repo工具的下载 …

Apollo开放平台9.0让自动驾驶开发者轻松上手

文章目录 平台架构:基础环境:开始使用:体验心得: 在自动驾驶技术飞速发展的今天,成为这个领域的一名开发者是一次挑战、一次冒险,更是一次心灵之旅。作为这个领域的先锋之一,Apollo开放平台9.0于12月19日发…

关于PBR策略路由的基础实验

策略路由是基于策略实现数据流量转发,不基于路由表。 // 网络结构实现 lsw: 配置三层交换机 vlan batch 10 20 30 int g0/0/2 port link-type access port default vlan 10 int g0/0/3 port link-type access port default vlan 20 int g0/0/1 port link-type acce…

【Linux基础】4. 目录管理

文章目录 【 1. 处理目录的常用命令 】【 2. ls列出目录 】【 3. cp切换目录 】【 4. pwd显示目前所在的目录 】【 5. mkdir创建新目录 】【 6. rmdir删除空的目录 】【 7. cp复制文件或目录】【 8. rm移除文件或目录 】【 9. mv移动文件与目录或修改名称 】 Linux 的目录结构为…

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

目录 11.1.5 添加新测试 11.2 测试类 11.2.1 各种断言方法 unittestModule中的断言方法: ​编辑11.2.2 一个要测试的类 survey.py language_survey.py 11.2.3 测试 AnonymousSurvey 类 test_survey.py 往期快速传送门👆(在文章最后&…

【Java】【Hutool】从零开始实现发送邮件功能

采用Hutool工具实现发送邮件&#xff0c;可以访问Hutool官网 引言&#xff1a;从零开始&#xff0c;实现一个基本功能&#xff0c;邮件发送 第一步&#xff1a;打开idea&#xff0c;新建maven工程&#xff0c;引入依赖&#xff0c;如下&#xff1a; <dependencies><…

电力智能运维管理系统

电力智能运维管理系统是一种基于先进的信息技术、自动化技术和智能控制技术&#xff0c;针对电力行业的特殊需求而开发的一种全面综合性管理系统。 依托电易云-智慧电力物联网&#xff0c;该系统以实时监测、高效运维、远程控制的方式&#xff0c;将各类数据信息及时采集、处理…

【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题

【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题 1&#xff09;安装 Maven-Helper 插件2&#xff09;Maven Helper 插件使用方法3&#xff09;Idea-Maven 可视化依赖树 1&#xff09;安装 Maven-Helper 插件 这里我们已经安装过了&#xff0c;如果没有安装过&#xff0c;点…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…