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