當前位置:首頁 » 操作系統 » 低角跟蹤演算法

低角跟蹤演算法

發布時間: 2023-06-04 13:45:16

1. 目前最流行的機器學習演算法是什麼

毫無疑問,機器學習在過去幾年越來越受歡迎。由於大數據是目前技術行業最熱門的趨勢,機器學習是非常強大的,可以根據大量數據進行預測或計算推理。
如果你想學習機器演算法,要從何下手呢?
監督學習
1. 決策樹:決策樹是一種決策支持工具,使用的決策及其可能產生的後果,包括隨機事件的結果,資源消耗和效用的樹狀圖或模型。
從業務決策的角度來看,決策樹是人們必須要選擇是/否的問題,以評估大多數時候作出正確決策的概率。它允許您以結構化和系統的方式來解決問題,以得出邏輯結論。
2.樸素貝葉斯分類:樸素貝葉斯分類器是一種簡單的概率分類器,基於貝葉斯定理,其特徵之間具有強大(樸素)的獨立性假設。
特徵圖像是方程 - P(A | B)是後驗概率,P(B | A)是似然度,P(A)是類先驗概率,P(B)是預測先驗概率。
一些現實世界的例子是:
判斷郵件是否為垃圾郵件
分類技術,將新聞文章氛圍政治或體育類
檢查一段表達積極情緒或消極情緒的文字
用於面部識別軟體
3.普通最小二乘回歸:如果你了解統計學,你可能已經聽說過線性回歸。最小二乘法是一種執行線性回歸的方法。
您可以將線性回歸視為擬合直線穿過點狀分布的任務。有多種可能的策略可以做到這一點,「普通最小二乘法」策略就像這樣 -你可以畫一條線,然後把每個數據點,測量點和線之間的垂直距離,添加上去;擬合線將是距離總和的盡可能小的線。
線性是指您正在使用的模型來迎合數據,而最小二乘可以最小化線性模型誤差。
4.邏輯回歸: Logistic回歸是一個強大的統計學方法,用一個或多個解釋變數建模二項式結果。它通過使用邏輯函數估計概率,來衡量分類因變數與一個或多個獨立變數之間的關系,後者是累積邏輯分布。
邏輯回歸用於生活中:
信用評級
衡量營銷活動的成功率
預測某一產品的收入
某一天會有地震嗎
5.支持向量機: SVM是二元分類演算法。給定N維空間中兩種種類型的點,SVM生成(N-1)維的超平面將這些點分成2組。
假設你有一些可以線性分離的紙張中的兩種類型的點。SVM將找到一條直線,將這些點分成兩種類型,並盡可能遠離所有這些點。
在規模上,使用SVM解決的一些特大的問題(包括適當修改的實現)是:廣告、人類基因剪接位點識別、基於圖像的性別檢測,大規模圖像分類...
6.集成方法:集成方法是構建一組分類器的學習演算法,然後通過對其預測進行加權投票來對新的數據點進行分類。原始的集成方法是貝葉斯平均法,但更新的演算法包括糾錯輸出編碼、bagging和boosting。
那麼集成方法如何工作,為什麼它們優於單個模型?
均衡偏差:如果你均衡了大量的傾向民主黨的投票和大量傾向共和黨的投票,你總會得到一個不那麼偏頗的結果。
降低方差:集合大量模型的參考結果,噪音會小於單個模型的單個結果。在金融領域,這被稱為投資分散原則(diversification)——一個混搭很多種股票的投資組合,比單獨的股票更少變故。
不太可能過度擬合:如果您有單個模型不完全擬合,您以簡單的方式(平均,加權平均,邏輯回歸)結合每個模型建模,那麼一般不會發生過擬合。
無監督學習
7. 聚類演算法:聚類是對一組對象進行分組的任務,使得同一組(集群)中的對象彼此之間比其他組中的對象更相似。
每個聚類演算法是不同的,比如:
基於Centroid的演算法
基於連接的演算法
基於密度的演算法
概率
降維
神經網路/深度學習
8. 主成分分析: PCA是使用正交變換將可能相關變數的觀察值轉換為主成分的線性不相關變數值的一組統計過程。
PCA的一些應用包括壓縮、簡化數據、便於學習、可視化。請注意,領域知識在選擇是否繼續使用PCA時非常重要。數據嘈雜的情況(PCA的所有組件都有很大差異)的情況不適用。
9.奇異值分解:在線性代數中,SVD是真正復雜矩陣的因式分解。對於給定的m * n矩陣M,存在分解,使得M =UΣV,其中U和V是酉矩陣,Σ是對角矩陣。
PCA實際上是SVD的簡單應用。在計算機視覺技術中,第一個人臉識別演算法使用PCA和SVD,以將面部表示為「特徵臉」的線性組合,進行降維,然後通過簡單的方法將面部匹配到身份;雖然這種方法更復雜,但仍然依賴於類似的技術。
10.獨立成分分析: ICA是一種統計技術,用於揭示隨機變數、測量或信號集合的隱藏因素。ICA定義了觀察到的多變數數據的生成模型,通常將其作為大型樣本資料庫
在模型中,假設數據變數是一些未知潛在變數的線性混合,混合系統也是未知的。潛變數被假定為非高斯和相互獨立的,它們被稱為觀測數據的獨立成分。
ICA與PCA相關,但它是一種更強大的技術,能夠在這些經典方法完全失敗時找到潛在的源因素。其應用包括數字圖像、文檔資料庫、經濟指標和心理測量。

2. 德雲系:擴展模塊的目標跟蹤演算法有哪些

