1. 程式人生 > >目標跟蹤-粒子濾波演算法

目標跟蹤-粒子濾波演算法

http://blog.csdn.net/hujingshuang/article/details/45535423

前言:

粒子濾波廣泛的應用於目標跟蹤,粒子濾波器是一種序列蒙特卡羅濾波方法,其實質是利用一系列隨機抽取的樣本(即粒子)來替代狀態的後驗概率分佈。在此不打算介紹和推理繁雜的概率公式,我們來分析Rob Hess原始碼從而深入理解粒子濾波演算法

試驗平臺:

VS2010 + opencv2.4.10 + gsl1.8庫 + RobHess粒子濾波原始碼

相關資料:

下載 yangyangcv提供的程式碼,配置好後即可使用;本博文也提供下載,見文章末尾

原始碼分析:

下面用粒子濾波演算法來實現單目標的跟蹤,在初始時需要手動選取待跟蹤目標區域。

步驟一:粒子初始化

1、目標的選取:

在起始幀畫面中標記待跟蹤的區域(目標物體),在以後的連續幀視訊中跟蹤目標物體。

2、粒子的定義:

粒子即樣本,Rob Hess原始碼中預設粒子數目PARTICLES=100,下面是粒子的屬性(可以看出一個粒子代表的就是一個矩形區域):

  1. typedefstruct particle {  
  2.   float x;          /**< 當前x座標 */
  3.   float y;          /**< 當前y座標 */
  4.   float s;          /**< scale */
  5.   float xp;         /**< 之前x座標 */
  6.   float yp;         /**< 之前y座標 */
  7.   float sp;         /**< previous scale */
  8.   float x0;         /**< x0 */
  9.   float y0;         /**< y0 */
  10.   int width;        /**< 粒子寬度 */
  11.   int height;       /**< 粒子高度 */
  12.   histogram* histo; /**< 跟蹤區域的參考直方圖 */
  13.   float w;          /**< 權重 */
  14. } particle;  

3、特徵提取:

目標跟蹤最重要的就是特徵,應該選取好的特徵(擁有各種不變性的特徵當然是最好的);另外考慮演算法的效率,目標跟蹤一般是實時跟蹤,所以對演算法實時性有一定的要求。Rob Hess原始碼提取的是目標的顏色特徵(顏色特徵對影象本身的尺寸、方向、視角的依賴性較小,從而具有較高的魯棒性),粒子與目標的直方圖越相似,則說明越有可能是目標。

捕捉到一幀影象,標記待跟蹤的區域,將其從BGR轉化到HSV空間,提取感興趣部分(目標)的HSV,進行直方圖統計並歸一化直方圖

  1. /* increment appropriate histogram bin for each pixel */
  2. //計算直方圖
  3. for( r = 0; r < img->height; r++ )  
  4.     for( c = 0; c < img->width; c++ )  
  5.     {  
  6.         bin = histo_bin( /*pixval32f( h, r, c )*/((float*)(h->imageData + h->widthStep*r) )[c],  
  7.                     ((float*)(s->imageData + s->widthStep*r) )[c],  
  8.                     ((float*)(v->imageData + v->widthStep*r) )[c] );  
  9.         hist[bin] += 1;  
  10.     }  


  1. int histo_bin( float h, float s, float v )  
  2. {  
  3.   int hd, sd, vd;  
  4.   /* if S or V is less than its threshold, return a "colorless" bin */
  5.   vd = MIN( (int)(v * NV / V_MAX), NV-1 );  
  6.   if( s < S_THRESH  ||  v < V_THRESH )  
  7.     return NH * NS + vd;  
  8.   /* otherwise determine "colorful" bin */
  9.   hd = MIN( (int)(h * NH / H_MAX), NH-1 );  
  10.   sd = MIN( (int)(s * NS / S_MAX), NS-1 );  
  11.   return sd * NH + hd;  
  12. }  
img是目標矩形區域,h、s、v是個分量,hist就是直方圖統計;NV、V_MAX....等是巨集定義的固定值。
  1. void normalize_histogram( histogram* histo )//直方圖歸一化
  2. {  
  3.   float* hist;  
  4.   float sum = 0, inv_sum;  
  5.   int i, n;  
  6.   hist = histo->histo;  
  7.   n = histo->n;  
  8.   /* compute sum of all bins and multiply each bin by the sum's inverse */
  9.   for( i = 0; i < n; i++ )  
  10.     sum += hist[i];  
  11.   inv_sum = 1.0 / sum;  
  12.   for( i = 0; i < n; i++ )  
  13.     hist[i] *= inv_sum;  
  14. }  

4、粒子初始化

