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

assignDetectionsToTracks

複数のオブジェクトの追跡のための検出のトラックへの割り当て

説明

[assignments,unassignedTracks,unassignedDetections] = assignDetectionsToTracks( costMatrix,costOfNonAssignment) は、ハンガリアン法割り当てアルゴリズムの James Munkres バリアントを使用して、複数のオブジェクトの追跡のコンテキストで検出をトラックに割り当てます。また、欠損しているトラックと新しいトラックを開始する必要がある検出を決定します。そして、割り当てのあるトラックとないトラック、および割り当てのない検出のインデックスを返します。costMatrix は、M 行 N 列の行列でなければなりません。この行列では、M はトラックの数を表し、N は検出の数を表します。各値は、N 番目の検出を M 番目のトラックに割り当てる際のコストを表します。コストが低くなるほど、検出がトラックに割り当てられる可能性が高くなります。costOfNonAssignment スカラー入力は、割り当てのないトラックまたは検出のコストを表します。

[assignments,unassignedTracks,unassignedDetections] = assignDetectionsToTracks(costMatrix, unassignedTrackCost,unassignedDetectionCost) は、割り当てのないトラックと検出のコストを個別に指定します。unassignedTrackCost はスカラー値または M 要素のベクトルでなければなりません。M はトラックの数を表します。M 要素のベクトルの場合、各要素はトラックに割り当てられていない検出のコストを表します。unassignedDetectionCost はスカラー値または N 要素のベクトルでなければなりません。N は検出の数を表します。

すべて折りたたむ

この例では、単一のビデオ フレームのトラックに検出を割り当てる方法を説明します。

現在のフレームにオブジェクトの予測位置を設定します。カルマン フィルター System object を使用して予測を取得します。

predictions = [1,1;2,2];

現在のフレームで検出されたオブジェクトの位置を設定します。この例では 2 つのトラックと 3 つの新しい検出があります。したがって、少なくとも 1 つの検出はマッチせず、これは新しいトラックを示す可能性があります。

detections = [1.1,1.1;2.1,2.1;1.5,3];

コスト行列を事前に割り当てます。

cost = zeros(size(predictions,1),size(detections,1));

検出にマッチする各予測のコストを計算します。ここではコストを予測と検出間のユークリッド距離として定義します。

for i = 1:size(predictions, 1)
      diff = detections - repmat(predictions(i,:),[size(detections,1),1]);
      cost(i, :) = sqrt(sum(diff .^ 2,2));
end

検出を予測に関連付けます。検出 1 はトラック 1 にマッチし、検出 2 はトラック 2 にマッチします。検出 3 はマッチするものがありません。

[assignment,unassignedTracks,unassignedDetections] = ...
            assignDetectionsToTracks(cost,0.2);
  figure;
  plot(predictions(:,1),predictions(:,2),'*',detections(:,1),...
            detections(:,2),'ro');
  hold on;
  legend('predictions','detections');
  for i = 1:size(assignment,1)
    text(predictions(assignment(i, 1),1)+0.1,...
            predictions(assignment(i,1),2)-0.1,num2str(i));
    text(detections(assignment(i, 2),1)+0.1,...
            detections(assignment(i,2),2)-0.1,num2str(i));
  end
  for i = 1:length(unassignedDetections)
    text(detections(unassignedDetections(i),1)+0.1,...
            detections(unassignedDetections(i),2)+0.1,'unassigned');
  end
  xlim([0,4]);
  ylim([0,4]);

入力引数

すべて折りたたむ

トラックへの検出の割り当てのコスト。M 行 N 列の行列として指定します。M は、トラックの数を表し、N は検出の数を表します。コスト行列の値は、実数、非スパース、かつ数値でなければなりません。コストが低くなるほど、検出がトラックに割り当てられる可能性が高くなります。各値は、N 番目の検出を M 番目のトラックに割り当てる際のコストを表します。検出とトラックの間で割り当てが行われる可能性がない場合、costMatrix 入力は Inf に設定されます。内部的には、この関数はコスト行列にダミー行と列を付加して、割り当てのないトラックおよび検出の可能性を考慮します。付加された行は、どのトラックにも割り当てられていない検出を表します。付加された列は、どの検出にも割り当てられていないトラックを表します。関数では、ハンガリアン法割り当てアルゴリズムが付加された行列に適用されます。

データ型: int8 | uint8 | int16 | uint16 | int32 | uint32 | single | double