你好,分為了以下四種:
1. KCF:TrackerKCF 使用目標周圍區域的循環矩陣採集正負樣本,利用脊回歸訓練目標檢測器,並成功的利用循環矩陣在傅里葉空間可對角化的性質將矩陣的運算轉化為向量的Hadamad積,即元素的點乘,大大降低了運算量,提高了運算速度,使演算法滿足實時性要求.
2.MIL:TrackerMIL 以在線方式訓練分類器將對象與背景分離;多實例學習避免魯棒跟蹤的漂移問題
3. OLB:TrackerBoosting 基於AdaBoost演算法的在線實時對象跟蹤.分類器在更新步驟中使用周圍背景作為反例以避免漂移問題.
4.MedianFlow:TrackerMedianFlow 跟蹤器適用於非常平滑和可預測的運動,物體在整個序列中可見.
5.TLD:TrackerTLD 將長期跟蹤任務分解為跟蹤,學習和檢測.跟蹤器在幀之間跟蹤對象.探測器本地化所觀察到的所有外觀,並在必要時糾正跟蹤器.學習估計檢測器的錯誤並進行更新以避免再出現這些錯誤.追蹤器能夠處理快速運動,部分遮擋,物體缺失等情況.

3. 計算機視覺中,目前有哪些經典的目標跟蹤演算法

第一章介紹運動的分類、計算機視覺領域中運動分析模型、計算機視覺領域運動檢測和目標跟蹤技術研究現狀、計算機視覺領域中運動分析技術的難點等內容;
第二章介紹傳統的運動檢測和目標跟蹤演算法,包括背景差分法、幀間差分法、光流場評估演算法等;
第三章介紹具有周期性運動特徵的低速目標運動檢測和跟蹤演算法,並以CCD測量系統為例介紹該演算法的應用;
第四章介紹高速運動目標識別和跟蹤演算法,並以激光通信十信標光捕獲和跟蹤系統為例介紹該演算法的應用;
第五章介紹具有復雜背景的目標運動檢測過程中採用的光流場演算法,包括正規化相關的特性及其改進光流場評估演算法,並介紹改進光流場演算法的具體應用;
第六章介紹互補投票法實現可信賴運動向量估計。

4. 目標跟蹤檢測演算法(一)——傳統方法

姓名:劉帆;學號:20021210609;學院:電子工程學院

https://blog.csdn.net/qq_34919792/article/details/89893214

【嵌牛導讀】目標跟蹤演算法研究難點與挑戰在於實際復雜的應用環境 、背景相似干擾、光照條件的變化、遮擋等外界因素以及目標姿態變化,外觀變形,尺度變化、平面外旋轉、平面內旋轉、出視野、快速運動和運動模糊等。而且當目標跟蹤演算法投入實際應用時,不可避免的一個問題——實時性問題也是非常的重要。正是有了這些問題,才使得演算法研究充滿著難點和挑戰。

【嵌牛鼻子】目標跟蹤演算法,傳統演算法

【嵌牛提問】利用目標跟蹤檢測演算法要達到何目的?第一階段的單目標追蹤演算法包括什麼?具體步驟有哪些?它們有何特點?

【嵌牛正文】

第一階段

目標跟蹤分為兩個部分,一個是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一個是對目標特徵進行跟蹤。

1、靜態背景

1)背景差: 對背景的光照變化、雜訊干擾以及周期性運動等進行建模。通過當前幀減去背景圖來捕獲運動物體的過程。

2)幀差: 由於場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類演算法對時間上連續的兩幀或三幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。

與二幀差分法不同的是,三幀差分法(交並運算)去除了重影現象,可以檢測出較為完整的物體。幀間差分法的原理簡單,計算量小,能夠快速檢測出場景中的運動目標。但幀間差分法檢測的目標不完整,內部含有「空洞」,這是因為運動目標在相鄰幀之間的位置變化緩慢,目標內部在不同幀圖像中相重疊的部分很難檢測出來。幀間差分法通常不單獨用在目標檢測中,往往與其它的檢測演算法結合使用。

3)Codebook

演算法為圖像中每一個像素點建立一個碼本,每個碼本可以包括多個碼元(對應閾值范圍),在學習階段,對當前像素點進行匹配,如果該像素值在某個碼元的學習閾值內,也就是說與之前出現過的某種歷史情況偏離不大,則認為該像素點符合背景特徵,需要更新對應點的學習閾值和檢測閾值。

如果新來的像素值與每個碼元都不匹配,則可能是由於動態背景導致,這種情況下,我們需要為其建立一個新的碼元。每個像素點通過對應多個碼元,來適應復雜的動態背景。

在應用時,每隔一段時間選擇K幀通過更新演算法建立CodeBook背景模型,並且刪除超過一段時間未使用的碼元。

4)GMM

混合高斯模型(Gaussian of Micture Models,GMM)是較常用的背景去除方法之一(其他的還有均值法、中值法、滑動平均濾波等)。

首先我們需要了解單核高斯濾波的演算法步驟:

混合高斯建模GMM(Gaussian Mixture Model)作為單核高斯背景建模的擴展,是目前使用最廣泛的一種方法,GMM將背景模型描述為多個分布,每個像素的R、G、B三個通道像素值的變化分別由一個混合高斯模型分布來刻畫,符合其中一個分布模型的像素即為背景像素。作為最常用的一種背景建模方法,GMM有很多改進版本,比如利用紋理復雜度來更新差分閾值,通過像素變化的劇烈程度來動態調整學習率等。

5)ViBe(2011)

ViBe演算法主要特點是隨機背景更新策略,這和GMM有很大不同。其步驟和GMM類似。具體的思想就是為每個像素點存儲了一個樣本集,樣本集中采樣值就是該像素點過去的像素值和其鄰居點的像素值,然後將每一個新的像素值和樣本集進行比較來判斷是否屬於背景點。

其中pt(x)為新幀的像素值,R為設定值,p1、p2、p3….為樣本集中的像素值,以pt(x)為圓心R為半徑的圓被認為成一個集,當樣本集與此集的交集大於設定的閾值#min時,可認為此為背景像素點(交集越大,表示新像素點與樣本集越相關)。我們可以通過改變#min的值與R的值來改變模型的靈敏度。

