機械学習
記事内に商品プロモーションを含む場合があります

YOLOv8の物体追跡(MoT)の手法を調べてみた(パラメータなど)

tadanori

現在、追跡アルゴリズムとしてBoT-SORTとByteTrackをサポートしているようです。

MoTとは

MoTとはMultiple Object Trackingの略で、動画中の複数の物体を追跡する手法のことです。

YOLOv8では、TrackingタスクとしてBoT-SORTとByteTrackの2つをサポートしています(2023.09現在)が、これらの違いがよく分かりません。とりあえず、2つの違いを簡単に調べてみました。

細かなアルゴリズムは、他の解説に譲ります。

ByteTrack

ByteTrackは、2021年10月に発表されたMoTの手法の1つです。

ByteTrackでは、これまでの手法がスコアが閾値より低いオブジェクトの追跡を行っていなかった部分を改良し、低い信頼性の検出結果のオブジェクトも追跡することで性能向上を図っています。

単純に、低い閾値のものも追跡すると処理量がかかるので、Byteという仕組みを利用して信頼度の異なるオブジェクトのバウンディングボックスの処理を行っています(詳細は、ArXivの論文等を読んでください)。

これにより、信頼度の低いバウンディングボックスを捨てずに処理しつつ、高速動作を実現しています。

下図は他のMoT手法との比較ですが、これを見ると、発表時点では高い性能と高速性を両立していることがわかります。

ByteTrackの性能
出典:https://github.com/ifzhang/ByteTrack

ちょっと前、FiarMOTを覚えたばかりなのに、すぐに新しいやつが出てくるのは本当に驚きです。この業界、進歩が早いなーと感じます。

BoT-SORT

BoT-SORTは、2022年6月に発表されたMoTの手法です。ByteTrackより8ヶ月ほど後になります。

BoT-SORTは、ByteTrackをベースに、カルマンフィルター・カメラモーションの補正・マッチング手法に改善を加えたもののようです。

性能評価結果は以下のようになります。公式のベンチマークを見る限り、ByteTrackの改良型なので、ByteTrackを上回る性能を実現しています。

BoT-SORTのベンチマーク
出典:https://github.com/NirAharon/BoT-SORT

論文にも、以下のような記述があり、ByteTrackと比較して性能向上していることが示されています。

ByteTrackと比較した性能評価

YOLOv8でどちらを使うか

BoT-SORTがByteTrackの改良版であると考えると、問題がなければBoT-SORTを利用すれば良い気がします。ただ、ベンチマークの比較では上でも実際に使ってみると、「自分のケースでは他の手法の方が性能が出る」ということもあるので、そこは注意が必要かと思います。

ただ、とりあえず、BoT-SORTを試してみるというスタンスで良いかなと思います。

全然違う方式なら悩みどころですが、改良版ということなので新しい方で良いと考えています。

BoT-SORTのパラメータ(YOLOv8)を調べてみた

以下は、YOLOv8のデフォルトパラメートのbotsort.yamlファイルです。

設定の仕方は以下の記事を参照してください。

あわせて読みたい
YOLOv8で物体追跡を実践|YOLOv8は追跡もできるらしい
YOLOv8で物体追跡を実践|YOLOv8は追跡もできるらしい
デフォルトのパラメータ(botsort.yaml
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Default YOLO tracker settings for BoT-SORT tracker https://github.com/NirAharon/BoT-SORT

tracker_type: botsort # tracker type, ['botsort', 'bytetrack']
track_high_thresh: 0.5 # threshold for the first association
track_low_thresh: 0.1 # threshold for the second association
new_track_thresh: 0.6 # threshold for init new track if the detection does not match any tracks
track_buffer: 30 # buffer to calculate the time when to remove tracks
match_thresh: 0.8 # threshold for matching tracks
# min_box_area: 10 # threshold for min box areas(for tracker evaluation, not used for now)
# mot20: False # for tracker evaluation(not used for now)

# BoT-SORT settings
gmc_method: sparseOptFlow # method of global motion compensation
# ReID model related thresh (not supported yet)
proximity_thresh: 0.5
appearance_thresh: 0.25
with_reid: False

パラメータはBoT-SORT, ByteTrack共通部分とBoT-SORTのパラメータに分けることができて、以下のようになります。

BoT-SORT, ByteTrack共通パラメータ
パラメータ名意味
tracker_type‘botsort’, ‘bytetrack’のどちらかを指定
track_high_thresh1つめの閾値
track_low_thresh2つめの閾値
コードをみると、track_low_thresh < score < track_high_threshの範囲が対象となるように書かれている
new_track_thresh追跡中のどれとも一致しない場合に新しい追跡を始める場合の閾値
track_bufferトラックを削除する時間を計算するためのバッファ
match_thresh一致すると判断する閾値

上記のパラメータはソースコードのByteTrackerの部分で参照されています。

以下は、BoT-SORTのパラメータです。残念ながらReID関連の部分がまだサポートされていないようです。また、sparseOptFlow以外も選択できるようですが、基本はこれを使うみたいです。ちなみに、GMCはGolbal Motion Compensationの略で、BoT-SORTの論文に出てきます(以下が該当する部分)。

※ちなみに、siftとかorbは特徴量の記述として有名です

論文の該当部分
BoT-SORTパラメータ
パラメータ名意味
gmc_method‘sparseOptFlow’のみ? コードをみると、orb, sift, eccも使えるように見える。
proximity_threshReID関連は現在サポートしていない
appearance_threshReID関連は現在サポートしていない
with_reidReID関連は現在サポートしていない

パラメータの説明がないので、とりあえずソースコードを見ました。これらのパラメータは現在のところ、トラッカー関連のコードの部分で参照されていました。

それほど長いコードではないので、チューニングに困ったらソースコードを見ていけばいい感じです。

終わりに

とりあえず、ByteTrackとBoT-SORTについて、そしてYOLOv8での実装について調べてみました。YOLOv8の実装は、まだ途上という感じです。ただ、動かしてみた感じでは十分使えそうなので、活用して行きたいと思います。

おすすめ書籍

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました