# Anomaly Detection in Video via Self-Supervised and Multi-Task Learning
###### tags: `2022Q2技術研討`, `detection`
[paper] [Anomaly Detection in Video via Self-Supervised and Multi-Task Learning](https://arxiv.org/pdf/2011.07491.pdf)
[GitHub] [連結](https://github.com/lilygeorgescu/AED-SSMTL)
* 沒有公開 release code,但可以寫信去要,純學術用途的樣子~~
## Video Anomaly Detection
影片異常檢測基本上是==非監督學習==的 task,<font color=#20639B>目標在於發現影片中異常的模式或動作</font>,這些異常定義是不頻繁的或者說是稀有事件。==異常通常是缺乏標記的==,自然也缺乏標記數據來訓練
* 異常包括有變化多樣的少有的異常事情和沒見過的物體等
資料集大概可以分為三種:
* Supervised:訓練資料集有經過標注,分為正常與異常
* Clean:所有訓練資料集都是正常的,測試集則包含正常與異常
* Unsupervised:訓練資料集沒有經過標注,包含正常與異常
### Compare with ML outlier detection
* ML 訓練的資料集特徵已經經過特徵萃取 -> 特徵向量,而 VAD 是在 raw data 中去尋找異常
* VAD 針對的是影片資料,不單單像 ML 只要解決 outlier 的識別,<font color=#20639B>也要處理時間與空間訊息</font>
* 因此 VAD 包括多種任務:動作識別、動作相似度、場景分類、物體識別、視頻語義分割、人的姿態評估、人的行為識別等~~
### Common Datasets
* UCSD: 一個主體為行人的數據集,異常包括有異常物體的出現:例如騎自行車者和輪椅、車等。還有行人走在一些並不是常見的地方也會被認為是異常

* CUHK Avenue: 學校校園的視頻,其中檢測的主要是行人的異常動作、錯誤移動方向、異常物體的出現等

* Shanghai Tech: 上海街道實拍的影像

:::success
但 VAD 有一個小優點,也就是==背景幾乎是不變動的== (只要 CCTV 角度不變)
:::
## Abstract
2021 CVPR 的 paper!
由 University of Bucharest (布加勒斯特大學,羅馬尼亞)、MBZ University of Artificial Intelligence (人工智能大學,阿拉伯聯合大公國)、University of Central Florida (中佛羅里達大學,美國) 聯合發表的論文~~
Anomaly detection in video 在 CV 領域中是一項很困難的技術,==主要是因為 lack of anomalous events at training time==,所以無法使用一般的監督式學習進行訓練。在這篇 paper 當中,<font color=#20639B>提出了自監督式架構 (self-supervised) + 多任務學習 (multi-task learning)</font> 的結合
最後本篇的實驗結果屌打過去所有的 video anomaly detection in <font color=#8600FF>Avenue</font>, <font color=#8600FF>ShanghaiTech</font> and <font color=#8600FF>UCSD Ped2</font> datasets.
:pushpin: 自監督學習就是: 我們手上有一堆沒有 label 的資料,想辦法用資料本身做出 label,而後用這些 label 訓練一個監督式模型
### Why Multi-task Learning
論文中有提到一個很有趣的點,==為何要用多任務學習去做==,而不只學習一個單一的 task
* 過去有些方法在做<font color=#20639B>預測影片的物件的下一步</font>或下幾幀 (frame) 會做出什麼動作,然後<font color=#20639B>再跟真實答案去做比對</font>,如果差異很大就代表是異常行為,可以被定義為 anomaly label
:::info
:question: 但這樣可能會有什麼問題 :question:
* 假設有一輛停在路邊的汽車,model 可能會預測他下一步會往前,但事實上他是靜止不動的,但並不代表異常
* 也有可能是 model 預測他靜止,但他之後開走了被定義為異常
:::
## Methods

* **Object detection model of Yolov3**
* 抓出影片中 object 的 bounding box,再依時間排列,稱為 object-centric temporal sequence
* (i−t, ..., i−1, i, i+1, ...., i+t)
* 直接拿 MS COCO 的 pre-trained model,沒有再另外 train
<br>
* **Multi-task learning**
* ==Task1: Arrow of time==
* <font color=#20639B>識別正向與反向的 moving objects</font>,預測 object-centric temporal sequence 是 forward or backward,偵測異常方向運動物體,比如單行車道中逆向的車輛
* <font color=#FF8000>Input</font> 五幀正反順序的 object
* (t-2, t-1, t, t+1, t+2) & (t+2, t+1, t, t-1, t-2)
* <font color=#FF8000>label</font> 正向 (1, 0) or 反向 (0, 1)
* Loss function (cross-entropy)
* 
* ==Task2: Motion irregularity==
* <font color=#20639B>識別異常的行為/動作</font>,預測 object-centric temporal sequence 是否連續,偵測快速移動的物體,例如學校走廊內不允許奔跑,行走會被監測為相鄰幀 (正常),奔跑會被檢測為間隔幀 (異常)
* <font color=#FF8000>Input</font> 五幀正常順序 & 五幀隨機間隔的正向順序 (random from 1, 2, 3, 4)
* (t-2, t-1, t, t+1, t+2) & (t-3, t-1, t, t+3, t+5)
* <font color=#FF8000>label</font> 相鄰幀 (1, 0) or 間隔幀 (0, 1)
* Loss function (cross-entropy)
* 
* ==Task3: Middle bounding box prediction==
* <font color=#20639B>預測中間 (空缺) 的 bounding box 點位</font>,利用前兩幀與後兩幀重構當前幀的 bounding box,正常類別得到較小的重構誤差,異常類別得到較大的重構誤差
* <font color=#FF8000>Input</font> 前後兩幀對應的 bounding box
* (t-2, t-1, t+1, t+2) 的 bbox
* <font color=#FF8000>label</font> 空缺那格的 bbox
* Loss function (L1 loss)
* 
* ==Task4: Model distillation==
* 用 Yolov3 & Resnet50 (teacher model) 去 distillation 3D CNN (student model),用意就是<font color=#20639B>讓 3D CNN 有更好的特徵提取能力</font>
* 學 Yolov3 的 class probability predict
* 學 Resnet50 的 pre-softmax features
* <font color=#FF8000>Input</font> 當前幀對應的 bounding box
* t 的 bbox
* <font color=#FF8000>label</font> ResNet50 softmax 前一層輸出 (1000維) + Yolov3 80 個類別的 one-hot 編碼
* Loss function (L1 loss)
* 
<br>
* **3D Convolution Neural Network**
* 3D CNN (filter 多一個維度) 是==透過這 4 種 task 所 train 出來的==,但為了應付這種連續的 3 維影像,作者認為有可能會<font color=#20639B>需要更寬或更深的網路</font>才能夠容納這種更複雜的問題,所以一共做了四種實驗 (shallow+narrow / shallow+wide / deep+narrow / deep+wide)

* Task 3 經過 3D CNN 後,多做一層 upsample 以提取更多的空間特徵,再進 loss
<br>
* **Joint loss function**
* 最後會有一個==聯合的 loss function==,也就是加總這四個 loss。通過實驗發現,LT4 相較於其他損失,數值較大,所以為了避免影響最終結果,增加權重 𝛌 平衡損失
* 
## Inference
總結一下最後的過程,以及如何進行 inference
1. 使用 Yolov3 去 detect each frame i 的 objects
2. crop 每一個 object 再依順序組成 object-centric sequence (i−t, ..., i−1, i, i+1, ...., i+t)
3. 組成每一個 task 的 input,依序會得到 Y(T1), Y(T2), Y(T3), Y(T4)
* Y3 & Y4 都會拿來跟 Yolov3 預測出的結果計算誤差
4. 最後加總四個分數做平均,即可得到 anomaly score

:::info
:question: inference 時怎麼會得到未來 i+1 / i+2 的 frame:question:
:::
## Experiments
拿 Avenue, ShanghaiTech and UCSD Ped2 這三種 datasets 進行實驗~ <font color=#20639B>training data 只有 normal 的狀態,但 testing data 包含 normal & abnormal</font>
實驗中 t = 3,所以 object-centric sequence = 7 * 64 * 64 * 3

上圖列出了從 2016 年一直到 2020 各大研究的實驗結果~~ ==Frame level of AUC scores==
* Results on Avenue: 過去只有兩篇達到 90% 以上,算出來的 Anomaly score 與 ground truth 幾乎高度正相關

* Results on ShanghaiTech: 屌打過去所有實驗~ 同樣 Anomaly score 與 ground truth 高度正相關

* Results on UCSD Ped2: 最知名的 VDA 資料及之一,幾乎所有研究都會拿它來進行評估,本篇仍有最好的成績
另外也有針對各個 task 的細項評估~
