YOLO v8目标跟踪详细解读(二)

这篇具有很好参考价值的文章主要介绍了YOLO v8目标跟踪详细解读(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇,结合代码,我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解,下面我们将对跟踪中出现的卡尔曼滤波进行解读。

1.卡尔曼滤波器介绍

卡尔曼滤波(kalman Filtering)是一种利用线性系统状态方程,通过系统输入观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。

卡尔曼滤波在测量方差已知的情况夏能够从一系列存在测量噪声的数据中,估计动态系统的状态。在目标跟踪中,将检测框的坐标看作观测数据,通过状态转移矩阵与状态协方差矩阵来更新下一帧的最优估计。

2.卡尔曼滤波器的基本概念

YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能
首先,我们需要了解卡尔曼滤波器的一些基本概念。 X k ^ \hat{X_k} Xk^表示k时可的状态量, F k F_k Fk表示 X k ^ \hat{X_k} Xk^的状态转移矩阵(运动估计矩阵)。我们可以利用 X k − 1 ^ \hat{X_{k-1}} Xk1^通过 F k F_k Fk获得k时刻的估计 X k ^ \hat{X_k} Xk^ P k P_k Pk作为状态协方差矩阵,也需要根据 F k F_k Fk更新。

YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能
YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能
观测量与状态量可能存在两个不同的空间,因此需要 H k H_k Hk实现状态空间到观测空间的映射。由于传感器检测的观测量存在误差,我们可以把观测空间理解为高斯分布,而状态量本就是一种估计,相较于观测量,状态量可以理解为具有较大方差的高斯分布,其均值为状态量。
YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能
如上图所示,状态量 X k − 1 ^ \hat{X_{k-1}} Xk1^是位于左侧的高斯分布,通过状态转移矩阵获得k时刻状态量 X k ^ \hat{X_k} Xk^,由于过程中存在各种误差,方差较大。红色部分是k时刻的观测量 y k y_k yk。由于无法预知 X k ^ \hat{X_k} Xk^ y k y_k yk两者哪边更为准确,我们将两者结合,得到的联合分布看作卡尔曼滤波最后更新的状态量。
YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能
已知两个高斯分布,其联合分布也为高斯分布,联合高斯分布的均值为 μ ^ ′ \hat{\mu}' μ^, Σ ^ ′ \hat{\Sigma}' Σ^

YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能

根据上图中简单的矩阵计算,我们得到卡尔曼滤波预测与更新5个重要公式。
预测: P k − 1 P_{k-1} Pk1, X k − 1 ^ \hat{X_{k-1}} Xk1^根据状态转移矩阵获得k时刻 P k ^ \hat{P_{k}} Pk^ X k ^ \hat{X_{k}} Xk^
更新:将状态量映射至观测量空间,联合观测量更新状态量 X k ^ ′ \hat{X_{k}}' Xk^,状态协方差矩阵 P k ′ {P_{k}}' Pk,本质是将观测量与状态量的高斯分布结合,形成的联合分布看作最终状态量的分布,其中 K ′ K' K称为卡尔曼增益。

3.卡尔曼滤波在目标跟踪的应用

YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能首先,状态量为[x,y,a,h,dx,dy,da,dh],我们需要预测坐标框下一帧的位置,所以状态转移矩阵很简单,表示为图中所示固定矩阵 F k F_k Fk。物理意义:下一时刻的位置=该时刻的位置+该时刻的速度× Δ \Delta Δt,这里 Δ \Delta Δt设为1。系统输入 u k u_k uk设为0。

为什么选用xyah作为状态量,而不是xyxy?主要考虑xyah作为4个独立变量,他们的协方差=0,因此协方差矩阵可以表示为对角矩阵。而xyxy形式,左上角坐标与右小角坐标有相关性,协方差矩阵不可表示为对角矩阵。
YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能
观测量为[x,y,a,h],因此映射矩阵 H k H_k Hk为图中所示固定矩阵。我们对KF进行初始化,self._motion_mat表示 F k F_k Fk状态转移矩阵,self._update_mat表示 H k H_k Hk映射矩阵, self._std_weight_position表示位置方差的权重,self._std_weight_velocity 表示速度方差的权重,赋值均为经验值。

def __init__(self):
        """Initialize Kalman filter model matrices with motion and observation uncertainties."""
        ndim, dt = 4, 1.

        # Create Kalman filter model matrices.
        self._motion_mat = np.eye(2 * ndim, 2 * ndim)
        for i in range(ndim):
            self._motion_mat[i, ndim + i] = dt
        self._update_mat = np.eye(ndim, 2 * ndim)

        # Motion and observation uncertainty are chosen relative to the current
        # state estimate. These weights control the amount of uncertainty in
        # the model. This is a bit hacky.
        self._std_weight_position = 1. / 20
        self._std_weight_velocity = 1. / 160

将该帧未关联的检测框坐标作为新轨迹的状态量,同时将mean_vel初始化为0。 X k ^ \hat{X_k} Xk^=mean = np.r_[mean_pos, mean_vel]。 P k {P_k} Pk初始化,其中x,y,h, x ′ , y ′ , h ′ x',y',h' x,y,h的方差均与h为正比,a, a ′ a' a为宽高比,方差为常值1e-2,1e-5。因为xy为检测框中心点,它存在于图中任意点,作为方差没有意义,因此方差正比于h。

def initiate(self, measurement):
        """Create track from unassociated measurement.

        Parameters
        ----------
        measurement : ndarray
            Bounding box coordinates (x, y, a, h) with center position (x, y),
            aspect ratio a, and height h.

        Returns
        -------
        (ndarray, ndarray)
            Returns the mean vector (8 dimensional) and covariance matrix (8x8
            dimensional) of the new track. Unobserved velocities are initialized
            to 0 mean.

        """
        mean_pos = measurement
        mean_vel = np.zeros_like(mean_pos)
        mean = np.r_[mean_pos, mean_vel]

        std = [
            2 * self._std_weight_position * measurement[3], 2 * self._std_weight_position * measurement[3], 1e-2,
            2 * self._std_weight_position * measurement[3], 10 * self._std_weight_velocity * measurement[3],
            10 * self._std_weight_velocity * measurement[3], 1e-5, 10 * self._std_weight_velocity * measurement[3]]
        covariance = np.diag(np.square(std))
        return mean, covariance

在进行轨迹关联前,需要预测轨迹在该帧的状态量。上面我们已经讨论了卡尔曼滤波预测的公式,翻译成代码就如下所示,其中motion_cov表示不确定性干扰,通常为对角矩阵状态量相关,对位元素越大,其值越大。

def predict(self, mean, covariance):
        """Run Kalman filter prediction step.

        Parameters
        ----------
        mean : ndarray
            The 8 dimensional mean vector of the object state at the previous
            time step.
        covariance : ndarray
            The 8x8 dimensional covariance matrix of the object state at the
            previous time step.

        Returns
        -------
        (ndarray, ndarray)
            Returns the mean vector and covariance matrix of the predicted
            state. Unobserved velocities are initialized to 0 mean.

        """
        std_pos = [
            self._std_weight_position * mean[3], self._std_weight_position * mean[3], 1e-2,
            self._std_weight_position * mean[3]]
        std_vel = [
            self._std_weight_velocity * mean[3], self._std_weight_velocity * mean[3], 1e-5,
            self._std_weight_velocity * mean[3]]
        motion_cov = np.diag(np.square(np.r_[std_pos, std_vel]))

        # mean = np.dot(self._motion_mat, mean)
        mean = np.dot(mean, self._motion_mat.T)
        covariance = np.linalg.multi_dot((self._motion_mat, covariance, self._motion_mat.T)) + motion_cov

        return mean, covariance

在更新状态量之前,需要将状态量以及状态协方差矩阵映射到观测量空间,公式如下所示。
YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能

def project(self, mean, covariance):
        """Project state distribution to measurement space.

        Parameters
        ----------
        mean : ndarray
            The state's mean vector (8 dimensional array).
        covariance : ndarray
            The state's covariance matrix (8x8 dimensional).

        Returns
        -------
        (ndarray, ndarray)
            Returns the projected mean and covariance matrix of the given state
            estimate.

        """
        std = [
            self._std_weight_position * mean[3], self._std_weight_position * mean[3], 1e-1,
            self._std_weight_position * mean[3]]
        innovation_cov = np.diag(np.square(std))

        mean = np.dot(self._update_mat, mean)
        covariance = np.linalg.multi_dot((self._update_mat, covariance, self._update_mat.T))
        return mean, covariance + innovation_cov

最后,结合观测量,构建联合高斯分布,更新状态量。
YOLO v8目标跟踪详细解读(二),深度学习,目标检测,目标跟踪,YOLO,目标跟踪,人工智能文章来源地址https://www.toymoban.com/news/detail-649100.html

def update(self, mean, covariance, measurement):
        """Run Kalman filter correction step.

        Parameters
        ----------
        mean : ndarray
            The predicted state's mean vector (8 dimensional).
        covariance : ndarray
            The state's covariance matrix (8x8 dimensional).
        measurement : ndarray
            The 4 dimensional measurement vector (x, y, a, h), where (x, y)
            is the center position, a the aspect ratio, and h the height of the
            bounding box.

        Returns
        -------
        (ndarray, ndarray)
            Returns the measurement-corrected state distribution.

        """
        projected_mean, projected_cov = self.project(mean, covariance)

        chol_factor, lower = scipy.linalg.cho_factor(projected_cov, lower=True, check_finite=False)
        kalman_gain = scipy.linalg.cho_solve((chol_factor, lower),
                                             np.dot(covariance, self._update_mat.T).T,
                                             check_finite=False).T
        innovation = measurement - projected_mean

        new_mean = mean + np.dot(innovation, kalman_gain.T)
        new_covariance = covariance - np.linalg.multi_dot((kalman_gain, projected_cov, kalman_gain.T))
        return new_mean, new_covariance

到了这里,关于YOLO v8目标跟踪详细解读(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习目标检测_YOLOV2超详细解读

    YOLO v1虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLO v2在YOLO v1的基础上提出了几种改进策略,如下图所示,一些改进方法能有效提高模型的mAP。 这个图片的第2行第1列是进行改进的点,第2行第3列应该看红色数字标注的列

    2024年02月08日
    浏览(39)
  • 深度学习|目标检测与YOLO算法

    目标检测(object detection)是在给定的图片中精确找到物体所在位置,并标注出物体的类别。物体的尺寸变化范围很大,摆放物体的角度、姿态不确定,而且可以出现在图片任何地方,同时物体也可是多个类别的。 目标检测在多个领域中被广泛使用。例如,在无人驾驶领域,

    2024年02月04日
    浏览(34)
  • OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

    2012年,随着深度学习技术的不断突破,开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年,Girshick等人首次采用深度神经网络实现目标检测,设计出R-CNN网络结构,实验结果表明,在检测任务中性能比DPM算法优越。同时,何恺明等人针对卷积神经网络(Convolutional Neura

    2024年02月13日
    浏览(41)
  • 深度学习(目标检测):YOLO网络学习笔记(YOLO v1,YOLO v2和 YOLO v3)

    两种进行目标检测任务的深度学习方法 : 分类 :深度学习的目标检测的方法可以分为两类,分别是一阶段方法和二阶段方法。 一阶段方法 :YOLO系列模型都是一阶段方法,这一类方法可以一步到位地使用卷积神经网络进行特征提取并输出标注框。 两阶段方法 :两阶段阶段

    2023年04月11日
    浏览(33)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪(代码+视频)

    计算机视觉、深度学习和机器学习是当今最热门的技术,它们被广泛应用于各种领域,如自动驾驶、医学图像分析、安防监控等。而目标检测跟踪技术则是计算机视觉中的一个重要分支,它可以帮助我们在图像或视频中自动识别和跟踪特定的目标。 下面我们来一一介绍这些技

    2024年02月01日
    浏览(94)
  • 竞赛保研 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年01月16日
    浏览(44)
  • 【深度学习】yolo-World,数据标注,zeroshot,目标检测

    仓库:https://github.com/AILab-CVC/YOLO-World 下载权重: 仓库下载和环境设置 下载仓库 :使用以下命令从 GitHub 上克隆仓库: 创建并激活环境 :首先,创建一个名为 yoloword1 的 Conda 环境,并激活它: 安装依赖项 安装 PyTorch 和 Gradio :使用以下命令安装 PyTorch 和 Gradio: 安装 YOLO-W

    2024年04月28日
    浏览(78)
  • 目标检测YOLO实战应用案例100讲-基于深度学习的遥感目标检测算法FPGA部署实现研究

    目录 基于深度学习的目标检测网络剪枝及FPGA部署  基于深度学习的目标检测网络和神经网络剪枝概述 

    2024年02月10日
    浏览(35)
  • 目标检测YOLO实战应用案例100讲-基于深度学习的交通标志小目标检测与识别研究

    目录 前言 目标检测算法相关理论  2.1 深度学习理论基础  2.1.2卷积神经网络 

    2024年02月11日
    浏览(34)
  • 竞赛 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习得交通车辆流量分析 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/da

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包