第34回から第36回にわたって、OpenCVを用いたトラッキングの実装方法、トラッキング手法について紹介してきました。
第37回目の今回は、OpenCVに実装されているトラッキング手法のうち最後の1つであるKCFを紹介します。

KCF (Kernelized Correlation Filter) の特徴

KCF(Kernelized Correlation Filter)[1][2]は、Boosting、MILと同様に追跡中の物体の画像を随時学習しながら追跡します。しかし、Boosting、MILのようなSVMやBoostingなどの一般的な2クラス識別器を用いた手法(図1:上段)と異なり、KCF(図1:下段)はFFT(Fast Fourier Transform)によりメモリ使用量を抑えつつ、かつ高速に物体を学習し追跡することができます。
また、一般的な2クラス識別器を用いた手法は、物体の予測位置の周辺からランダムに探索窓(subwindow)をサンプリングし識別処理を行います。一方、KCFでは1画素ずつ密に探索窓をシフトさせた画像群をFFTにより解析的に処理できるという特徴があります。

図1 2クラス識別器を用いた手法(上段)とKCF(下段)の比較

図1 2クラス識別器を用いた手法(上段)とKCF(下段)の比較

KCFの概要

KCFではSVMなどと同様に、入力x(画像の画素値の系列や特徴量ベクトル)に重みwを掛け、バイアスbを足すことで得られる出力値f(x)から、画像中に映っている物体が対象としている物かどうかを判定します(式1)。式1は説明を簡単にするために線形識別関数としています。

式1

(式1)

学習フェーズでは、この重みw、バイアスbの最適値を、式2の目的関数を最小化することにより求めます。L( )はロス関数で、推定結果f(x)と真値yの誤差が大きい程大きな値を取ります。λの掛かっている項は正則化項と呼ばれ、重みwが大きな値を取り複雑なモデルになり過ぎないようにするためのものです。

物体の追跡では、真値yは追跡対象の物体が1、それ以外が0となります。KCFでは、2クラス識別である必要が無いため、論文では追跡対象の物体を1、そこから位置がずれるにつれて0に近づくような真値を与え、回帰問題として解いています。

式2

(式2)

KCFの最も興味深い点は、探索窓を追跡対象の物体領域周辺で1ピクセルずつシフトした画像群を生成し、それらを式1に示すcirculant matrixes(巡回行列)として扱うことです(式3)。この巡回行列では、1ピクセルずつシフトした画像は行列の各行に該当します。

式3 circulant matrix (巡回行列)

(式3) circulant matrix (巡回行列)

そして、この巡回行列とベクトルの積は、式4のとおりフーリエ空間のみで計算することができます。この巡回行列の特性を用いることで、繰り返し処理が不要な高速処理が実現可能となります。

式4

(式4)

物体の追跡処理では、学習フェーズで求めた重みwとバイアスbを用いてf(x)の値を計算し、その最大値を追跡対象の物体位置とします。

KCFによるトラッキング結果は動画1のとおりです。実際に使ってみた感想としては、人間の手など、見え方が変化する物体でも最も高精度に追跡できていました。動きが速い物体の場合、巡回行列の生成範囲を超えてしまう可能性があるので、OpenCVのソースコードに手を加える必要があるかもしれません。実際に、TLDなどと性能を比較してみることをお勧めします。KCFの詳細について知りたい方は、参考文献[1][2]を読んでみて下さい。


動画1 KCFによるトラッキング結果

次回は、カメラで撮影した映像から、音を復元する技術を紹介します!


参考文献
[1] Henriques, J., Caseiro, R., Martins, P., & Batista, J. Exploiting the circulant structure of tracking-by-detection with kernels. In proceedings of the European Conference on Computer Vision, 2012.
[2] Danelljan, M., Khan, F. S., Felsberg, M., & Weijer, J. Van De.: Adaptive Color Attributes for Real-Time Visual Tracking. In CVPR2014.