オブジェクトトラッキングとは
物体追跡(オブジェクトトラッキング)は、動画や一連の画像から特定の物体の動きを追跡する技術。
概要
物体追跡の基本的なプロセスは以下の通り。
ここではTracking-by-Detection型のMultiple Object Tracking(MOT)について解説する。
Tracking-by-Detectionとは
各フレームで物体検出を行い、その検出結果を用いて物体を追跡する手法。
物体検出
- 物体検出アルゴリズムで各フレームの物体を検出。
- 通常、以下の情報を得る:
- 物体の位置(x, y座標)
- 大きさ(幅と高さ)
- 物体クラス(カテゴリラベル)
追跡の初期化と更新
- 初回検出時に新たな追跡対象(トラック)が生成される。
- 次フレーム以降の検出で既存トラックが更新される。
状態の予測と補正
- カルマンフィルタを用いて物体の状態(位置・速度など)を予測し、検出結果で補正する。
実装詳細
物体追跡の具体的な流れは以下の通り。
追跡物体の状態更新
コストマトリクスの計算
- 追跡物体と新規検出物体の間の一致度(IoU)を計算し、コストマトリクスを構築。
マッチング(対応付け)
- ハンガリアン法(ムンカレス法)を用いて、全体のコストが最小となるようにマッチングを行う。
古い追跡物体の削除
コストマトリクスの詳細
各フレームで検出された物体(検出物体)と既存の追跡物体(トラック)の関係を評価するためにコストマトリクスを用いる。
コストマトリクスは次のように構成される:
マトリクス要素は一致度の逆数(1 - IoU)で計算:
\text{IoU} = \frac{\text{Overlap Area}}{\text{Union Area}}
IoUが高いほどコストは低く、適切なマッチングが行われやすい。
ハンガリアン法の詳細
ハンガリアン法(Hungarian Algorithm)は、コストマトリクスをもとに最適なマッチングを行うアルゴリズム。
- コスト最小化を達成する割り当てを求める。
- 追跡物体と検出物体のマッチング結果に基づき、カルマンフィルタで状態を更新。
カルマンフィルタの詳細
カルマンフィルタは、ノイズのある観測から状態(位置・速度など)を推定するアルゴリズム。
構成
予測ステップ
物理モデルに基づき、次の状態を予測。
補正ステップ
新たな観測値で予測を補正し、状態推定を更新。
主なパラメータ
| パラメータ |
説明 |
| 初期状態ベクトル |
初期の物体位置・速度 |
| 観測ノイズ |
観測値のばらつき(通常はガウス分布) |
| プロセスノイズ |
モデルの不確実性(予測誤差) |
これらのパラメータは、問題特性に応じて調整する必要がある。
注意点
カルマンフィルタは「線形・ガウスノイズ」を前提とする。
複雑な動きや非線形性が強い場合は、拡張カルマンフィルタ(EKF)やUnscented Kalman Filter(UKF)の検討も必要。
SORTにおけるカルマンフィルタのパラメータ
SORT(Simple Online and Realtime Tracking)は、近年のMOTの基盤となるシンプルなアルゴリズム。
状態ベクトル
x=\left(
\begin{matrix}
x\\
y\\
s\\
a\\
x' \\
y' \\
s' \\
\end{matrix}
\right)
| 成分 |
意味 |
| (x, y) |
物体の中心座標 |
| (s) |
バウンディングボックスの面積(スケール) |
| (a) |
アスペクト比(幅/高さ) |
| (x', y', s') |
各速度成分 |
システム行列
状態遷移行列(F)
F=\left(
\begin{matrix}
1 & 0 & 0 & 0 & 1 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & 1 \\
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 1
\end{matrix}
\right)
観測行列(H)
H=\left(
\begin{matrix}
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 0 & 0 & 0
\end{matrix}
\right)
共分散行列
初期誤差共分散行列(P)
P=\left(
\begin{matrix}
10 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 10 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 10 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 10 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 10000 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 10000 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 10000
\end{matrix}
\right)
プロセスノイズ行列(Q)
Q=\left(
\begin{matrix}
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0.01 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0.01 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0.0001
\end{matrix}
\right)
観測ノイズ行列(R)
R=\left(
\begin{matrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 10 & 0 \\
0 & 0 & 0 & 10
\end{matrix}
\right)
FairMOTにおけるカルマンフィルタのパラメータ
FairMOTでは、以下の8次元状態ベクトルを用いて物体の状態を推定する:
x=\left(
\begin{matrix}
x \\
y \\
a \\
h \\
x' \\
y' \\
a' \\
h' \\
\end{matrix}
\right)
| 成分 |
意味 |
| (x, y) |
バウンディングボックス中心座標 |
| (a) |
アスペクト比(幅/高さ) |
| (h) |
バウンディングボックスの高さ |
| (x', y', a', h') |
それぞれの速度成分 |
状態遷移行列(F)
時刻間隔 (dt) を用いた標準的な運動モデル:
F=\left(
\begin{matrix}
1 & 0 & 0 & 0 & dt & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & dt & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & dt & 0 \\
0 & 0 & 0 & 1 & 0 & 0 & 0 & dt \\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\
\end{matrix}
\right)
観測行列(H)
観測可能なのは位置・アスペクト比・高さの4次元のみ:
H=\left(
\begin{matrix}
1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 0 & 0 & 0 & 0
\end{matrix}
\right)
初期誤差共分散行列(P)
初期の不確かさは以下のように設定される:
P = \begin{pmatrix}
(2 \times \text{{std\_weight\_position}} \times h_{\text{init}})^2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & (2 \times \text{{std\_weight\_position}} \times h_{\text{init}})^2 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1e-2^2 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & (2 \times \text{{std\_weight\_position}} \times h_{\text{init}})^2 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & (10 \times \text{{std\_weight\_velocity}} \times h_{\text{init}})^2 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & (10 \times \text{{std\_weight\_velocity}} \times h_{\text{init}})^2 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 1e-5^2 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & (10 \times \text{{std\_weight\_velocity}} \times h_{\text{init}})^2
\end{pmatrix}
速度成分には大きめの不確かさを設定し、初期速度未知を表現する。
プロセスノイズ行列(Q)
物体の動きによるプロセスノイズは次のように定義:
Q = \begin{pmatrix}
(\text{{std\_weight\_position}} \times h_{\text{pred}})^2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & (\text{{std\_weight\_position}} \times h_{\text{pred}})^2 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1e-2^2 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & (\text{{std\_weight\_position}} \times h_{\text{pred}})^2 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & (\text{{std\_weight\_velocity}} \times h_{\text{pred}})^2 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & (\text{{std\_weight\_velocity}} \times h_{\text{pred}})^2 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 1e-5^2 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & (\text{{std\_weight\_velocity}} \times h_{\text{pred}})^2
\end{pmatrix}
観測ノイズ行列(R)
観測ノイズも物体の大きさに依存:
R = \begin{pmatrix}
(\text{{std\_weight\_position}} \times h_{\text{pred}})^2 & 0 & 0 & 0 \\
0 & (\text{{std\_weight\_position}} \times h_{\text{pred}})^2 & 0 & 0 \\
0 & 0 & 1e-1^2 & 0 \\
0 & 0 & 0 & (\text{{std\_weight\_position}} \times h_{\text{pred}})^2
\end{pmatrix}
標準偏差パラメータ
FairMOTで使われる標準偏差の重みは以下の通り:
\text{{std\_weight\_position}} = \frac{1}{20}
\text{{std\_weight\_velocity}} = \frac{1}{160}
解説
- FairMOTは、物体の高さを基準にプロセス・観測ノイズをスケーリングしており、小さい物体は敏感、大きい物体は安定に追跡できる設計。
- 状態にはアスペクト比((a))も含まれており、長方形の形状変化にも対応可能。
- 再識別特徴量(re-ID)と組み合わせることで、外観情報による補強も可能。
おわりに
本記事では、Tracking-by-Detection型の物体追跡について、基礎から実装・アルゴリズム詳細まで解説した。特にSORTは、シンプルながら非常に効果的なMOT手法であり、現代の多くの実装のベースとなっている。
参考
Discussion