YOLOv8の物体追跡(MOT):BoT-SORTとByteTrackのパラメータを調査
現在、追跡アルゴリズムとしてBoT-SORTとByteTrackをサポートしているようです。
本記事では、YOLOv8がサポートする物体追跡(MoT, Multiple Object Tracking)アルゴリズムのBoT-SORTとByteTrackについて調査した結果です。YOLOv8では複数の物体を追跡する2つの手法をサポートしています。この記事では2つの手法を調べてみました。
MoTとは
MoTとはMultiple Object Trackingの略で、動画中の複数の物体を追跡する手法のことです。
複数のオブジェクトを追跡する場合、すれ違いやオクルージョン発生時にいかに正しく追跡できるかが重要です。MoTアルゴリズムは、このような場合でもうまく追跡できるように開発された手法となります。
ところで、YOLOv8では、TrackingタスクとしてBoT-SORTとByteTrackの2つをサポートしています(2023.09現在)が、これらの違いがよく分かりません。
この記事では、とりあえず、2つの違いを簡単に調べてみました。
細かなアルゴリズムは、他の解説に譲ります。
ByteTrack
ByteTrackは、2021年10月に発表されたMoTの手法の1つです。
ByteTrackでは、これまでの手法がスコアが閾値より低いオブジェクトの追跡を行っていなかった部分を改良し、低い信頼性の検出結果のオブジェクトも追跡することで性能向上を図っています。
単純に、低い閾値のものも追跡すると処理量がかかるので、Byteという仕組みを利用して信頼度の異なるオブジェクトのバウンディングボックスの処理を行っています(詳しくは、ArXivの論文等を参照のこと)。
これにより、信頼度の低いバウンディングボックスを捨てずに処理しつつ、高速動作を実現しています。信頼度の低いバウンディングボックスも処理しておくことで、追跡時のミスを減らそうというアプローチだと思われます。
下のグラフは他のMoT手法との比較ですが、これを見ると、発表時点では高い性能と高速性を両立していることがわかります。
FiarMOTが登場してそんなに立っていないのに、すぐに新しい手法が出てくるのは本当に驚きです。この業界、進歩が早いなーと感じます。
BoT-SORT
BoT-SORTは、2022年6月に発表されたMoTの手法です。ByteTrackより8ヶ月ほど後になります。
BoT-SORTは、ByteTrackをベースに、カルマンフィルター・カメラモーションの補正・マッチング手法に改善を加えたもののようです。カルマンフィルターなどは古典的なアルゴリズムですが、これだけで追跡を行っている手法もあることからわかるように、それなりの精度があります。複数の判断基準を使ってより追跡をうまくやるのがBoT-SORTのようです。
性能評価結果は以下のようになります。公式のベンチマークを見る限り、ByteTrackの改良型なので、ByteTrackを上回る性能を実現しています。
論文にも、以下のような記述があり、ByteTrackと比較して性能向上していることが示されています。
YOLOv8でどちらを使うか
BoT-SORTがByteTrackの改良版であると考えると、問題がなければBoT-SORTを利用すれば良い気がします。ただ、ベンチマークの比較では上でも実際に使ってみると、「自分のケースでは他の手法の方が性能が出る」ということもあるので、そこは注意が必要かと思います。
ただ、とりあえず、BoT-SORTを試してみるというスタンスで良いかなと思います。
全然違う方式なら悩みどころですが、改良版ということなので新しい方で良いと考えています。
BoT-SORTのパラメータ(YOLOv8)を調べてみた
以下は、YOLOv8のデフォルトパラメートのbotsort.yamlファイルです。
設定の仕方は以下の記事を参照してください。
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のパラメータに分けることができて、以下のようになります。
パラメータ名 | 意味 |
tracker_type | ‘botsort’, ‘bytetrack’のどちらかを指定 |
track_high_thresh | 1つめの閾値 |
track_low_thresh | 2つめの閾値 コードをみると、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は特徴量の記述として有名です
パラメータ名 | 意味 |
gmc_method | ‘sparseOptFlow’のみ? コードをみると、orb, sift, eccも使えるように見える。 |
proximity_thresh | ReID関連は現在サポートしていない |
appearance_thresh | ReID関連は現在サポートしていない |
with_reid | ReID関連は現在サポートしていない |
パラメータの説明がないので、とりあえずソースコードを見ました。これらのパラメータは現在のところ、トラッカー関連のコードの部分で参照されていました。
それほど長いコードではないので、チューニングに困ったらソースコードを見ていけばいい感じです。
終わりに
とりあえず、ByteTrackとBoT-SORTについて、そしてYOLOv8での実装について調べてみました。YOLOv8の実装は、まだ途上という感じです。ただ、動かしてみた感じでは十分使えそうなので、活用して行きたいと思います。