根據選定的目標區域來初始化粒子,初始時所有粒子都為等權重,具有同樣的屬性。

  1. /* create particles at the centers of each of n regions */
  2. for( i = 0; i < n; i++ )  
  3. {  
  4.     width = regions[i].width;  
  5.     height = regions[i].height;  
  6.     x = regions[i].x + width / 2;<span style="white-space:pre">   </span>//粒子中心
  7.     y = regions[i].y + height / 2;  
  8.     for( j = 0; j < np; j++ )  
  9.     {  
  10.         particles[k].x0 = particles[k].xp = particles[k].x = x;  
  11.         particles[k].y0 = particles[k].yp = particles[k].y = y;  
  12.         particles[k].sp = particles[k].s = 1.0;  
  13.         particles[k].width = width;  
  14.         particles[k].height = height;  
  15.         particles[k].histo = histos[i];  
  16.         particles[k++].w = 0;  
  17.     }  
  18. }  

步驟二、粒子相似度搜索、計算

5、粒子搜尋

在步驟一中,初始化了100個粒子,由於初始幀中指定了目標區域,而該目標會在下一幀中發生偏移,但是相鄰幀目標移動得不是太遠,所以在目標區域附近隨機撒出100個粒子。(此處使用的是二階動態迴歸來估計偏移後的粒子位置)

  1. particle transition( particle p, int w, int h, gsl_rng* rng )//隨機撒出一個粒子
  2. {  
  3.   float x, y, s;  
  4.   particle pn;  
  5.   //迴歸模型的引數即A1、A2、B0等Rob Hess在程式碼中已設定(我不知道是怎麼來的?)
  6.   /* sample new state using second-order autoregressive dynamics (使用二階動態迴歸來自動更新粒子狀態)*/
  7.   x = A1 * ( p.x - p.x0 ) + A2 * ( p.xp - p.x0 ) +  
  8.     B0 * gsl_ran_gaussian( rng, TRANS_X_STD ) + p.x0;  
  9.   pn.x = MAX( 0.0, MIN( (float)w - 1.0, x ) );  
  10.   y = A1 * ( p.y - p.y0 ) + A2 * ( p.yp - p.y0 ) +  
  11.     B0 * gsl_ran_gaussian( rng, TRANS_Y_STD ) + p.y0;  
  12.   pn.y = MAX( 0.0, MIN( (float)h - 1.0, y ) );  
  13.   s = A1 * ( p.s - 1.0 ) + A2 * ( p.sp - 1.0 ) +  
  14.     B0 * gsl_ran_gaussian( rng, TRANS_S_STD ) + 1.0;  
  15.   pn.s = MAX( 0.1, s );  
  16.   pn.xp = p.x;  
  17.   pn.yp = p.y;  
  18.   pn.sp = p.s;  
  19.   pn.x0 = p.x0;  
  20.   pn.y0 = p.y0;  
  21.   pn.width = p.width;  
  22.   pn.height = p.height;  
  23.   pn.histo = p.histo;  
  24.   pn.w = 0;  
  25.   return pn;  
  26. }  

6、相似度計算

然後計算這100個粒子hsv空間直方圖與目標hsv空間直方圖相似成度,馬氏距離(Battacharyya)來度量兩個粒子的相似度係數。

  1. //計算粒子與跟蹤區域直方圖相似程度,越相似則權值越大
  2. particles[j].w = likelihood( hsv_frame, cvRound(particles[j].y),  
  3.             cvRound( particles[j].x ),  
  4.             cvRound( particles[j].width * s ),  
  5.             cvRound( particles[j].height * s ),  
  6.             particles[j].histo );  
  1. float histo_dist_sq( histogram* h1, histogram* h2 )//兩個粒子的
  2. {  
  3.   float* hist1, * hist2;  
  4.   float sum = 0;  
  5.   int i, n;  
  6.   n = h1->n;  
  7.   hist1 = h1->histo;  
  8.   hist2 = h2->histo;  
  9.   /* 
  10.     According the the Battacharyya similarity coefficient, 
  11.     D = \sqrt{ 1 - \sum_1^n{ \sqrt{ h_1(i) * h_2(i) } } }//馬氏距離公式 
  12.   */
  13.   for( i = 0; i < n; i++ )  
  14.     sum += sqrt( hist1[i]*hist2[i] );  
  15.   return 1.0 - sum;  
  16. }  

步驟三、重取樣

7、重取樣