Step1:初始化單幀圖像中每個像素點的背景模型。假設每一個像素和其鄰域像素的像素值在空域上有相似的分布。基於這種假設,每一個像素模型都可以用其鄰域中的像素來表示。為了保證背景模型符合統計學規律,鄰域的范圍要足夠大。當輸入第一幀圖像時,即t=0時,像素的背景模型。其中,NG(x,y)表示空域上相鄰的像素值,f(xi,yi)表示當前點的像素值。在N次的初始化的過程中,NG(x,y)中的像素點(xi,yi)被選中的可能次數為L=1,2,3,…,N。

Step2:對後續的圖像序列進行前景目標分割操作。當t=k時,像素點(x,y)的背景模型為BKm(x,y),像素值為fk(x,y)。按照下面判斷該像素值是否為前景。這里上標r是隨機選的;T是預先設置好的閾值。當fk(x,y)滿足符合背景#N次時,我們認為像素點fk(x,y)為背景,否則為前景。

Step3:ViBe演算法的更新在時間和空間上都具有隨機性。每一個背景點有1/ φ的概率去更新自己的模型樣本值,同時也有1/ φ的概率去更新它的鄰居點的模型樣本值。更新鄰居的樣本值利用了像素值的空間傳播特性,背景模型逐漸向外擴散,這也有利於Ghost區域的更快的識別。同時當前景點計數達到臨界值時將其變為背景,並有1/ φ的概率去更新自己的模型樣本值(為了減少緩慢移動物體的影響和攝像機的抖動)。

可以有如下總結,ViBe中的每一個像素點在更新的時候都有一個時間和空間上隨機影響的范圍,這個范圍很小,大概3x3的樣子,這個是考慮到攝像頭抖動時會有坐標的輕微來回變化,這樣雖然由於ViBe的判別方式仍認為是背景點,但是也會對後面的判別產生影響,為了保證空間的連續性,隨機更新減少了這個影響。而在樣本值保留在樣本集中的概率隨著時間的增大而變小,這就保證了像素模型在時間上面的延續特性。

6)光流

光流是由物體或相機的運動引起的圖像對象在兩個連續幀之間的視在運動模式。它是2D矢量場,其中每個矢量是一個位移矢量,顯示點從第一幀到第二幀的移動。

光流實際上是一種特徵點跟蹤方法,其計算的為向量,基於三點假設:

1、場景中目標的像素在幀間運動時亮度(像素值或其衍生值)不發生變化;2、幀間位移不能太大;3、同一表面上的鄰近點都在做相同的運動;

光流跟蹤過程:1)對一個連續視頻幀序列進行處理;2)對每一幀進行前景目標檢測;3)對某一幀出現的前景目標,找出具有代表性的特徵點(Harris角點);4)對於前後幀做像素值比較,尋找上一幀在當前幀中的最佳位置,從而得到前景目標在當前幀中的位置信息;5)重復上述步驟,即可實現目標跟蹤

2、運動場(分為相機固定,但是視角變化和相機是運動的)

1)運動建模(如視覺里程計運動模型、速度運動模型等)

運動學是對進行剛性位移的相機進行構型,一般通過6個變數來描述,3個直角坐標,3個歐拉角(橫滾、俯仰、偏航)。

Ⅰ、對相機的運動建模

由於這個不是我們本次所要討論的重點,但是在《概率機器人》一書中提出了很多很好的方法,相機的運動需要對圖像內的像素做位移矩陣和旋轉矩陣的坐標換算。除了對相機建立傳統的速度運動模型外,也可以用視覺里程計等通關過置信度的更新來得到概率最大位置。

Ⅱ、對於跟蹤目標的運動建模

該方法需要提前通過先驗知識知道所跟蹤的目標對象是什麼,比如車輛、行人、人臉等。通過對要跟蹤的目標進行建模,然後再利用該模型來進行實際的跟蹤。該方法必須提前知道要跟蹤的目標對象是什麼,然後再去跟蹤指定的目標,這是它的局限性,因而其推廣性相對比較差。(比如已知跟蹤的物體是羽毛球,那很容易通過前幾幀的取點,來建立整個羽毛球運動的拋物線模型)

2)核心搜索演算法(常見的預測演算法有Kalman(卡爾曼)濾波、擴展卡爾曼濾波、粒子濾波)

Ⅰ、Kalman 濾波

Kalman濾波器是通過前一狀態預測當前狀態,並使用當前觀測狀態進行校正,從而保證輸出狀態平穩變化,可有效抵抗觀測誤差。因此在運動目標跟蹤中也被廣泛使用。

在視頻處理的運動目標跟蹤里,每個目標的狀態可表示為(x,y,w,h),x和y表示目標位置,w和h表示目標寬高。一般地認為目標的寬高是不變的,而其運動速度是勻速,那麼目標的狀態向量就應該擴展為(x,y,w,h,dx,dy),其中dx和dy是目標當前時刻的速度。通過kalman濾波器來估計每個時刻目標狀態的大致過程為:

對視頻進行運動目標檢測,通過簡單匹配方法來給出目標的第一個和第二個狀態,從第三個狀態開始,就先使用kalman濾波器預測出當前狀態,再用當前幀圖像的檢測結果作為觀測值輸入給kalman濾波器,得到的校正結果就被認為是目標在當前幀的真實狀態。(其中,Zt為測量值,為預測值,ut為控制量,Kt為增益。)

Ⅱ、擴展卡爾曼濾波(EKF)和無跡卡爾曼濾波(UKF)

由於卡爾曼濾波的假設為線性問題,無法直接用在非線性問題上,EKF和UKF解決了這個問題(這個線性問題體現在用測量量來計算預測量的過程中)。EKF是通過構建線性函數g(x),與非線性函數相切,並對每一時刻所求得的g(x)做KF,如下圖所示。

UKF與EKF去求解雅可比矩陣擬合線性方程的方法不同,通過對那個先驗分布中的採集點,來線性化隨機變數的非線性函數。與EKF所用的方法不同,UKF產生的高斯分布和實際高斯分布更加接近,其引起的近似誤差也更小。

Ⅲ、粒子濾波

