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也是一個非常優秀的論文,在分類,分割,檢測,對齊,姿態等方面都十分給力,

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易于移植,

總結
由于篇幅有限,本文中許多實作細節沒有講,注重的是一個演算法的實作流程,演算法的核心還是要有好的idea,如何根據自己的實際場景需求與算力成本來定制實作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/99634.html
標籤:其他