由步驟二知,經過一次搜尋後,粒子的權重會發生改變,離目標距離遠的粒子權重小,距離近的權重大。那麼經過多幀的跟蹤後,有的粒子權重會變得相當的小,也就是與目標不相似了,即粒子退化現象,這種粒子我們要拋棄,那麼什麼時候該拋棄它呢?就得設一個權重閾值,凡是權重低於閾值的粒子就拋棄。OK,原來有100個粒子,然後總會有被拋棄的粒子,似的粒子總數不滿100個,此時就要找一些新的粒子來補充,那麼就用最大權值來填充。(比如現在拋棄了20個粒子,我們就複製20個權值最大的粒子,放到裡面填滿100個。)——這就是重取樣的過程。

  1. particle* resample( particle* particles, int n )  
  2. {  
  3.   particle* new_particles;  
  4.   int i, j, np, k = 0;  
  5.   qsort( particles, n, sizeof( particle ), &particle_cmp );//根據權重進行排序
  6.   new_particles = malloc( n * sizeof( particle ) );  
  7.     for( i = 0; i < n; i++ )  
  8.     {  
  9.         np = cvRound( particles[i].w * n );//淘汰弱權值樣本,保留閾值以上樣本
  10.         for( j = 0; j < np; j++ )  
  11.         {  
  12.             new_particles[k++] = particles[i];  
  13.             if( k == n )  
  14.             goto exit;  
  15.         }  
  16.     }  
  17.   while( k < n )  
  18.     new_particles[k++] = particles[0];//複製大權值樣本以填充滿樣本空間
  19.  exit:  
  20. 相關推薦

    目標跟蹤-粒子濾波演算法

    http://blog.csdn.net/hujingshuang/article/details/45535423 前言: 粒子濾波廣泛的應用於目標跟蹤,粒子濾波器是一種序列蒙特卡羅濾波方法,其實質是利用一系列隨機抽取的樣本(即粒子)來替代狀態的後驗概率分佈。在此

    目標跟蹤之CCT演算法

    一、摘要 論文提出了一種協同相關跟蹤器來解決相關濾波跟蹤器跟蹤時的尺度變換和模型漂移的問題,首先,論文在相關濾波器的核矩陣中嵌入尺度變換因子來適應尺度變換。然後使用隨機樣本訓練了一種有效的用來檢測的新型的長期CUR濾波器,這種濾波器通過在協同跟蹤器中有效地檢測候選目標來減少

    目標跟蹤的經典演算法

    0,Online Object Tracking: A Benchmark cvpr2013 綜述      http://visual-tracking.net/#      http://cvlab.hanyang.ac.kr/tracker_benchmark_

    “0公式系列”之粒子濾波演算法----逃離迷宮

    放在開頭,“0公式系列”:無公式,無理論,單靠動畫,或圖片,加上個人理解,來解釋演算法中的思想。 你醒來在一個迷宮內,不知道自己在這個大迷宮的哪一個位置,你要出去,但是你也不能亂走吧,正當你迷茫的時候,你發現自己手裡有一張紙質的迷宮地圖,該地圖不僅包含了迷宮的形狀,還包括了

    目標跟蹤:CamShift演算法

    1.前言 camshift利用目標的顏色直方圖模型將影象轉換為顏色概率分佈圖,初始化一個搜尋窗的大小和位置,並根據上一幀得到的結果自適應調整搜尋視窗的位置和大小,從而定位出當前影象中目標的中心位置

    運動目標跟蹤-光流演算法3

    考慮物體的運動速度較大時,演算法會出現較大的誤差。那麼就希望能減少影象中物體的運動速度。一個直觀的方法就是,縮小影象的尺寸。假設當影象為400×400時,物體速度為[16 16],那麼影象縮小為200×200時,速度變為[8,8]。縮小為100*100時,速度減少到[4,4]。所以在源影象縮放了很多以後,原演

    cv2實現基於粒子濾波目標跟蹤

    目標跟蹤過程分為2部分,即目標特徵提取和目標跟蹤演算法。       其中目標特徵提取又包括以下幾種:1. 各種色彩空間直方圖,利用色彩空間的直方圖分佈作為目標跟蹤的特徵,可以減少物體遠近距離的影響,因為其顏色分佈大致相同。2.輪廓特徵,提取目標的輪廓特徵,可以加快

    粒子濾波初探(二)利用粒子濾波實現視訊目標跟蹤-程式碼部分(C++&&opencv2.49)

    利用粒子濾波實現視訊目標跟蹤工程實戰 放在最前:致謝taotao1233、yangyangcv、yang_xian521 以及先驅 Rob Hess 所開源的程式碼和思路。 本篇:基本為工程翻譯,以及對上面版本的一些修正,使用的是opencv2.49,以Ma

    基於粒子濾波目標跟蹤實現步驟

            粒子群濾波在很多領域都有應用,例如他可以求函式的最有解、在影象中可以實現目標的跟蹤等,今天我便是要講講它的目標跟蹤,本人也是初學,參考了很多大大的部落格,文章後面貼連結,侵權請通知刪除,歡迎評論交流或郵箱:[email protected]。 粒子

    室內定位系列(六)——目標跟蹤粒子濾波

    進行目標跟蹤時,先驗知識告訴我們定位軌跡是平滑的,目標當前時刻的狀態與上一時刻的狀態有關,濾波方法可以將這些先驗知識考慮進來得到更準確的定位軌跡。本文簡單介紹粒子濾波及其使用,接著卡爾曼濾波寫,建議先閱讀室內定位系列(五)——目標跟蹤(卡爾曼濾波)。 原理 這裡跟卡爾曼濾波進行對比來理解粒子濾波。 目標

    從meanshift目標跟蹤粒子濾波

    本文一開始總結我對meanshift演算法在影象分割、視訊目標跟蹤的一些粗淺認識,進一步引申到粒子濾波在目標跟蹤中如何應用,由於本人學術水平尚淺,必然有很多認識有誤,希望得到大家的批評指正,不勝感激。 在初學均值漂移演算法的時候,有個總體印象,就是演算法希望通過尋找密度最大的位置作為收斂位置,用白話講,

    視訊跟蹤演算法粒子濾波

    1. 寫在前面 最近在看視訊跟蹤方面的一些碩博士畢業論文,幾乎看到的每一篇都會涉及到粒子濾波演算法,所以這段時間花了很多時間在看相關的內容。 瀏覽了大量的部落格和文章,跟著不停推導公式,感覺還是無法完全掌握,無法將這個抽象的數學模型和實際應用中聯絡起來,不過隨著時

    基於顏色的粒子濾波器目標跟蹤演算法的原理(A color-Based Particle Filter)

    粒子濾波器的主要步驟就包括五步:    第一步   :生成初代粒子集合    第二步   :讓粒子集合在狀態空間轉播(Propagate):對應於系統動態方程    第三步   :獲得當前時刻的觀測

    目標識別、目標跟蹤演算法總結

    想自學影象處理的相關知識,正好實驗室師兄做過兩個關於紅外目標跟蹤的專案,因此從mean-shift 、SR、RP、PF開始學習。但是查閱資料的時候,發現對各種演算法理解非常 利用影象處理演算法,實現的功能一般包括: 目標的檢測、識別、跟蹤。常見的問題包括:人臉

    深度多目標跟蹤演算法綜述

    導言 基於深度學習的演算法在影象和視訊識別任務中取得了廣泛的應用和突破性的進展。從影象分類問題到行人重識別問題,深度學習方法相比傳統方法表現出極大的優勢。與行人重識別問題緊密相關的是行人的多目標跟蹤問題。 在多目標跟蹤問題中,演算法需要根據每一幀影象中目標的檢測結果,匹配已有的目標軌跡;對於

    目標跟蹤演算法

    本文轉自:https://www.zhihu.com/question/26493945   第一部分:目標跟蹤速覽 先跟幾個SOTA的tracker混個臉熟,大概瞭解一下目標跟蹤這個方向都有些什麼。一切要從2013年的那個資料庫說起。。如果

    基於粒子演算法的多目標搜尋

        工程優化問題,大多數問題屬於多目標優化問題。相對於單目標優化問題,多目標優化問題的顯著特徵是優化各個目標使其同時達到綜合的最優值。然而,由於多個目標有花紋的各個目標之間往往是衝突的。     多目標優化問題求解中最重要的概念是非劣解和非劣解集:

    SiamFC:基於全卷積孿生網路的目標跟蹤演算法

    Abstract 本論文提出一種新的全卷積孿生網路作為基本的跟蹤演算法,這個網路在ILSVRC15的目標跟蹤視訊資料集上進行端到端的訓練。我們的跟蹤器在幀率上超過了實時性要求,儘管它非常簡單,但在多個benchmark上達到最優的效能。 1. Introduction

    MOSSE相關濾波目標跟蹤論文

    論文全名:Visual Object Tracking using Adaptive Correlation Filters 論文摘自CVPR 2010,由David S. Bolme、J.Ross Beveridge、Bruce A. Draper與Yui Man Lui撰寫,簡稱MOSSE。

    經典的目標跟蹤演算法

    本文轉自:https://www.zhihu.com/question/26493945   第一部分:目標跟蹤速覽 先跟幾個SOTA的tracker混個臉熟,大概瞭解一下目標跟蹤這個方向都有些什麼。一切要從2013年的那個資料庫說起。。如果