ランダム確率を用いたトラッキング技術「パーティクルフィルタ」
動画中の人物領域を検出した後、その座標を画面の外に出るまで見失わないように追跡し続けるために「パーティクルフィルタ(Particle Filter)」という技術がよく用いられています。毎フレームごとにHOG特徴量を計算すると人物領域の座標は毎フレームごとに検出できるわけです。
しかし、人物領域は同時に2つも3つも検出されたり、障害物で隠れて一時的に検出できなくなったり、人物同士が交差してどちらがどちらかが区別できなくなったり、検出された人物が途中から画面の外に出て行った後戻ってこない場合もあるわけです。これらを解決するためには、HOG特徴量による毎フレームごとの検出処理、1人ずつの軌道を自動計算できてかつ区別できると嬉しいわけです。
ランダム確率変数による時系列トラッキング技術「パーティクルフィルタ」
パーティクルフィルタは確率分布による時系列データの予測手法です。予測したい値の確率分布の、1フレームごとの移り変わりを毎フレームごとに予測していきます。今回のように物体の座標をトラッキングする場合、位置情報には、検出した物体の色情報など、計算コストが低い特徴量が主に用いられます。
動画中の各フレームのデータ系列(「観測」と呼ぶ。)が、そのデータ系列の裏側に隠れて時系列的に遷移している、トラッキングしたいデータ系列(「状態」と呼ぶ。)により生成されているとみなします(俗にこれを「隠れマルコフモデル」と呼びます)。毎フレームごとに、新しい1フレームの情報を用いて前の座標の確率分布を更新し、その新しいフレームでの座標の確率分布を予測します。
各状態は「確率変数」により表現されています。確率変数とは、値がそれぞれ一意に決まる通常の変数とは違い、「このXの値ではこれくらいの確率で値がXtになる」といったように、確率分布によってデータの値が決まる変数です。例えばある時刻tの値Xtは値が10になる確率が0.8で、値が25になる確率が0.3で、値が100になる確率が0.03と行った風に、とりうる値ごとにその発生確率が0~1までの確率で決まっているといったように、発生確率の連続的な分布が定められた変数が確率変数です。
確率分布によりそれぞれの値が発生する確率が決まっているので、取りうる値にランダム性がつきまとう表現です(プログラミングする際には乱数を用いて分布を生成します)。しかし、確率変数の方が実世界での現象における値の発生頻度のあいまいさを確率分布で数学的に表せるのもあって、こうした確率変数を用いたアルゴリズムが近年発展してきています。
パーティクルフィルタでは与えられた次のフレームでの画像データから毎フレームごとにこの確率分布を更新していくわけですが、確率分布全体を真面目に積分計算すると計算コストが非常に高くて話になりません。そこでパーティクルフィルタでは、離散的ないくつかの値だけを「サンプリング」することにより、それらが表す確率分布が本当の連続的な確率分布を十分に近似しているとみなします。この時の各サンプリング点を「パーティクル(粒子)」と呼び、パーティクルによるサンプリングで得られる確率分布を毎フレームごとに、画像データにより更新していきます。
毎フレームの予測結果を表すパーティクルによる分布は、次のフレームでの答えの値の候補を適当に予測して試しにサンプリングしてみることで更新してきます。今回の2次元座標トラッキングだと次のフレームの座標(x、y)の候補値に相当します。そのパーティクルを例えば1000個生成し、前フレームの各パーティクルの値(これら全体で前フレームでの確率分布を近似)を更新して次フレームの確率分布を作ることで、その(サンプリングで近似された)確率分布の中で最も値が大きい(x、y)の値を最終的な次フレームの予想値とする仕組みです。
図で示したように、パーティクルフィルタは次の3ステップにより毎フレームごとの更新処理を行います。ここで、図では考えやすいように1次元空間で考えることにします。
- 予測
- 更新(重み付け)
- リサンプリング
1. 予測
各パーティクルの次のフレームでの座標(予測値)を、適当に仮定した値の予測モデルを用いて計算します。今回は移動物体の2次元座標の予測を行っているので、等速直線運動を用いて次フレームの各パーティクルの予測値を計算します。
2. 更新(各パーティクルの重みの更新)
(1)の"予測"により値が予測値に変わった各パーティクルが、現在の画像に対してどれだけ座標値に誤差が少ないかという「尤度」をパーティクルごとに計算します。通常、領域ごとの色のヒストグラムなどで誤差を計算します。
誤差が大きい(尤度が低い)パーティクルは予測の正しさが低いのでパーティクルの重みを減らし、逆に誤差が小さい(尤度が高い)パーティクルは予測の正しさが高いのでパーティクルの重みを増やすというように、各パーティクルの重み(尤度を基にした重要度)の更新を行います。更新された重み値は次のリサンプリング処理で用います。
3. リサンプリング(Resampling)
(2)の"更新"で計算された重みに従って各パーティクルをサンプリングし、確率分布をパーティクルフィルタで求めた新しいものにサンプリングし直すのがこの処理です。重みの値が大きいパーティクルほどその子孫をたくさん生成し、重みが小さいパーティクルは「その値になる確率が非常に低い」とみなしてパーティクルを消滅させます。これにより、新しいサンプリングされた確率分布が完成します。この分布の中で一番確率が大きくなっている値を最終的な次のフレームの追跡値(予測値)とできるので、これで画像1フレームごとのパーティクルフィルタの処理は終了です。
以上1~3によりパーティクルを毎フレームごとにフィルタリングすることで、これらのパーティクルでサンプリング近似している確率密度関数の形を更新するので、「パーティクルフィルタ」と呼ばれています。
ちなみに「前方」カメラを用いた衝突防止システムはビジョン技術が用いられる事が多いのですが、トラックなどの車体が大きく前後に長い車の場合に車線変更時に「隣の車線」や「後方」に車が存在するかどうかを判定するシステムでは、カメラではなく「レーダー」が用いられることが多いです。その理由ですが、レーダーによるシステムの方がカメラの苦手な夜間映像にも同じ精度で車を検出することができることによります。一方で、カメラを赤外線カメラにすることで、夜間でも画像処理で実現している製品もあります。