1、初始狀態:基於粒子濾波的目標追蹤方法是一種生成式跟蹤方法,所以要有一個初始化的階段。對於第一幀圖像,人工標定出待檢測的目標,對該目標區域提出特徵;

2、搜索階段:現在已經知道了目標的特徵,然後就在目標的周圍撒點(particle), 如:a)均勻的撒點;b)按高斯分布撒點,就是近的地方撒得多,遠的地方撒的少。論文里使用的是後一種方法。每一個粒子都計算所在區域內的顏色直方圖,如初始化提取特徵一樣,然後對所有的相似度進行歸一化。文中相似性使用的是巴氏距離;

3、重采樣:根據粒子權重對粒子進行篩選,篩選過程中,既要大量保留權重大的粒子,又要有一小部分權重小的粒子;

4、狀態轉移:將重采樣後的粒子帶入狀態轉移方程得到新的預測粒子;

5、測量及更新:對目標點特徵化,並計算各個粒子和目標間的巴氏距離,更新粒子的權重;

6、決策階段:每個粒子都獲得一個和目標的相似度,相似度越高,目標在該范圍出現的可能性越高,將保留的所有粒子通過相似度加權後的結果作為目標可能的位置。

3)Meanshift演算法

MeanShift演算法屬於核密度估計法,它不需要任何先驗知識而完全依靠特徵空間中樣本點的計算其密度函數值。對於一組采樣數據,直方圖法通常把數據的值域分成若干相等的區間,數據按區間分成若干組,每組數據的個數與總參數個數的比率就是每個單元的概率值;核密度估計法的原理相似於直方圖法,只是多了一個用於平滑數據的核函數。採用核函數估計法,在采樣充分的情況下,能夠漸進地收斂於任意的密度函數,即可以對服從任何分布的數據進行密度估計。

Meanshift演算法步驟

1、通過對初始點(或者上一幀的目標點)為圓心,繪制一個半徑為R的圓心,尋找特徵和該點相似的點所構成的向量;

2、所有向量相加,可以獲得一個向量疊加,這個向量指向特徵點多的方向;

3、取步驟二的向量終點為初始點重復步驟一、二,直到得到的向量小於一定的閾值,也就是說明當前位置是特徵點密度最密集的地方,停止迭代,認為該點為當前幀的目標點;

4)Camshift演算法

Camshift演算法是MeanShift演算法的改進,稱為連續自適應的MeanShift演算法。Camshift 是由Meanshift 推導而來 Meanshift主要是用在單張影像上,但是獨立一張影像分析對追蹤而言並無意義,Camshift 就是利用MeanShift的方法,對影像串列進行分析。

1、首先在影像串列中選擇目標區域。

2、計算此區域的顏色直方圖(特徵提取)。

3、用MeanShift演演算法來收斂欲追蹤的區域。

4、通過目標點的位置和向量信息計算新的窗口大小,並標示之。

5、以此為參數重復步驟三、四。

Camshift 關鍵就在於當目標的大小發生改變的時候,此演算法可以自適應調整目標區域繼續跟蹤。

3、小結

第一階段的單目標追蹤演算法基本上都是傳統方法,計算量小,在嵌入式等設備中落地較多,opencv中也預留了大量的介面。通過上面的兩節的介紹,我們不難發現,目標檢測演算法的步驟分為兩部分,一部分是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一部分是對目標特徵進行跟蹤,如上文所提及的方法。所以目標檢測方法的發展,也可總結為兩個方面,一個是如何去獲得更加具有區分性的可跟蹤的穩定特徵,另一個是如何建立幀與幀之間的數據關聯,保證跟蹤目標是正確的。

隨著以概率為基礎的卡爾曼濾波、粒子濾波或是以Meanshift為代表向量疊加方法在目標檢測的運用,使得目標檢測不再需要假設自身的一個狀態為靜止的,而是可以是運動的,更加符合復雜場景中的目標跟蹤。

5. 無人機視頻全景拼接,移動物體檢測和追蹤

近年來,無人駕駛飛行器(UAV)在許多領域得到越來越廣泛的應用。通過無人機航拍視頻,可以方便地獲取更多的靜態和動態信息,掌握現場情況。幀配准、全景圖像拼接、運動目標檢測和跟蹤是航拍視頻分析處理的關鍵和基礎。首先,我們使用 l_q-estimation 方法去除異常值並穩健地匹配特徵點。然後我們利用移動直接線性變換 (MDLT) 方法更准確地找到幀的單應性,並將幀序列拼接成全景圖。最後,我們在扭曲的幀上應用 5 幀差分方法來檢測運動對象,並使用長期視覺跟蹤方法在復雜場景中跟蹤感興趣的對象。

與有人駕駛飛機相比,無人機更小、更輕、更便宜,更適合執行危險任務。搭載視覺感測器的小型無人機是反恐、交通監控、救災、戰場監視等的理想平台。全景圖像拼接、運動物體檢測和跟蹤是完成這些任務的關鍵技術。由於平台的運動,除了前景物體外,背景也在運動,因此背景的運動補償是無人機航拍視頻分析處理的必要步驟。背景運動補償模塊接收後對視頻幀進行注冊並生成相應的對齊圖像,可以將幀序列拼接在一起以生成全景圖以掌握整體信息。此外,可碧辯悄以通過幀減法檢測運動物體,並通過跟蹤模塊跟蹤感興趣的物體。在本文中,我們首先提取相鄰幀的 Harris 特徵,然後介紹一種基於異常值去除和穩健特徵匹配的 - 估計器,之後,利用 MDLT 方法找到幀的單應性。根據單應性,幀被注冊並補償平台的自我運動,並且全景由幀序列拼接。最後,使用5幀減法完成運動物體檢測,並通過基於相關濾波器的視覺跟蹤演算法跟蹤感興趣的物體。