検出をトラックに割り当てないコストまたはトラックを検出に割り当てないコスト。この値は、割り当てのないトラックまたは検出のコストを表すスカラー値として指定できます。割り当てのない検出は、新しいトラックの開始となる場合があります。トラックが割り当てられていないと、オブジェクトは表示されません。costOfNonAssignment の値が大きいほど、すべてのトラックが検出に割り当てられる可能性が高くなります。

内部的には、この関数はコスト行列にダミー行と列を付加して、割り当てのないトラックおよび検出の可能性を考慮します。付加された行は、どのトラックにも割り当てられていない検出を表します。付加された列は、どの検出にも割り当てられていないトラックを表します。行と列の両方のすべての要素に同じ値を割り当てるには、costOfNonAssignment 入力をもつ構文を使用します。さまざまな検出またはトラックの値を変化させるには、unassignedTrackCost 入力と unassignedDetectionCost 入力をもつ構文を使用します。

データ型: int8 | uint8 | int16 | uint16 | int32 | uint32 | single | double

割り当てのないトラックのコストまたは可能性。この値は、スカラー値または M 要素のベクトルとして指定できます。M はトラックの数を表します。M 要素のベクトルの場合、各要素はトラックに割り当てられていない検出のコストを表します。スカラー入力は、すべてのトラックに割り当てのないコストと同じコストを表します。コストは、各トラックおよびシーンに関する知識に応じて異なる場合があります。たとえば、オブジェクトが視野の外に出ようとしている場合、対応する割り当てのないトラックのコストは低くなります。

内部的には、この関数はコスト行列にダミー行と列を付加して、割り当てのないトラックおよび検出の可能性を考慮します。付加された行は、どのトラックにも割り当てられていない検出を表します。付加された列は、どの検出にも割り当てられていないトラックを表します。さまざまな検出またはトラックの値を変化させるには、unassignedTrackCost 入力と unassignedDetectionCost 入力をもつ構文を使用します。行と列の両方のすべての要素に同じ値を割り当てるには、costOfNonAssignment 入力をもつ構文を使用します。

データ型: int8 | uint8 | int16 | uint16 | int32 | uint32 | single | double

割り当てのない検出のコスト。スカラー値または N 要素のベクトルとして指定します。N は、検出の数を表します。N 要素のベクトルの場合、各要素はその検出の新しいトラックを開始するコストを表します。スカラー入力は、すべてのトラックに割り当てのないコストと同じコストを表します。コストは、各検出およびシーンに関する知識に応じて異なる場合があります。たとえば、検出がイメージの端の近くに表示される場合、新しいオブジェクトになる可能性が高くなります。

内部的には、この関数はコスト行列にダミー行と列を付加して、割り当てのないトラックおよび検出の可能性を考慮します。付加された行は、どのトラックにも割り当てられていない検出を表します。付加された列は、どの検出にも割り当てられていないトラックを表します。さまざまな検出またはトラックの値を変化させるには、unassignedTrackCost 入力と unassignedDetectionCost 入力をもつ構文を使用します。行と列の両方のすべての要素に同じ値を割り当てるには、costOfNonAssignment 入力をもつ構文を使用します。

データ型: int8 | uint8 | int16 | uint16 | int32 | uint32 | single | double

出力引数

すべて折りたたむ

トラックと対応する検出のインデックスのペア。この値は、L 個のペアを含む L 行 2 列の行列として返されます。最初の列はトラックのインデックスを表し、2 番目の列は検出のインデックスを表します。

データ型: uint32

割り当てのないトラック。P 要素ベクトルとして返されます。P は割り当てのないトラックの数を表します。各要素は、検出が割り当てられていないトラックを表します。

データ型: uint32

割り当てのない検出。Q 要素ベクトルとして返されます。Q は割り当てのない検出の数を表します。各要素は、どのトラックにも割り当てられなかった検出を表します。これらの検出は新しいトラックから始めることができます。

データ型: uint32

参照

[1] Miller, Matt L., Harold S. Stone, and Ingemar J. Cox, “Optimizing Murty's Ranked Assignment Method,” IEEE Transactions on Aerospace and Electronic Systems, 33(3), 1997.

[2] Munkres, James, “Algorithms for Assignment and Transportation Problems,” Journal of the Society for Industrial and Applied Mathematics, Volume 5, Number 1, March, 1957.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

R2012b で導入