在去年,我們團隊決定參加由愛奇藝聯合PRCV會議舉辦的第一屆多模態視訊人物識別挑戰賽,為了這個挑戰賽愛奇藝準備了迄今為止最大的人物視訊資料集(IQIYI_VID)。參賽比賽的過程中我們團隊經歷了沉穩-自信-壓力-興奮的心理路程,十分有趣。
挑戰賽的資訊是從一個技術交流的群裡瞭解到的, 因為挑戰賽的方向比較合適目前的研究方向, 就毫不猶豫的註冊參加了。我們團隊WitcheR(名字來源某著名遊戲)包括3個成員:IBUG Jiankang Deng、公司的小夥伴JackYu 和我。我們團隊的合作模式比較簡單,沒有特別明確的分工,在比賽過程中中團隊成員會相互交流想法,共同找出當前可能存在的問題與改進點,最終由我統一彙總來實現和驗證。
在這次比賽中我們不僅積累了視訊特徵處理、檢索的一些經驗,同時也認識了業界的一些夥伴、朋友,並且進行了深入的學習和交流。
一、準備策略:
愛奇藝舉辦的視訊人物識別挑戰賽是一個針對視訊的人物檢索競賽,賽題邏輯比較簡單:在視訊資料集IQIYI_VID中,計算出該視訊包含的人物是誰。整個資料庫包含50萬條視訊,5000名人物(噪音清理後4934), 每條視訊的長度是1~30秒。愛奇藝準備的這份資料集很特別,做到了資料的大和乾淨,其中視訊數量和包含的人物數量截至目前都是最高的,並且噪音維持在了一個極低的水平, 對檢驗模型演算法效能有很好的參考意義。
對視訊人物檢索問題來說,我們可能可以利用的資訊有:
- 人臉識別模型
- 人頭識別模型
- 行人重識別模型
- 圖片場景模型
- 聲紋模型
- 人體姿態模型
在我們這次必定的方案中只用到了(1)和(4)。理由是:
- 人頭識別缺少資料集
- ReID model可以和recognition model同時存在, 但泛化效能不如, 組合後會帶來提升還是下降未知
- 聲紋模型不熟悉
4.人體姿態步伐做人物識別更有些虛無縹緲
5.人臉識別是最重要的特徵, 在能看到臉的視訊裡面起決定性作用
6.圖片場景模型可以對檢不到臉的場景做一些補充
第一波資料公佈後我利用空閒時間開始了實驗, 用各種策略評估官方第一次提供的訓練/驗證集合的精度:
1.幀速, 即每隔多少幀抽一次人臉/圖片特徵
2.檢測器選擇, 更準的檢測器是否相比MTCNN帶來更高的精度.
3.人臉特徵聚合, 如何用特徵來表示一個視訊
4.獲得視訊特徵後如何更好的提升檢索效能
5.用什麼人臉識別模型和圖片場景模型
- 正式啟動:第一次提交成績第一 但很快被超過
在官方釋出了所有資料集和測試集後,因為先期積累了一些經驗,我們決定專門騰了一臺8卡P40來做這個任務。
我們用了自己研發和訓練的一個one stage檢測器來同時檢測人臉和關鍵點做對齊,相比MTCNN,在phase1的validation set上能有差不多1個點的mAP提高。不管是在這個比賽中,還是其他的應用裡,我們都發現關鍵點的精度是非常重要的,更精準的關鍵點能帶來更好的識別效能。這個檢測器也會很快在insightface上開源。人臉識別的模型訓練資料我們用了 MS1M-Arcface(emore)+ Glint-Asia 的組合, 沒有采用任何私有資料。 Loss function用我們剛剛被CVPR 2019接收為oral的Arcface:
網路結構沿用了paper裡面提出的ResNet100和IR Block:
對每段視訊我們間隔3幀抽一次特徵(~8FPS), 並對所有特徵取平均來獲得該視訊的特徵. 在這個過程中我也嘗試了一些其他方法:
- 根據feature norm去掉模糊人臉,有提升
- 增加flip augmentation,沒有提升
- 增加color jittering augmentation,效能下降
4.根據人臉5點估計姿態,並進行分組處理,沒有提升
在獲取每個視訊的特徵向量後,我們就可以通過簡單的向量夾角來衡量視訊之間的相似度,並根據測試視訊和所有訓練視訊中最相似的視訊來輸出預測結果。這時候我提交了第一個結果,test mAP:79.8. 當時只有不到10個人提交,暫列第一, 但很快被超過。
二、調整策略:加速
A) MLP:
在上面的方法中有一個缺陷,實際上我們並沒有用到訓練集視訊來做訓練。我也嘗試過把訓練集的視訊人臉圖片抽取出來放到識別的訓練集裡,但效果並不好。那如何才能用到這些訓練集資訊? 答案是直接用視訊向量做為輸入訓練一個多層感知機(MLP)。最簡單的多層感知機很直觀,輸入512 embedding,通過2個全連線層,來預測該向量屬於某個人物分類的概率,最後加softmax loss來BP。但這裡面的設計就又有不同,多少層最好,每層的寬度多少, 用不用BN,是否需要shortcut connection,用不用dropout, batch-size多大等等這些因素都會很大程度影響最終結果。我們最終選取了如下策略:
- 三層感知機
- 層寬 channel size = 1024
- PRelu 代替 Relu
- 在中間層使用shortcut connection, 因輸入輸出解析度一致.
- 使用BN, 不使用Dropout
- 用非常大的batch-size訓練, 單卡4096
- Softmax層之前新增一個fix gamma的BN, 並和原始不加fix gamma BN的版本聯合預測
這7個技巧是我們的best setting。在使用最簡單的MLP配置時,提交的test mAP為82.9。加上這7個技巧以後,mAP=86.4, 足足提高了3.5個點。
B). 模型融合
模型融合可以說是打比賽必備的trick, 多個模型一般來說總能提升最終結果的精度. 我們保持同樣的資料集和訓練方法,並採用不同的random seed訓練了4個人臉識別模型。對這些識別模型也做同樣的MLP訓練來輸出最終的預測概率, 並加權得到最終結果. 此時mAP得分來到88.2。
C). 場景分類模型
對那些無法檢出人臉的視訊, 我們從mxnet model zoo裡找到imagenet11k+place365預訓練的resnet152模型做為基準模型,用抽取的視訊圖片做微調來預測每張圖片屬於哪個明星。做完分類處理後, mAP最終定格在88.6。
結果彙總:
三、最後的決戰:壓力
在提交截止前的2-3天, 排名第二的隊伍得分突然一下提高了很多, 離我們只差不多1個點的距離。而當時我們手上其實已經沒什麼牌可以打了。領跑了大半個賽季的我們,在最後一個夜晚還是比較擔憂最終的成績會被翻盤。焦慮不安的渡過了一個夜晚,第二天上午看到最終結果才放鬆下來。最終以總分比較高的優勢拿到了這次比賽的第一名。
四、比賽經驗:策略如何更容易的驗證
縱觀整個比賽過程, 付出最大精力的可能是如何使我們的idea更容易的去驗證。Idea很容易想, 可能一天會有好幾個,在確定了方案之後,怎麼能在現有的機器資源的條件下更快速的去驗證,是比賽的一個關鍵。
尤其在資料量很大比賽中, 如果沒有一個優質的流程, 不但會引起效率低, 更會忙中出錯,簡單介紹其中幾種方法:
1.根據視訊的hash id切分多卡跑檢測, 並序列化中間結果. 對視訊按幀檢測比較耗時, 所以在檢測策略沒有發生變化的情況下可以保證複用結果;
2.對每個識別模型, 儲存其對每一個視訊的特徵抽取結果. 在視訊特徵抽取演算法不變的情況下保證可複用, 做為訓練MLP的輸入;
3.序列化儲存每個訓練的MLP模型和預測的概率資訊, 做為最終模型融合的輸入。
五、後記
在PRCV2018的頒獎現場我也與主辦方和通過比賽認識的小夥伴們進行了親切和友好的交流,結下了深厚友誼。針對如何提高視訊、影像人物檢索效能達成了一系列共識。2019年的視訊人物識別挑戰賽已經開始了,這次比賽的資料集有了新的升級,也是業界中最接近實際媒體應用場景的視訊人物資料集,在原有的基礎上新增了短視訊人物ID約5000個,包括一些特效、濾鏡、換妝等。資料集iQIYI-VID-2019在複雜場景下10000名明星人物、200小時、20萬條影視劇與短視訊資料集,對於挑戰者來說更具挑戰性,我們團隊會繼續參加,並希望能有更多的志同道合的團隊能來一起參與, 把成績再提高更好的水平,也能為工業界多做貢獻。本文裡面提交的技巧和程式碼都有在insightface裡面開源,可自行取用參考。
瞭解更多:
1.Arcface paper被CVPR 2019接受為Oral. 歡迎關注我們據此展開的開源專案insightface@github.
2.近期會在insightface上開源一個巨好用的人臉檢測和配準器.
3.insightface已支援單機多卡並行加速, 8*1080Ti的環境可支援百萬ID訓練, 速度達800 samples/sec (ResNet50). 多機多卡版本也很簡單, 可利用mxnet內建的parameter server自行修改支援, 改動不是太複雜.