圖像配準是悔渣利用匹配策略在兩幅圖像中找到對應特徵點的正確位置,然後得到兩幅圖像之間的單應性進行配准。本文的圖像配准演算法包括幾個部分:Harris特徵點的提取和描述,用於穩健特徵匹配的 - 估計器,用於估計單應性的 MDLT 方法。首先從兩幅圖像中提取和描述特徵點,得到匹配點,然後去除離群點,對特徵進行魯棒匹配 - 估計器。最後,我們使用MDLT方法對滿足圖像不同部分的單應性進行加權估計,得到准確的投影模型參數來配准圖像幀。

對於要匹配的圖像對,我們執行Harris等特徵匹配方法來確定N個初始匹配對應關系:

其中 , 是匹配特徵點的二維坐標, 如果是內點,則滿足以下關系:

變換 可用 對內點匹配對最小二乘估計:

但這些點可能存在異常值,應去除異常值以正確估計變換。目前的方法通常使用兩步策略或假設和驗證技術(如RANSAC)來解決問題,這些方法總是非常耗時甚至無法得到合理的結果。

基於魯棒性的特徵匹配方法 -估計器直接估計與異常值的初始對應關系的轉換。為了將殘差向量自動分類為異常值集和內部值集,經典最小二乘損失函數對異常值敏感。 范數適合解決這樣的問題,但由於觀察中包含雜訊,因此不可靠。通常情況下 范數被改編為最接近的凸松灶鎮弛 正則化進行權衡。 估計器對於特徵匹配更加健壯和有效。損失函數是

其中 是 范數的操作符。

將通過對初始特徵點應用全局變換來去除異常值。

對於低空航拍視頻,幀之間的視圖不完全因旋轉不同,也不完全是平面場景,使用基本單應扭曲不可避免地會產生錯位或視差錯誤。Julio Zaragoza等提出的APAP(As-Projective-As-Possible)圖像拼接方法假設圖像的細節滿足不同的單應性,並使用位置相關單應性來扭曲每個像素,使用MDLT加權估計單應性方法,可以減輕未對准和視差誤差的影響。

直接線性變換(DLT)是從一組雜訊點匹配中估計單應性的基本方法。將單應矩陣向量化為向量後,只有兩行線性無關,令 為第 個點匹配計算的 LHS 矩陣的前兩行。對所有 垂直堆疊 到矩陣A。

那麼優化目標是

整個圖像只使用一個單應性重建 用於翹曲。

通過從加權問題估計單應性來改進MDLT方法,

權重 給更接近 的第 個點匹配給予更高的重要性。

為了防止估計中的數值問題,他們用一個在0和1之間的小值 來抵消權重。

計算每個像素的單應性是不必要的浪費。因此,我們將圖像均勻地劃分為多個單元格的網格,並將每個單元格的中心作為 。

將航拍視頻幀全景拼接後,就可以得到大尺度場景的靜態圖像,掌握整體信息。

首先,我們使用單應性扭曲要拼接的兩個幀,將像素映射到全景中的位置,依次拼接幀,然後融合兩個扭曲的圖像以避免在接縫線附近出現正面差異。通常,相鄰幀的重疊率,在實際應用中,我們根據移動速度選擇一定時間間隔的幀進行拼接,可以降低計算復雜度。對於較早的拼接圖像,我們只選擇最後一幀而不是整個拼接圖像來提取特徵點,也是為了計算速度。

對於對齊的幀,採用改進的5幀差分法檢測運動目標。傳統的3幀差分法可以檢測出物體的基本輪廓,但輪廓總是不連續的,物體的重疊不易檢測。根據幀差分法的理論,通過多幀差分的信息融合可以用於提取更完整的運動對象。5幀差分法可以部分克服3幀差分法的不足。對於相鄰的 5 個幀 ,我們首先使用中值濾波器去除椒鹽雜訊,然後分別對中間幀和其他4幀進行差分運算。結果如下:

在對差分結果進行濾波後,我們引入Otsu動態閾值分割方法獲得二值圖像,然後使用「與」操作來抑制對象重疊問題。

然後我們在 和 上使用「或」操作以避免在對象輪廓中帶來孔洞。

二值圖像也可能有雜訊和小孔,這可能會導致錯誤的對象邊界框。最後,可以通過形態學腐蝕和膨脹來掩蓋運動物體區域,去除雜訊並填充孔洞,從而獲得物體的位置和尺度。

運動物體檢測步驟會檢測到多個物體區域,我們只選擇一個感興趣的目標,使用基於相關濾波器的長期視覺跟蹤演算法對所選物體進行跟蹤,以獲得目標的位置和尺度。實時對象。跟蹤器由檢測操作中檢測到的邊界框初始化。

基於相關濾波器的長期視覺跟蹤演算法在核相關濾波器跟蹤器的框架下,集成了定向梯度直方圖、顏色命名和強度,創建了魯棒的對象外觀模型。在隨後的幀中,可以通過分別最大化平移濾波器和尺度濾波器的相關性分數來估計對象的新位置和尺度,並通過新的位置和尺度更新濾波器。同時,我們實時檢測跟蹤狀態,並在跟蹤失敗的情況下使用在線CUR過濾器重新檢測對象。該演算法對於長期視覺跟蹤的復雜場景具有魯棒性。跟蹤流程圖如圖1所示。

實驗中的數據集選自DARPA提出的身份視頻驗證(VIVID)公共數據集中的航拍視頻數據。這些數據集包括紋理較少和紋理良好的視頻的背景。我們為我們的實驗選擇了兩個典型的視頻egtest01和egtest05。解析度為640x480,幀率為30fps。實驗在MATLAB R2016a 中實現,在 Intel Core i5-7300HQ、2.5GHz CPU、8GB RAM 計算機上。

我們首先提取待配準的2幀中的Harris特徵,利用描述符的歐氏距離進行粗匹配,然後使用 估計方法來去除異常值。最終匹配結果如圖2所示。

從圖2可以看出,無論是在紋理較少還是紋理良好的背景場景中,特徵點都是均勻分布的,並且點主要集中在背景中,這有助於獲得准確的配准結果。

