YOLO v8目標跟蹤詳細解讀(二)

上一篇,結合代碼,我們詳細的介紹了YOLOV8目標跟蹤的Pipeline。大家應該對跟蹤的流程有了大致的了解,下面我們將對跟蹤中出現的卡爾曼濾波進行解讀。
在這里插入圖片描述

1.卡爾曼濾波器介紹

卡爾曼濾波(kalman Filtering)是一種利用線性系統狀態方程,通過系統輸入觀測數據,對系統狀態進行最優估計的算法。由于觀測數據中包括系統中的噪聲和干擾的影響,所以最優估計也可看作是濾波過程。

卡爾曼濾波在測量方差已知的情況夏能夠從一系列存在測量噪聲的數據中,估計動態系統的狀態。在目標跟蹤中,將檢測框的坐標看作觀測數據,通過狀態轉移矩陣與狀態協方差矩陣來更新下一幀的最優估計。

2.卡爾曼濾波器的基本概念

在這里插入圖片描述
首先,我們需要了解卡爾曼濾波器的一些基本概念。 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}} Xk?1?^?通過 F k F_k Fk?獲得k時刻的估計 X k ^ \hat{X_k} Xk?^? P k P_k Pk?作為狀態協方差矩陣,也需要根據 F k F_k Fk?更新。

在這里插入圖片描述
在這里插入圖片描述觀測量與狀態量可能存在兩個不同的空間,因此需要 H k H_k Hk?實現狀態空間到觀測空間的映射。由于傳感器檢測的觀測量存在誤差,我們可以把觀測空間理解為高斯分布,而狀態量本就是一種估計,相較于觀測量,狀態量可以理解為具有較大方差的高斯分布,其均值為狀態量。
在這里插入圖片描述如上圖所示,狀態量 X k ? 1 ^ \hat{X_{k-1}} Xk?1?^?是位于左側的高斯分布,通過狀態轉移矩陣獲得k時刻狀態量 X k ^ \hat{X_k} Xk?^?,由于過程中存在各種誤差,方差較大。紅色部分是k時刻的觀測量 y k y_k yk?。由于無法預知 X k ^ \hat{X_k} Xk?^? y k y_k yk?兩者哪邊更為準確,我們將兩者結合,得到的聯合分布看作卡爾曼濾波最后更新的狀態量。
在這里插入圖片描述兩個高斯分布的聯合分布也是高斯分布已知兩個高斯分布,其聯合分布也為高斯分布,聯合高斯分布的均值為 μ ^ ′ \hat{\mu}' μ^?, Σ ^ ′ \hat{\Sigma}' Σ^

在這里插入圖片描述
根據上圖中簡單的矩陣計算,我們得到卡爾曼濾波預測與更新5個重要公式。
預測: P k ? 1 P_{k-1} Pk?1?, X k ? 1 ^ \hat{X_{k-1}} Xk?1?^?根據狀態轉移矩陣獲得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.卡爾曼濾波在目標跟蹤的應用

在這里插入圖片描述首先,狀態量為[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形式,左上角坐標與右小角坐標有相關性,協方差矩陣不可表示為對角矩陣。
在這里插入圖片描述
觀測量為[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] = dtself._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. / 20self._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 : ndarrayBounding 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 (8x8dimensional) of the new track. Unobserved velocities are initializedto 0 mean."""mean_pos = measurementmean_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 : ndarrayThe 8 dimensional mean vector of the object state at the previoustime step.covariance : ndarrayThe 8x8 dimensional covariance matrix of the object state at theprevious time step.Returns-------(ndarray, ndarray)Returns the mean vector and covariance matrix of the predictedstate. 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_covreturn mean, covariance

在更新狀態量之前,需要將狀態量以及狀態協方差矩陣映射到觀測量空間,公式如下所示。
在這里插入圖片描述

def project(self, mean, covariance):"""Project state distribution to measurement space.Parameters----------mean : ndarrayThe state's mean vector (8 dimensional array).covariance : ndarrayThe state's covariance matrix (8x8 dimensional).Returns-------(ndarray, ndarray)Returns the projected mean and covariance matrix of the given stateestimate."""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

最后,結合觀測量,構建聯合高斯分布,更新狀態量。
在這里插入圖片描述

def update(self, mean, covariance, measurement):"""Run Kalman filter correction step.Parameters----------mean : ndarrayThe predicted state's mean vector (8 dimensional).covariance : ndarrayThe state's covariance matrix (8x8 dimensional).measurement : ndarrayThe 4 dimensional measurement vector (x, y, a, h), where (x, y)is the center position, a the aspect ratio, and h the height of thebounding 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).Tinnovation = measurement - projected_meannew_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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

