---
# System prepended metadata

title: Multiple Object Tracking (MOT)
tags: [tracking, 2022Q2技術研討]

---


###### tags: `2022Q2技術研討`, `tracking`

# Multiple Object Tracking (MOT)
## Introduction

物件追蹤包含兩個部分:
* <font color=#20639B>物件偵測</font> (Object detection)
    * 物件偵測在眾多算法百家爭鳴下， 其準確度已經高到一個境界，舉凡 YOLO, SSD, Retinanet, CenterNet, …都是很好的選擇，它的功用就是要抓到 image 內的 bounding box 以及物件classification
* <font color=#20639B>追蹤器</font> (tracker)
    * 追蹤器要做的事呢基本上就是==判斷前後 frame 抓到的 object 是否屬於同一個==，若是則 assign 相同 ID，若否則 assign 新的 ID。如下圖，frame t 檢測到的 3 個 objects (黃、藍、紅)，frame t+1 檢測到 4 個(灰色框)，而要如何把前後 frame 的框關連起來就是物件追蹤要做的事
![](https://i.imgur.com/sN8F43X.png)

## 追蹤器 (tracker)
### Central tracker

最直觀的做法就是直接把他 assign 給距離最近的框，而距離算法可以是歐式距離或 IoU
* 找出 bounding box 的中心點位，<font color=#20639B>算各中心的最短距離，再去 mapping</font> (OpenCV 就可以做了)

![](https://i.imgur.com/kUFFhDs.png)

參數有兩個要設定
* max disappear frame
    * 當一個 ID 沒被 assign 多少個 frame 後才被刪掉當做消失，這是用來避免短暫遮蔽或物件偵測不夠強導致 miss detect 的狀況
* max distance
    * 一般物體不太會瞬間移動到太遠的位置，所以設定這個參數避免物體一出一進直接 transfer ID

:::spoiler 缺點
:::info
在單純的環境下 (物件交疊狀況少，方向單一) 這種作法應該就能表現不錯了，但這種算法擺到比較複雜，物件會交錯的環境時就能明顯發現物件交錯導致重複 counting (ID switch or re-ID)
:::


---

### SORT (Simple Online And Realtime Tracking), 2015

由兩種演算法所組成 Kalman filter + Hungarian algorithm

<font color=#20639B>Kalman filter (卡爾曼濾波器)</font>
* 對於移動的物體，可以根據過去框的軌跡 (.., t-1, t) ==預測 t+1 框的位置==，以克服快速移動造成的距離誤差
* 如果只有追蹤一個框 (人或車)，使用 Kalman filter 預測 t+1 框，找到 t+1 observed 最接近的框很簡單 (nearest distance). <font color=#EA0000>比較複雜是同時要做多個框，而且必須是一一對應</font>，整體的 error distance 需要最小，所以需要 Hungarian algorithm 的幫忙~
:::spoiler 公式
![](https://i.imgur.com/DekaGem.jpg)
但基本上就是用物理的定律，從前幾幀去計算他的方向、加速度等，還會加入 noisy 去評估~
:::
<br>

<font color=#20639B>Hungarian algorithm (匈牙利演算法)</font>
* ==最佳化分配演算法==: 假設有 N 個人和 N 個任務，每個任務可以任意分配給不同的人，已知每個人完成每個任務要花費的代價不盡相同，那麼如何分配可以使得總體代價最小
* 以 object tracking 為例，Row 代表 observed bounding boxes; column 代表 predicted bounding boxes，其中的數值可以是歐式距離或是 IoT，得出的分配結果如下~
![](https://i.imgur.com/327tjxg.png =480x200)

<font color=#20639B>統整 SORT 的流程</font>
1. (Frame t): object detection 得到所有 bboxes, 給每一個 bbox unique ID 並且計算每一個框的中心點
2. (Frame t): 利用 Kalman filter, predict 每一個 bbox 在 t+1 frame 的位置
3. (Frame t+1): object detection 得到新的 bboxes, 並計算 cost matrix using IoU or 歐式距離
4. (Frame t+1): 利用 Hungarian algorithm 將 predict bboxes 和新的 bboxes 進行匹配，assign ID to 新的 bboxes
5. (Frame t+1): 更新 Kalman 的 mean and variance 參數

:::spoiler 缺點
:::info
易有 ID switch 的狀況發生
* 當一個物體被遮擋後，Kalman filter 仍然會再前一幀預測他的下一個位置，但下一幀物體被遮擋不見，若此時多一個新物體出現，Hungarian algorithm 有可能會誤分配。且遮擋完畢原本的物體出現後，可能會被辨識為新的物體，就會造成計數不準確~
:::


---

### Deep SORT, 2017

由 SORT 演化而來，<font color=#EA0000>SORT 的主要問題是無法有效解決 ID switches 的問題</font>，這個缺點主要是在 tracking through occlusions (遮擋) 容易發生錯誤，==而 deep sort 再加入了外觀的訊息== (appearance information) 來匹配前後 frame 的 object 降低錯誤

Deep SORT 和 SORT <font color=#20639B>主要的關鍵差異就是 cost matrix</font>. SORT 的 cost matrix 一般是 IoU or 歐式距離。 Deep SORT 的 cost matrix 則是合併 motion & appearance metric 得到

![](https://i.imgur.com/vj8QkE0.png)

* Motion Metric
    * 使用馬氏距離 (Mahalanobis distance) 而非歐式距離計算 distance
    * 馬氏距離的優點主要是<font color=#20639B>多考慮的其他維度的特徵</font> (又或者說其他特徵之間的關係)，計算距離時會先進行空間轉換~
* Appearance Metric
    * 比對 kalman filter 預測的框和下個 frame object detection 得到的<font color=#20639B>框兩者間圖像的相似度</font>，而圖像的相似度是透過 CNN 將 image embedding 到一個 128d 的空間並限制長度為1，然後計算cosine distance

最後再將兩個 metric 透過一個權重加權起來，總結來說 deep sort 比 sort 大大減少了ID switch 的問題，但<font color=#EA0000>最大問題是速度頗慢</font>，因為跑了兩個類神經網路，而且偵測到的人越多就需要越多次 inference，==無法達到 real-time detection==

如果沒有遮擋問題的話，Sort 的表現已經相當不錯，且速度上可以達到 real-time


---

### JDE (Jointly Detector and Embedding model), 2019

為了達到更快速的 MOT 算法，JDE <font color=#20639B>將 object detect 和 appearance embedding 融合在同一個網路裡一起訓練</font>
![](https://i.imgur.com/kXq5k4g.png =640x280)
* (a.) 就像 deep sort  將偵測到的圖片拿去跑 embedding network
* (c.) proposed method 一個網路直接算出 detection location, class, embedding feature

這種架構下網路需要 output 出三種東西: box classification, box regression, embedding feature，速度快也可以達到 real-time


---

### 近幾年較紅的演算法
* FairMOT (2020, encoder-decoder network)
* TransMOT (2021, Transformer)
* ByteTrack (2021, tracking BY associaTing Every detection box)
    * 沒有用圖像相似度比對，跟 Sort 一樣只用 detect 後面全靠演算法合併框，所以速度非常快~

![](https://i.imgur.com/F72mZuP.png =600x400)<br>
![](https://i.imgur.com/GmTTpy3.png =400x150)

**MOT 評估指標 (很多種)**
* Re-ID (Re-Identification)
    * 給定一張切好的行人圖像 (probe image, 即圖像大部分內容只包含這個人), 從一大堆切好的圖像 (gallery images) 中找到跟 probe image 中同一身份的人的圖像。這些圖像通常是由不同攝像頭拍攝的不連續幀
* MOTA (Multiple Object Tracking Accuracy)
    * 最基本的指標，用於統計在跟踪中的誤差累積情況，數值越大越好
        * 檢測缺漏數量 (某一個 id 應該要配對，但沒人跟他配對)
        * 誤判的數量 (不同 id 卻分配再一起)
        * 誤配的數量 (同一個 id 卻有分配不同 id，檢測遮擋)
![](https://i.imgur.com/lDz7N44.png =300x80)
* IDF1 (ID F1-score)
    * IDP (precision) + IDR (recall) 的加權平均
* IDS (ID switches)
    * ID轉變數，是指跟蹤軌跡中行人ID瞬間轉換的次數，通常能反應跟蹤的穩定性，數值越小越好


---

### ByteTrack (Tracking BY associaTing Every detection box), 2021

一般在做 tracking 會設一個門檻把 bbox 低的 confidence 篩掉 (當作是背景捨棄)，但 ByteTrack 會將他救回 (==能夠把低分數的框和背景分辨出來==，並且批配在一起)

流程 (大致與 SORT 相同):
1. (Frame t): 先分兩類，高分框 & 低分框
2. (Frame t): 利用 Kalman filter, predict 每一個 bbox 在 t+1 frame 的位置
3. (Frame t+1): <font color=#20639B>第一次匹配</font>，object detection 得到新的 bboxes, 並<font color=#EA0000>使用高分框</font>計算 cost matrix using IoU or 歐式距離
4. (Frame t+1): 利用 Hungarian algorithm 將 predict bboxes 和新的 bboxes 進行匹配，assign ID to 新的 bboxes
5. (Frame t+1): <font color=#20639B>第二次匹配</font>，剩餘的 bboxes, <font color=#EA0000>使用低分框</font>計算 cost matrix using IoU or 歐式距離
6. (Frame t+1): 利用 Hungarian algorithm 將 predict bboxes 和新的 bboxes 進行匹配，assign ID to 新的 bboxes
    * 在分數較低的框框中，往往都是被遮擋的人或是模糊的人，這時候使用 Re-ID 反而偵測不好
7. (Frame t+1): 更新 Kalman 的 mean and variance 參數

![](https://i.imgur.com/qDpLYSi.jpg =600x500)
* (a) 為原本偵測到的框框和分數
* (b) 為一般追蹤器的預測結果 (使用高分框)
* (c) 在使用低分框去追蹤~