我們使用MDLT方法根據匹配的特徵點獲得2幀的變換,然後對圖像進行扭曲,對參考圖像和扭曲圖像進行拼接和融合。最後,將幀依次拼接在一起,得到如圖3所示的全景圖。

幀配准後,我們使用5幀差分法得到差分結果,然後去除細方雜訊,做形態學運算得到物體區域,最後可以得到運動物體的位置和尺度區域的邊界框,如圖4所示。

跟蹤演算法可以在完全遮擋或視野外的情況下更新對象的比例並重新檢測丟失的對象。圖 5顯示了不同幀中的跟蹤結果。

我們已經開發了一些基於小型無人機平台的航空偵察關鍵圖像處理演算法的實現。演算法包括注冊視頻幀,使用幀差異進行運動物體檢測,將幀拼接成全景圖,跟蹤檢測到的物體之一。實驗結果表明,所提出的方法在紋理較少的背景和紋理良好的背景場景中都可以很好地進行配准、拼接、檢測,以及在復雜場景中進行跟蹤。

6. 如何使用opencv實現金字塔光流lk跟蹤演算法

#include <stdio.h>
#include <windows.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <opencv2\opencv.hpp>
using namespace cv;

static const double pi = 3.14159265358979323846;
inline static double square(int a)
{
return a * a;
}
/*該函數目的:給img分配內存空間,並設定format,如位深以及channel數*/
inline static void allocateOnDemand(IplImage **img, CvSize size, int depth, int channels)
{
if (*img != NULL) return;
*img = cvCreateImage(size, depth, channels);
if (*img == NULL)
{
fprintf(stderr, "Error: Couldn't allocate image. Out of memory?\n");
exit(-1);
}
}
/*主函數,原程序是讀取avi視頻文件,然後處理,我簡單改成從攝像頭直接讀取數據*/
int main(int argc, char *argv[])
{

//讀取攝像頭
VideoCapture cap(0);
//讀取視頻文件

//VideoCapture cap; cap.open("optical_flow_input.avi");
if (!cap.isOpened())
{
return -1;
}
Mat frame;

/*
bool stop = false;
while (!stop)
{
cap >> frame;
// cvtColor(frame, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
// imshow("當前視頻", edges);
imshow("當前視頻", frame);
if (waitKey(30) >= 0)
stop = true;
}
*/

//CvCapture *input_video = cvCaptureFromFile( "optical_flow_input.avi" );
//cv::VideoCapture cap = *(cv::VideoCapture *) userdata;

//if (input_video == NULL)
// {
// fprintf(stderr, "Error: Can't open video device.\n");
// return -1;
// }

/*先讀取一幀,以便得到幀的屬性,如長、寬等*/
//cvQueryFrame(input_video);

/*讀取幀的屬性*/
CvSize frame_size;
frame_size.height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
frame_size.width = cap.get(CV_CAP_PROP_FRAME_WIDTH);

/*********************************************************/

/*用於把結果寫到文件中去,非必要
int frameW = frame_size.height; // 744 for firewire cameras
int frameH = frame_size.width; // 480 for firewire cameras
VideoWriter writer("VideoTest.avi", -1, 25.0, cvSize(frameW, frameH), true);

/*開始光流法*/
//VideoWriter writer("VideoTest.avi", CV_FOURCC('D', 'I', 'V', 'X'), 25.0, Size(640, 480), true);

while (true)
{
static IplImage *frame = NULL, *frame1 = NULL, *frame1_1C = NULL,
*frame2_1C = NULL, *eig_image = NULL, *temp_image = NULL,
*pyramid1 = NULL, *pyramid2 = NULL;

Mat framet;
/*獲取第一幀*/
// cap >> framet;
cap.read(framet);
Mat edges;
//黑白抽象濾鏡模式
// cvtColor(framet, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);

//轉換mat格式到lpiimage格式
frame = &IplImage(framet);
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

/*由於opencv的光流函數處理的是8位的灰度圖,所以需要創建一個同樣格式的
IplImage的對象*/
allocateOnDemand(&frame1_1C, frame_size, IPL_DEPTH_8U, 1);

/* 把攝像頭圖像格式轉換成OpenCV慣常處理的圖像格式*/
cvConvertImage(frame, frame1_1C, 0);

/* 我們需要把具有全部顏色信息的原幀保存,以備最後在屏幕上顯示用*/
allocateOnDemand(&frame1, frame_size, IPL_DEPTH_8U, 3);
cvConvertImage(frame, frame1, 0);

/* 獲取第二幀 */
//cap >> framet;
cap.read(framet);
// cvtColor(framet, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
frame = &IplImage(framet);
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

/*原理同上*/
allocateOnDemand(&frame2_1C, frame_size, IPL_DEPTH_8U, 1);
cvConvertImage(frame, frame2_1C, 0);

/*********************************************************
開始shi-Tomasi演算法,該演算法主要用於feature selection,即一張圖中哪些是我
們感興趣需要跟蹤的點(interest point)
input:
* "frame1_1C" 輸入圖像.
* "eig_image" and "temp_image" 只是給該演算法提供可操作的內存區域.
* 第一個".01" 規定了特徵值的最小質量,因為該演算法要得到好的特徵點,哪就
需要一個選擇的閾值
* 第二個".01" 規定了像素之間最小的距離,用於減少運算復雜度,當然也一定
程度降低了跟蹤精度
* "NULL" 意味著處理整張圖片,當然你也可以指定一塊區域
output:
* "frame1_features" 將會包含fram1的特徵值
* "number_of_features" 將在該函數中自動填充上所找到特徵值的真實數目,
該值<= 400
**********************************************************/

/*開始准備該演算法需要的輸入*/

/* 給eig_image,temp_image分配空間*/
allocateOnDemand(&eig_image, frame_size, IPL_DEPTH_32F, 1);
allocateOnDemand(&temp_image, frame_size, IPL_DEPTH_32F, 1);

/* 定義存放frame1特徵值的數組,400隻是定義一個上限 */
CvPoint2D32f frame1_features[400];
int number_of_features = 400;

/*開始跑shi-tomasi函數*/
cvGoodFeaturesToTrack(frame1_1C, eig_image, temp_image,
frame1_features, &number_of_features, .01, .01, NULL);

/**********************************************************
開始金字塔Lucas Kanade光流法,該演算法主要用於feature tracking,即是算出
光流,並跟蹤目標。
input:
* "frame1_1C" 輸入圖像,即8位灰色的第一幀
* "frame2_1C" 第二幀,我們要在其上找出第一幀我們發現的特徵點在第二幀
的什麼位置
* "pyramid1" and "pyramid2" 是提供給該演算法可操作的內存區域,計算中間
數據
* "frame1_features" 由shi-tomasi演算法得到的第一幀的特徵點.
* "number_of_features" 第一幀特徵點的數目
* "optical_flow_termination_criteria" 該演算法中迭代終止的判別,這里是
epsilon<0.3,epsilon是兩幀中對應特徵窗口的光度之差的平方,這個以後的文
章會講
* "0" 這個我不知道啥意思,反正改成1就出不來光流了,就用作者原話解釋把
means disable enhancements. (For example, the second array isn't
pre-initialized with guesses.)
output:
* "frame2_features" 根據第一幀的特徵點,在第二幀上所找到的對應點
* "optical_flow_window" lucas-kanade光流演算法的運算窗口,具體lucas-kanade
會在下一篇詳述
* "5" 指示最大的金字塔層數,0表示只有一層,那就是沒用金字塔演算法
* "optical_flow_found_feature" 用於指示在第二幀中是否找到對應特徵值,
若找到,其值為非零
* "optical_flow_feature_error" 用於存放光流誤差
**********************************************************/

/*開始為pyramid lucas kanade光流演算法輸入做准備*/
CvPoint2D32f frame2_features[400];

/* 該數組相應位置的值為非零,如果frame1中的特徵值在frame2中找到 */
char optical_flow_found_feature[400];

/* 數組第i個元素表對應點光流誤差*/
float optical_flow_feature_error[400];

/*lucas-kanade光流法運算窗口,這里取3*3的窗口,可以嘗試下5*5,區別就是5*5
出現aperture problem的幾率較小,3*3運算量小,對於feature selection即shi-tomasi演算法來說足夠了*/
CvSize optical_flow_window = cvSize(5, 5);
// CvSize optical_flow_window = cvSize(5, 5);
/* 終止規則,當完成20次迭代或者當epsilon<=0.3,迭代終止,可以嘗試下別的值*/
CvTermCriteria optical_flow_termination_criteria= cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3);

/*分配工作區域*/
allocateOnDemand(&pyramid1, frame_size, IPL_DEPTH_8U, 1);
allocateOnDemand(&pyramid2, frame_size, IPL_DEPTH_8U, 1);

/*開始跑該演算法*/
cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2,frame1_features, frame2_features, number_of_features,
optical_flow_window, 5, optical_flow_found_feature,optical_flow_feature_error, optical_flow_termination_criteria, 0);

