ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

vision.KalmanFilter クラス

パッケージ: vision

オブジェクト追跡用のカルマン フィルター

説明

カルマン フィルター オブジェクトは、追跡のために設計されています。これを使用して物理オブジェクトの将来の位置を予測し、検出された位置のノイズを低減したり、複数の物理オブジェクトを対応するトラックに関連付けたりすることができます。複数のオブジェクトを追跡できるように各物理オブジェクトに対してカルマン フィルター オブジェクトを構成できます。カルマン フィルターを使用するには、オブジェクトが等速度または等加速度で動いていなければなりません。

カルマン フィルター アルゴリズムには、予測と補正 (更新ステップとも呼ばれる) という 2 つのステップが含まれます。最初のステップでは、以前の状態を使用して現在の状態を予測します。2 番目のステップでは、オブジェクトの位置など、現在の測定値を使用して状態を修正します。カルマン フィルターは、離散時間の線形状態空間システムを実装しています。

メモ

カルマン フィルターの構成を容易にするには、configureKalmanFilter オブジェクトを使用してカルマン フィルターを構成します。これにより、等速度または等加速度で移動する直交座標系内の物理オブジェクトを追跡するためのフィルターが設定されます。統計量はすべての次元に沿って同じです。カルマン フィルターを異なる仮定に基づいて設定する必要がある場合は、関数を使用せず、このオブジェクトを直接使用します。

構築

obj = vision.KalmanFilter は、離散時間の等速度システムのカルマン フィルター オブジェクトを返します。状態空間システムでは、状態遷移モデル A と測定モデル H が次のように設定されます。

変数
A[1 1 0 0; 0 1 0 0; 0 0 1 1; 0 0 0 1]
H[1 0 0 0; 0 0 1 0]

obj = vision.KalmanFilter(StateTransitionModel,MeasurementModel) は、状態遷移モデル A と測定モデル H を構成します。

obj = vision.KalmanFilter(StateTransitionModel,MeasurementModel,ControlModel) は、さらに制御モデル B を構成します。

obj = vision.KalmanFilter(StateTransitionModel,MeasurementModel,ControlModel,Name,Value) は、カルマン フィルター オブジェクトのプロパティを構成します。このプロパティは、1 つ以上の Name,Value 引数ペアとして指定します。指定していないプロパティは既定値になります。

オブジェクトの追跡:

検出結果に基づいて、predict および correct メソッドを使用します。

  • 追跡中のオブジェクトが検出された場合、カルマン フィルター オブジェクトと検出測定値を指定して predict および correct メソッドを使用します。次の順序でメソッドを呼び出します。

    [...] = predict(obj);
    [...] = correct(obj,measurement);

  • 追跡中のオブジェクトが検出されない場合、correct メソッドではなく predict メソッドを呼び出します。追跡中のオブジェクトが欠損している、または隠れている場合、測定値は得られません。次のロジックを使用してメソッドを設定します。

    [...] = predict(obj);
    If measurement exists
    	[...] = correct(obj,measurement);
    end

  • 追跡中のオブジェクトが過去の t-1 回の連続したタイム ステップで欠損しており、その後に検出された場合、predict メソッドを t 回呼び出すことができます。次の構文は、非同期ビデオを処理する場合に特に役立ちます。たとえば以下のようになります。

    for i = 1:k
      [...] = predict(obj);
    end
    [...] = correct(obj,measurement) 

distance メソッドを使用して最適マッチを求めます。計算された距離値は、一連の測定値がカルマン フィルターにどの程度マッチしているかを示します。これによって、フィルターに最も適した測定値を選択できます。この戦略を使用して、複数オブジェクトを追跡する問題で、オブジェクト検出をオブジェクト追跡に対してマッチングできます。この距離の計算では、予測された状態とプロセス ノイズの共分散が考慮されます。distance メソッドは、predict メソッドの後にのみ呼び出すことができます。

 距離の方程式

d = distance(obj, z_matrix) は、検出されたオブジェクトとカルマン フィルター オブジェクトによって予測された位置の間の距離を計算します。N 列の z_matrix 入力行列の各行には、測定ベクトルが含まれます。distance メソッドは、各距離要素が測定入力に対応する行ベクトルを返します。

状態空間システム

このオブジェクトは、次の方程式によって示される、離散時間の線形状態空間システムを実装しています。

状態方程式:

x(k)=Ax(k1)+Bu(k1)+w(k1)

測定方程式:

z(k)=Hx(k)+v(k)

 変数の定義

プロパティ

StateTransitionModel

タイム ステップ間での状態遷移を示すモデル (A)

時間による状態の遷移を M 行 M 列の行列として指定します。オブジェクトの構築後にこのプロパティを変更することはできません。このプロパティは、状態空間システムの変数 A に関連しています。

既定値: [1 1 0 0; 0 1 0 0; 0 0 1 1; 0 0 0 1]

MeasurementModel

状態から測定値への変換を示すモデル (H)

