パーティクルフィルタ(Particle Filter)


 パーティクルフィルタは,推定に基づく時系列追跡手法です.(別名、Condensationやモンテカルロフィルタなど)
 パーティクルフィルタでは,状態予測モデルと観測モデルを自分で設定して状態を追跡します.手順としては、①初期設定 ②状態推定 ③観測 ④評価を行います.初期設定をして,次状態の物体の状態を予測しパーティクルを移動する→尤度を観測して,評価により物体の重心を計算するというイメージです.また,多数のパーティクル(仮説)をばらまいて,最もらしい観測位置を重心とするので,追跡精度が良いとされております.以下に手順を示します.

Step.0 初期設定
初期設定では追跡対象物体の位置を指定し,周辺にパーティクルをランダムで配置する.特定の物体周辺のみに配置する方法や,画像全体にばらまいて物体を探索する方法などがある.

Step.1 状態推定
次状態での物体の位置を推定しパーティクルを動かす.運動モデルには,等速直線運動や円運動,落下運動など様々であり,自由に設定可能.ノイズが発生するため,パーティクルの位置にはばらつきを与える.

Step.2 観測
観測ではモデルとの尤度を計算する.用意されたモデルと,パーティクル位置での特徴の類似度を尤度としている.尤度計算方法には輝度や色,輪郭やエッジなどの特徴ヒストグラムが適用されている.モデルとのヒストグラム比較には,多くの場合Bhattacharyya係数が用いられている.

Step.3 評価
評価では対象物体の重心を求める.Step.2で求めたパーティクルの尤度と位置座標の重み付き平均の計算により重心を算出.

Step.1 - Step.3の繰り返し (状態推定→尤度観測→尤度評価)


 パーティクルフィルタはOpenCVでも提供されています.また,サンプルコードも多数配布されていますので,探せば見つかるはずです.

参考URL

参考文献

C++, OpenCVによる実装例


  • すでにパーティクルフィルタの流れやRGBのユークリッド距離による尤度計算はサンプルで紹介されているので,ここでは色ヒストグラムによる尤度を観測するプログラムを紹介します.
  • この関数では,HSV変換したうちの色相(Hue)画像を渡してます.同時に,画像中でヒストグラムを取得する矩形位置と比較対象のヒストグラムを渡します.

//色ヒストグラムを入力し尤度を計算する
//IplImage *input_img : HSV変換したH画像
//CvRect rectangle : 尤度計算をする矩形
//CvHistogram *model_hist : 比較対象のモデル画像
float hist_likelihood(IplImage *input_img, CvRect rectangle,CvHistogram *model_hist)
{
  //ヒストグラムの定義
  int i, hist_size = 180;
  float range_O[] = {0,180};
  float *ranges[] = {range_O};
  CvHistogram *hist;
  //尤度を格納する変数tmp
  float tmp;
  //ヒストグラムをとるROI領域を指定
  cvSetImageROI(input_img, rectangle);
  //ヒストグラム構造体を確保
  hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
  //画像が格納されていなければ終了
  if(input_img == 0){ return -1; }
  //ヒストグラムを計算、正規化
  cvCalcHist(&input_img, hist, 0, NULL);
  cvNormalizeHist(hist, 10000);
  //Bhattacharyya係数によりヒストグラムの類似度を計算
  tmp = cvCompareHist(hist, model_hist, CV_COMP_BHATTACHARYYA);
  //ROIを解除する
  cvResetImageROI(input_img);
  //ヒストグラムを解放
  cvReleaseHist(&hist);	

  //BHATTACHARYYA係数は0~1の範囲をとる
  //cvCompareHistのメソッドでは距離を計算する類似度に直すには1.0との差をとる
  return(1.0-tmp);
}

・不備がある可能性があります.あらかじめご了承ください.





最終更新:2011年03月04日 19:16