/*畫光流場,畫圖是依據兩幀對應的特徵值,
這個特徵值就是圖像上我們感興趣的點,如邊緣上的點P(x,y)*/
for (int i = 0; i< number_of_features; i++)
{
/* 如果沒找到對應特徵點 */
if (optical_flow_found_feature[i] == 0)
continue;
int line_thickness;
line_thickness = 1;

/* CV_RGB(red, green, blue) is the red, green, and blue components
* of the color you want, each out of 255.
*/
CvScalar line_color;
line_color = CV_RGB(255, 0, 0);

/*畫箭頭,因為幀間的運動很小,所以需要縮放,不然看不見箭頭,縮放因子為3*/
CvPoint p, q;
p.x = (int)frame1_features[i].x;
p.y = (int)frame1_features[i].y;
q.x = (int)frame2_features[i].x;
q.y = (int)frame2_features[i].y;

double angle;
angle = atan2((double)p.y - q.y, (double)p.x - q.x);
double hypotenuse;
hypotenuse = sqrt(square(p.y - q.y) + square(p.x - q.x));

/*執行縮放*/
q.x = (int)(p.x - 5 * hypotenuse * cos(angle));
q.y = (int)(p.y - 5 * hypotenuse * sin(angle));

/*畫箭頭主線*/
/* "frame1"要在frame1上作畫.
* "p" 線的開始點.
* "q" 線的終止點.
* "CV_AA" 反鋸齒.
* "0" 沒有小數位.
*/
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);

/* 畫箭的頭部*/
p.x = (int)(q.x + 9 * cos(angle + pi / 4));
p.y = (int)(q.y + 9 * sin(angle + pi / 4));
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
p.x = (int)(q.x + 9 * cos(angle - pi / 4));
p.y = (int)(q.y + 9 * sin(angle - pi / 4));
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
}
/*顯示圖像*/

/*創建一個名為optical flow的窗口,大小自動改變*/
cvNamedWindow("Optical Flow", CV_WINDOW_NORMAL);
cvFlip(frame1, NULL, 2);
cvShowImage("Optical Flow", frame1);

/*延時,要不放不了*/
cvWaitKey(33);

/*寫入到文件中去*/

// cv::Mat m = cv::cvarrToMat(frame1);//轉換lpimgae到mat格式
// writer << m;//opencv3.0 version writer

}
cap.release();
cvWaitKey(33);
system("pause");
}

7. 無人駕駛(三)行人跟蹤演算法

姓名:王夢妮

學號:20021210873

學院:電子工程學院

【嵌牛導讀】本文主要介紹了無人駕駛中所需的行人跟蹤演算法

【嵌牛鼻子】無人駕駛 環境感知 計算機視覺 卡爾曼濾波 粒子濾波 均值漂移

【嵌牛提問】無人駕駛中所用到的行人跟蹤演算法有哪些

【嵌牛正文】