状態から測定値への遷移を N 行 M 列の行列として指定します。オブジェクトの構築後にこのプロパティを変更することはできません。このプロパティは、状態空間システムの変数 H に関連しています。

既定値: [1 0 0 0; 0 0 1 0]

ControlModel

制御入力から状態への変換を示すモデル (B)

制御入力から状態への遷移を M 行 L 列の行列として指定します。オブジェクトの構築後にこのプロパティを変更することはできません。このプロパティは、状態空間システムの変数 B に関連しています。

既定値: []

State

状態 (x)

状態をスカラーまたは M 要素ベクトルとして指定します。スカラーとして指定すると、M 要素ベクトルに拡張されます。このプロパティは、状態空間システムの変数 x に関連しています。

既定値: [0]

StateCovariance

状態推定誤差の共分散 (P)

状態推定誤差の共分散をスカラーまたは M 行 M 列の行列として指定します。スカラーとして指定すると、M 行 M 列の対角行列に拡張されます。このプロパティは、状態空間システムの変数 P に関連しています。

既定値: [1]

ProcessNoise

プロセス ノイズの共分散 (Q)

プロセス ノイズの共分散をスカラーまたは M 行 M 列の行列として指定します。スカラーとして指定すると、M 行 M 列の対角行列に拡張されます。このプロパティは、状態空間システムの変数 Q に関連しています。

既定値: [1]

MeasurementNoise

測定ノイズの共分散 (R)

測定ノイズの共分散をスカラーまたは N 行 N 列の行列として指定します。スカラーとして指定すると、N 行 N 列の対角行列に拡張されます。このプロパティは、状態空間システムの変数 R に関連しています。

既定値: [1]

メソッド

correctCorrection of measurement, state, and state estimation error covariance
predictPrediction of measurement
すべての System object に共通
clone

同じプロパティ値をもつ System object™ の作成

getNumInputs

System object の想定される入力数

getNumOutputs

System object の想定される出力数

isLocked

System object のロック状態の確認 (論理値)

release

System object のプロパティ値の変更の許可

すべて展開する

1 方向に移動する物理オブジェクトの位置を追跡します。

定速で移動する物理オブジェクトの 1 次元位置を模倣する合成データを生成します。

detectedLocations = num2cell(2*randn(1,40) + (1:40));

一部の要素を空に設定することによって、欠損している検出をシミュレートします。

detectedLocations{1} = [];
  for idx = 16: 25
      detectedLocations{idx} = [];
  end

検出の位置と、カルマン フィルターを使用した追跡の結果を示す Figure を作成します。

figure;
hold on;
ylabel('Location');
ylim([0,50]);
xlabel('Time');
xlim([0,length(detectedLocations)]);

物理オブジェクトが最初に検出された時点で、1 次元の定速カルマン フィルターを作成します。前の状態に基づいてオブジェクトの位置を予測します。現在のタイム ステップでオブジェクトが検出された場合、その位置を使用して状態を修正します。

kalman = [];
for idx = 1: length(detectedLocations)
   location = detectedLocations{idx};
   if isempty(kalman)
     if ~isempty(location)

       stateModel = [1 1;0 1];
       measurementModel = [1 0];
       kalman = vision.KalmanFilter(stateModel,measurementModel,'ProcessNoise',1e-4,'MeasurementNoise',4);
      kalman.State = [location, 0];
     end
   else
     trackedLocation = predict(kalman);
     if ~isempty(location)
       plot(idx, location,'k+');
      d = distance(kalman,location);
       title(sprintf('Distance:%f', d));
       trackedLocation = correct(kalman,location);
     else
       title('Missing detection');
     end
     pause(0.2);
     plot(idx,trackedLocation,'ro');
   end
 end
legend('Detected locations','Predicted/corrected locations');

カルマン フィルターを使用して、ゼロ平均のガウス ノイズによって破損したランダムな信号からノイズを除去します。

ゼロ平均で標準偏差が 0.1 のガウス ノイズによって破損した、値が 1 のランダムな信号を合成します。

x = 1;
len = 100;
z = x + 0.1 * randn(1,len);

カルマン フィルターを使用して信号からノイズを除去します。状態は一定であると予測され、測定値は状態と同じになります。

stateTransitionModel = 1;
measurementModel = 1;
obj = vision.KalmanFilter(stateTransitionModel,measurementModel,'StateCovariance',1,'ProcessNoise',1e-5,'MeasurementNoise',1e-2);

z_corr = zeros(1,len);
for idx = 1: len
 predict(obj);
 z_corr(idx) = correct(obj,z(idx));
end

結果をプロットします。

figure, plot(x * ones(1,len),'g-');
hold on;
plot(1:len,z,'b+',1:len,z_corr,'r-');
legend('Original signal','Noisy signal','Filtered signal');

参考文献

Welch, Greg, and Gary Bishop, An Introduction to the Kalman Filter, TR 95–041. University of North Carolina at Chapel Hill, Department of Computer Science.

拡張機能

R2012b で導入