基於FairMOT訓練的多人臉跟蹤(Multi-face tracking)速度和精度都非常好

2020-09-21 12:00:36

1.前言
最近研究了一下目標跟蹤演演算法,如deepsort,CenterTrack,JDE,FairMOT等,FairMOT是目前單類多目標SOTA演演算法,並且是one-shot MOT框架,可以根據自己需求修改為多類多目標跟蹤,於是突發奇想基於此修改一個人臉跟蹤演演算法。此部落格記錄本人開發人臉跟蹤的全過程,包括資料準備,模型修改,訓練調參fine-tuning,模型轉換onnx,部署等

2.準備工作

CenterNet:論文
FairMOT:論文
FairMOT程式碼:https://github.com/ifzhang/FairMOT
閱讀相關論文和原始碼,對跟蹤原理有一個總體理解,也可以結合部落格和知乎文章來加深理解,但部落格大多是copy文章或內容浮於表面,我們學習中也要學會從眾多資訊中取其精華去其糟粕,快速有效的學到我們需要的內容。個人認為最好是直接看原始碼。

3.執行FairMOT

本人環境:Ubuntu18 torch==1.6 2070GPU(安裝好cuda,cudnn)。

FairMOT中DCN需要編譯,此方法本人親測成功:git clone https://github.com/lbin/DCNv2/tree/pytorch_1.6 cd DCNv2 && ./make.sh。如果實在無法編譯可選擇註釋掉model.py下的import DCN相關程式碼
下載好model和CUHK-SYSU資料集,執行demo和訓練程式碼確保專案正常執行,選擇資料量最小的CUHK-SYSU資料集執行訓練程式碼只是讓我們知道資料的和label的格式,以及訓練過程中資料和label的處理全過程。瞭解原始碼對輸入資料和label的處理過程後我們準備人臉跟蹤資料集。

4.人臉跟蹤資料準備
我們知道了FairMOT是one-shot MOT框架,即一步完成目標檢測和目標跟蹤,目前學術界對跟蹤主要是行人和車輛的研究,那就沒有人臉跟蹤的開源資料集,那麼我們需要自己標註資料集嗎?答案是不用的,解決困難的最好方法是繞過困難,開源有大量的臉部辨識和檢測資料集,將兩者結合就能製作一個品質還可以的人臉跟蹤資料集了。我們先選一個稍微簡單的人臉檢測資料FDDB,用於訓練檢測部分,然後用CASIA-Webface做Reid的訓練,那麼如何將兩個資料集merge呢?就需要對上一步FairMOT對資料label的充分理解了。
label格式:
[class] [identity] [x_center] [y_center] [width] [height]
只跟蹤單類人臉即[class]全為0
FDDB不進行reid訓練所以設定 [identity]=-1,通過mask的方式使FDDB不進行reid的loss計算
CASIA-Webface將相同身份設定相同[identity] , 通過人臉檢測演演算法如centerface計算出所有人臉的[x_center] [y_center] [width] [heig]

這樣人臉跟蹤資料集就做好了,格式和CUHK-SYSU相同

5.開始訓練
由於DCN對部署非常不友好,我先用HRnet18小試一下牛刀,一開始訓練可以什麼都不用改,只需將CUHK-SYSU替換成人臉跟蹤資料集,訓練5個epoch後會儲存第一個模型,我們先執行一下demo,確保資料製作沒問題,防止資料錯誤還繼續訓練浪費時間,當我們看到能夠跟蹤人臉時(雖然精度還不高)可以放心繼續訓練了。如果什麼都沒有,就要檢查資料了,我也是重複製作了兩三次資料後才成功訓練的。由於HRnet超強的提取特徵能力訓練到30 epoch就能達到收斂。過程中有任何問題下你看Issues,合理的利用issues很關鍵,然後在Google或百度
2020-09-18-15-08: epoch: 37 |loss -0.294533 | hm_loss 0.015708 | wh_loss 0.382619 | off_loss 0.053386 | id_loss 0.565185 | time 6.833333 |

HRnet也是一個非常優秀的論文,在分類,分割,檢測,對齊,姿態等方面都十分給力。
HRnet
6.fine-tuning
hrnet18做backbone在2070能跑30FPS,但換到其他裝置速度就嚴重不實時,這時我們需要使用其他輕量一點的模型做backbone,如mobilenet系列,EfficientNet系列,起初我使用mobilenetv2做backbone訓練,但一直無法收斂,後來我在mobilenet中加上了fpn目的是效仿hrnet融合高低層特徵,loss下降明顯,但是仍然無法達到HRnet的跟蹤效果,後來經過調整學習率,優化器Adam和SGD,學習率衰減策越按step衰減和餘弦衰減,warm up,loss函數等一系列調參實驗,模型收斂到一個最佳效果,但是對小人臉效果任然不穩定,目標丟失容忍時間短,目標丟失後容易切換ID,
後面我受到retinanet的啟發,由於我以前訓練過retinaface,在FaceMOT(FairMOT的人臉跟蹤版)上加上multi-scale,對輸入資料做(608,480)等比例尺寸縮放訓練,全折積模型接受任意輸入, FairMOT原版為1088,608固定輸入,我修改為適合人臉的輸入,最終使用mobilenet_fpn做backbone訓練模型至收斂,速度(80FPS)和精度(目標丟失1S內能夠跟蹤回)都滿足要求,並且mobilenet易於移植。
FaceMOT

總結
由於篇幅有限,本文中許多實現細節沒有講,注重的是一個演演算法的實現流程,演演算法的核心還是要有好的idea,如何根據自己的實際場景需求與算力成本來客製化實現。