行人跟蹤一直是視覺領域的一個難點,實際應用環境復雜、遮擋以及行人姿態變化等外界因素都影響著行人跟蹤演算法的研究。行人跟蹤演算法模型主要分為生成模型和判別模型。

(一)生成式模型

生成式模型是一種通過在線學習行人目標特徵,建立行人跟蹤模型,然後使用模型來搜索誤差最小的目標區域,從而完成對行人的跟蹤。這種演算法在構建模型只考慮了行人本身的特徵,忽略了背景信息,沒有做到有效利用圖像中的全部信息。其中比較經典的演算法主要有卡爾曼濾波,粒子濾波,mean-shift等。

(1)卡爾曼濾波演算法

卡爾曼濾波演算法是一種通過對行人構建狀態方程和觀測方程為基礎,計算最小均方誤差來實現跟蹤的最優線性遞歸濾波演算法,通過遞歸行人的運動狀態來預測行人軌跡的變化。

首先設定初始參數,讀取視頻序列。然後進行背景估計,產生初始化背景圖像。然後依次讀取視頻序列,利用Kahnan濾波演算法,根據上一幀估計的背景和當前幀數據得到當前幀的前景目標。然後對前景目標進行連通計算,檢測出運動目標的軌跡。經典的卡爾曼濾波演算法.只能對線性運動的行人實現跟蹤,之後學者改進了卡爾曼濾波演算法,能夠實現對非線性運動的行人進行跟蹤,計算量小,能實現實時跟蹤,但是跟蹤效果不理想。

(2)粒子濾波

    粒子濾波的核心就是貝葉斯推理和重要性采樣。粒子濾波可用於非線性非高斯模型,這是由於貝葉斯推理採用蒙特卡洛法,以某個時間點事件出現的頻率表示其概率。通過一組粒子對整個模型的後驗概率分布進行近似的表示,通過這個表示來估計整個非線性非高斯系統的狀態。重要性採用就是通過粒子的置信度來賦予不同的權重,置信度高的粒子,賦予較大的權重,通過權重的分布形式表示相似程度。

(3)均值漂移(mean-shift)

    Mean-shift演算法屬於核密度估計法。不必知道先驗概率,密度函數值由采樣點的特徵空間計算。通過計算當前幀目標區域的像素特徵值概率來描述目標模型,並對候選區域進行統一描述,使用相似的函數表示目標模型與候選模板之間的相似度,然後選擇在具有相似函數值最大的候選模型中,您將獲得關於目標模型的均值漂移向量,該向量表示目標從當前位置移動到下一個位置的向量。通過連續迭代地計算均值偏移矢量,行人跟蹤演算法將最終收斂到行人的實際位置,從而實現行人跟蹤。

(二) 判別式模型

判別模型與生成模型不同,行人跟蹤被視為二分類問題。提取圖像中的行人和背景信息,並用於訓練分類器。通過分類將行人從圖像背景中分離出來,以獲取行人的當前位置。以行人區域為正樣本,背景區域為負樣本,通過機器學習演算法對正樣本和負樣本進行訓練,訓練後的分類器用於在下一幀中找到相似度最高的區域,以完成行人軌跡更新。判別式模型不像生成式模型僅僅利用了行人的信息,還利用了背景信息,因此判別式模型的跟蹤效果普遍優於生成式模型。

(1)基於相關濾波的跟蹤演算法

      核相關濾波(KCF)演算法是基於相關濾波的經典跟蹤演算法,具有優良的跟蹤效果和跟蹤速度。這是由於其採用了循環移位的方式來進行樣本生產,用生成的樣本來訓練分類器,通過高斯核函數來計算當前幀行人與下一幀中所有候選目標之間的相似概率圖,找到相似概率圖最大的那個候選目標,就得到了行人的新位置。KCF演算法為了提高跟蹤精度,使用HOG特徵對行人進行描述,同時結合了離散傅里葉變換來降低計算量。

(2)基於深度學習的跟蹤演算法

    近年來,深度學習在圖像和語音方面取得了較大的成果,因此有許多科研人員將深度學習與行人跟蹤相結合,取得了比傳統跟蹤演算法更好的性能。DLT就是一個基於深度學習的行人跟蹤演算法,利用深度模型自動編碼器通過離線訓練的方式,在大規模行人數據集上得到一個行人模型,然後在線對行人進行跟蹤來微調模型。首先通過粒子濾波獲取候選行人目標,然後利用自動編碼器進行預測,最終得到行人的預測位置即最大輸出值的候選行人目標位置。2015年提出的MDNet演算法採用了分域訓練的方式。對於每個類別,一個單獨的全連接層用於分類,並且全連接層前面的所有層都是共享,用於特徵提取。2017年提出的HCFT演算法使用深度學習對大量標定數據進行訓練,得到強有力的特徵表達模型,結合基於相關濾波的跟蹤演算法,用於解決在線進行跟蹤過程中行人樣本少、網路訓練不充分的問題。此外,通過深度學習提取特徵,利用數據關聯的方法來實現跟蹤的演算法,其中最為著名的就JPDAF與MHT這兩種方法。

熱點內容
網站緩存設置 發布:2024-03-29 19:47:20 瀏覽:798
在jsp中使用資料庫 發布:2024-03-29 19:29:01 瀏覽:786
dns伺服器江川區ip地址 發布:2024-03-29 18:47:53 瀏覽:328
sql統計百分比 發布:2024-03-29 18:47:14 瀏覽:692
javatoolsfor 發布:2024-03-29 18:17:55 瀏覽:900
linuxi2c驅動 發布:2024-03-29 18:09:56 瀏覽:672
junit源碼下載 發布:2024-03-29 18:00:10 瀏覽:526
本田雅閣壓縮機不工作 發布:2024-03-29 17:59:13 瀏覽:601
溯源碼可以偽造嗎 發布:2024-03-29 17:54:45 瀏覽:57
北京編程傳 發布:2024-03-29 17:54:44 瀏覽:436