ホームページ  >  記事  >  バックエンド開発  >  SORT 追跡アルゴリズムとその Python 実装例の簡単な紹介

SORT 追跡アルゴリズムとその Python 実装例の簡単な紹介

WBOY
WBOY転載
2024-01-23 23:18:051279ブラウズ

SORT 追跡アルゴリズムとその Python 実装例の簡単な紹介

SORT (Simple Online and Realtime Tracking) は、カルマン フィルターに基づくターゲット追跡アルゴリズムであり、リアルタイム シーンで移動ターゲットを確実に追跡できます。 SORT アルゴリズムは、もともと 2016 年に Alex Bewley らによって提案されました。ビデオ監視、自動運転、ロボット ナビゲーションなど、コンピューター ビジョンの分野のさまざまなアプリケーションで広く使用されています。

SORT アルゴリズムは主に、カルマン フィルタリングとハンガリー アルゴリズムという 2 つの核となるアイデアに基づいています。カルマン フィルターはシステム状態を推定するためのアルゴリズムであり、システムの動的モデルとセンサーの測定値を使用してシステム状態を予測および更新し、状態推定の精度を向上させることができます。ハンガリー アルゴリズムは、2 部グラフの最大重み一致問題を解くために使用されるアルゴリズムで、2 部グラフから最大重み一致を見つけることができます。

SORT アルゴリズムの主な手順は次のとおりです。

ターゲット検出: ターゲット検出アルゴリズム (YOLO、SSD など) を使用します。 .) 現在のフレームのターゲット情報内のオブジェクトを抽出します。

状態予測: 追跡されたターゲットごとに、カルマン フィルターを使用してその状態を予測します。

データ関連付け: 現在のフレームの予測ステータスとターゲット情報に基づいて、ハンガリーアルゴリズムを使用してデータ関連付けを実行し、現在のフレームで追跡された各ターゲットに対応するターゲットを見つけます。 。

ステータス更新: 追跡されたターゲットごとに、カルマン フィルターを使用してステータスを更新します。

ターゲット出力: 追跡された各ターゲットのステータス情報と追跡結果を出力します。

コンピュータ ビジョンでは、SORT アルゴリズムをさまざまなターゲット追跡シナリオに適用できます。たとえば、ビデオ監視では、SORT アルゴリズムは移動するターゲットをリアルタイムで追跡できるため、現場での異常な動作の検出と早期警告が可能になります。自動運転の分野では、SORT アルゴリズムは他の車両、歩行者、その他の交通参加者を追跡して、車両の自律ナビゲーションと障害物回避を実現できます。ロボット ナビゲーションでは、SORT アルゴリズムは移動ターゲットを追跡して、ロボットの自律ナビゲーションと障害物回避を実現します。

以下は、Python で実装された簡単なサンプル コードです。

#python
import numpy as np
from filterpy.kalman import KalmanFilter
from scipy.optimize import linear_sum_assignment

class Track:

def init(self,prediction,track_id,track_lifetime):
    self.prediction=np.atleast_2d(prediction)
    self.track_id=track_id
    self.track_lifetime=track_lifetime
    self.age=0
    self.total_visible_count=1
    self.consecutive_invisible_count=0

def predict(self, kf):
    self.prediction = kf.predict()
    self.age += 1

def update(self, detection, kf):
    self.prediction = kf.update(detection)
    self.total_visible_count += 1
    self.consecutive_invisible_count = 0

def mark_missed(self):
    self.consecutive_invisible_count += 1

def is_dead(self):
    return self.consecutive_invisible_count >= self.track_lifetime

class Tracker:

def init(self,track_lifetime,detection_variance,process_variance):
    self.next_track_id=0
    self.tracks=[]
    self.track_lifetime=track_lifetime
    self.detection_variance=detection_variance
    self.process_variance=process_variance
    self.kf=KalmanFilter(dim_x=4,dim_z=2)
    self.kf.F=np.array([[1,0,1,0],
                    [0,1,0,1],
                    [0,0,1,0],
                    [0,0,0,1]])
    self.kf.H=np.array([[1,0,0,0],
                    [0,1,0,0]])
    self.kf.R=np.array([[self.detection_variance,0],
                    [0,self.detection_variance]])
    self.kf.Q=np.array([[self.process_variance,0,0,0],
                    [0,self.process_variance,0,0],
                    [0,0,self.process_variance,0],
                    [0,0,0,self.process_variance]])

def update(self, detections):
    # predict track positions using Kalman filter
    for track in self.tracks:
        track.predict(self.kf)

    # associate detections with tracks using Hungarian algorithm
    if len(detections) > 0:
        num_tracks = len(self.tracks)
        num_detections = len(detections)
        cost_matrix = np.zeros((num_tracks, num_detections))
        for i, track in enumerate(self.tracks):
            for j, detection in enumerate(detections):
                diff = track.prediction - detection
                distance = np.sqrt(diff[0,0]**2 + diff[0,1]**2)
                cost_matrix[i,j] = distance
        row_indices, col_indices = linear_sum_assignment(cost_matrix)
        unassigned_tracks = set(range(num_tracks)) - set(row_indices)
        unassigned_detections = set(range(num_detections)) - set(col_indices)
        for i, j in zip(row_indices, col_indices):
            self.tracks[i].update(detections[j], self.kf)
        for i in unassigned_tracks:
            self.tracks[i].mark_missed()
        for j in unassigned_detections:
            new_track = Track(detections[j], self.next_track_id, self.track_lifetime)
            self.tracks.append(new_track)
            self.next_track_id += 1

    # remove dead tracks
    self.tracks = [track for track in self.tracks if not track.is_dead()]

    # return list of track positions
    return [track.prediction.tolist()[0] for track in self.tracks]

上記のコードは、カルマン フィルターを使用してターゲットの位置を計算し、速度 予測と推定を行い、ハンガリーのアルゴリズムを使用してターゲットを関連付け、最後にターゲットが連続して見えなくなった回数に基づいてターゲットが死亡しているかどうかを判断し、死亡したターゲットを削除します。上記のコードは、単純な SORT 追跡アルゴリズムを実装しています。カルマン フィルターを使用してターゲットの位置と速度を予測および推定し、次にハンガリーのアルゴリズムを使用してターゲットを関連付け、最後にターゲットが死亡しているかどうかを判断し、数値に基づいて死亡を除去します。目標の連続した目に見えない時間の目標。

SORT アルゴリズムに加えて、カルマン フィルター、粒子フィルター、マルチターゲット追跡など、他の多くのターゲット追跡アルゴリズムがあります。各アルゴリズムには、適用可能なシナリオ、利点と欠点があります。実際のアプリケーションでは、特定のシナリオとニーズに基づいてターゲット追跡のための適切なアルゴリズムを選択する必要があります。

以上がSORT 追跡アルゴリズムとその Python 実装例の簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は163.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。