歐拉OS 使用 CentOS 7 yum repo

一、下載CentOS的repo的yum文件 任何基于CentOS的yum的repo 的url是這樣的: 但歐拉OS輸出這個變量為:openEuler 20.03 (LTS-SP3) 那明顯歐拉想要使用這個yum的url找不到這個版本, 所以直接講這個變量替換為 7, Centos 7的7 然后執行&…

wget 詳解

wget 詳解 wget 詳解基本用法:命令參數:遞歸下載:斷點續傳:限速下載:后臺下載: 示例 wget 詳解 wget(Web Get)是一個用于從網絡上下載文件的命令行工具,常用于在 Linux …

從零實戰SLAM-第七課(多視角幾何)

在七月算法報的班,老師講的蠻好。好記性不如爛筆頭,關鍵內容還是記錄一下吧,課程入口,感興趣的同學可以學習一下。 --------------------------------------------------------------------------------------------------------…

整型int溢出引起的crash

線上系統發生了crash&#xff0c;后發現是整型溢出。 1、初始化函數的偽代碼&#xff1a; init_mem(int count, int size){for(int i0; i<count; i)mem_list[i] i*size; # 溢出發生的地方} 2、問題分析&#xff1a; 原有的變量 i、size 為有符號的int類型&#xff0c;i…

設計模式--策略模式

目錄 一.場景 1.1場景 2.2 何時使用 2.3個人理解 二. 業務場景練習 2.1業務: 2.2具體實現 2.3思路 三.總結 3.1策略模式的特點&#xff1a; 3.2策略模式優點 3.3策略模式缺點 一.場景 1.1場景 許多相關的類僅僅是行為有異&#xff0c;也就是說業務代碼需要根據場景不…

Android數字價格變化的動畫效果的簡單實現

原理&#xff1a;使用ValueAnimator屬性動畫類實現&#xff0c;它通過值的改變手動設置對象的屬性值來實現動畫效果。直接貼代碼&#xff1a; public static void doNumberAnim(TextView tvPrice, float startNumber, float endNumber) {ValueAnimator animator ValueAnimato…

C語言中的 RSA加密和解密算法: 深度探索與實現

C語言中的 RSA加密和解密算法: 深度探索與實現 RSA加密算法是一種非對稱加密算法&#xff0c;即公開密鑰加密&#xff0c;私有密鑰解密。在公開密鑰加密和私有密鑰解密的過程中&#xff0c;密鑰是不同的&#xff0c;這是與其他加密算法的主要區別。RSA算法的安全性依賴于大數分…

ssm+mybatis無法給帶有下劃線屬性賦值問題

原因&#xff1a;mybaitis根據配置&#xff0c;將有下劃線的字段名改為了駝峰格式。 具體見&#xff1a;ssmmybatis無法給帶有下劃線屬性賦值問題&#xff0c;無法獲取數據庫帶下劃線的字段值 - 開發者博客 解決方式&#xff1a; 直接將實體類中的下劃線去掉返回值使用resul…

歸并排序 與 計數排序

目錄 1.歸并排序 1.1 遞歸實現歸并排序&#xff1a; 1.2 非遞歸實現歸并排序 1.3 歸并排序的特性總結: 1.4 外部排序 2.計數排序 2.1 操作步驟: 2.2 計數排序的特性總結: 3. 7種常見比較排序比較 1.歸并排序 基本思想: 歸并排序(MERGE-SORT)是建立在歸并操作上的一種…

代理技術在網絡安全、爬蟲和數據隱私中的多重應用

1. Socks5代理&#xff1a;靈活的數據中轉 Socks5代理協議在網絡通信中起著關鍵作用。與其他代理技術不同&#xff0c;Socks5代理不僅支持TCP連接&#xff0c;還能夠處理UDP流量&#xff0c;使其在需要實時數據傳輸的場景中表現尤為出色。通過將請求和響應中轉到代理服務器&am…

redis分布式集群-redis+keepalived+ haproxy

redis分布式集群架構&#xff08;RedisKeepalivedHaproxy&#xff09;至少需要3臺服務器、6個節點&#xff0c;一臺服務器2個節點。 redis分布式集群架構中的每臺服務器都使用六個端口來實現多路復用&#xff0c;最終實現主從熱備、負載均衡、秒級切換的目標。 redis分布式集…

使用Edge和chrom擴展工具(GoFullPage)實現整頁面截圖或生成PDF文件

插件GoFullPage下載&#xff1a;點擊免費下載 如果在瀏覽網頁時&#xff0c;有需要整個頁面截圖或導出PDF文件的需求&#xff0c;這里分享一個Edge瀏覽器的擴展插件&#xff1a;GoFullPage。 這個工具可以一鍵實現頁面從上到下滾動并截取。 一、打開“管理擴展”&#xff08;…

網絡設備(防火墻、路由器、交換機)日志分析監控

外圍網絡設備&#xff08;如防火墻、路由器、交換機等&#xff09;是關鍵組件&#xff0c;因為它們控制進出公司網絡的流量。因此&#xff0c;監視這些設備的活動有助于 IT 管理員解決操作問題&#xff0c;并保護網絡免受攻擊者的攻擊。通過收集和分析這些設備的日志來監控這些…

Python 3 使用Hadoop 3之MapReduce總結

MapReduce 運行原理 MapReduce簡介 MapReduce是一種分布式計算模型&#xff0c;由Google提出&#xff0c;主要用于搜索領域&#xff0c;解決海量數據的計算問題。 MapReduce分成兩個部分&#xff1a;Map&#xff08;映射&#xff09;和Reduce&#xff08;歸納&#xff09;。…

tauri-react:快速開發跨平臺軟件的架子,支持自定義頭部和窗口陰影效果

tauri-react 一個使用 taurireacttsantd 開發跨平臺軟件的模板&#xff0c;支持窗口頭部自定義和窗口陰影&#xff0c;不用再自己做適配了&#xff0c;拿來即用&#xff0c;非常 nice。 開原地址&#xff1a;GitHub - Sjj1024/tauri-react: 一個最基礎的使用tauri和react開發…

生成式 AI 在泛娛樂行業的應用場景實踐 – 助力風格化視頻內容創作

感謝大家閱讀《生成式 AI 行業解決方案指南》系列博客&#xff0c;全系列分為 4 篇&#xff0c;將為大家系統地介紹生成式 AI 解決方案指南及其在電商、游戲、泛娛樂行業中的典型場景及應用實踐。目錄如下&#xff1a; 《生成式 AI 行業解決方案指南與部署指南》《生成式 AI 在…

一個概率論例題引發的思考

浙江大學版《概率論與數理統計》一書&#xff0c;第13章第1節例2&#xff1a; 這個解釋和模型比較簡單易懂。 接下來&#xff0c;第13章第2節的例2也跟此模型相關&#xff1a; 在我自己的理解中&#xff0c;此題的解法跟上一個題目一樣&#xff0c;其概率如下面的二維矩陣&a…

聊聊計算機技術

目錄 1.計算機的概念 2.計算機的發展過程 3.計算機的作用 4.計算機給人類帶來的福利 1.計算機的概念 計算機是一種用于處理和存儲數據的電子設備。它能夠執行各種操作&#xff0c;比如計算、邏輯操作、數據存儲和檢索等。計算機由硬件和軟件兩部分組成。 計算機的硬件包括中…

Go 語言并發編程 及 進階與依賴管理

1.0 從并發編程本質了解Go高性能的本質 1.1 Goroutine 協程可以理解為輕量級線程&#xff1b; Go更適合高并發場景原因之一&#xff1a;Go語言一次可以創建上萬協成&#xff1b; “快速”&#xff1a;開多個協成 打印。 go func(): 在函數前加 go 代表 創建協程; time.Sleep():…

基于深度信念網絡的西儲大學軸承故障分類識別,基于EMD+DBN的西儲大學軸承故障識別,LCD+DBN,LMD+DBN

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) (EMD,LCD,LMD)+DBN的深度信念網絡的西儲大學軸承故障分類識別 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類…