重大更新!一文了解京東通用目標重識別開源庫FastReID V1.0

2020年6月,京東 AI 研究院發佈了基於PyTorch的通用目標重識別(ReID)開源庫FastReID。經過了最近半年的持續優化,2021年1月18日京東AI研究院發佈了更新版本FastReID V1.0。在京東內部,FastReID已經獲得廣泛地應用於智能園區、智能樓宇、智能供應鏈、線下零售等實際項目中。

*GitHub鏈接:https://github.com/JDAI-CV/fast-reid

“口罩識別”,這或許是國內抵抗疫情傳播工作中,最基本也是最常見的信息覈實手段。除此之外,高速路車流車牌監控、公共場所安防偵查......這些大部分人都不會刻意關注的應用,同樣在給生活帶來越來越多的便利。

但在“有意遮擋”以及隱私安全的把控上,這項技術的“便利”總伴隨着一些風險與挑戰。而通用目標重識別(ReID )正是其中最不可或缺的技術。

爲滿足通用實例重識別日益增長的應用需求,京東AI研究院於 2020年6月發佈基於PyTorch的通用目標重識別(ReID)開源庫FastReID, 並受到了許多用戶的歡迎與反饋。經過半年多持續優化, 2021年1月18日FastReID V1.0攜重大更新“驚豔亮相”。

在瞭解FastReIDV1.0帶來了哪些新功能與新思路之前,我們先來“破破冰”,瞭解一下究竟什麼是通用目標重識別(ReID)。

通用目標重識別(ReID)是什麼

通用目標重識別(ReID )又稱跨境追蹤,全稱Re-identification,也就是重識別的意思。 簡單理解就是對於一個特定的目標(可能是行人、車輛或者其他特定物體),在候選圖像集中檢索到它,或稱圖像中目標的實例級檢索。

再通俗一些,ReID算法能夠通過視頻監控系統,在跨攝像頭的條件下,對無法獲取清晰拍攝的特定目標進行跨攝像頭連續跟蹤,大大拓展攝像資源的利用深度,增強數據的時空連續性,並降低人力成本。

ReID可以作爲識別技術的重要補充,提升對特定目標的識別追蹤能力,適用於更多新的應用場景,將人工智能的認知水平提高到一個新階段。

舉個例子, 下圖是由四張圖片構成,黃衣男子爲某犯罪案件中重點觀察對象。此人出現在多個攝像頭畫面中,但多張圖像都極其模糊,僅有幾個像素大小,導致識別算法失效,增加警察刑偵難度。這時,ReID 技術就可以根據行人的穿着、體貌,在各個攝像頭中去檢索,將其在各個不同攝像頭出現的視頻段關聯起來,形成軌跡協助破案。

此外, 在新零售場景中,ReID技術也可以讓“人”與“場”之間的關係數據有辦法被收集並以可視化的方式重現。商家對用戶畫像和用戶行爲有更強的感知,從而能夠做出更準確的商業決策。同時,也爲線下針對用戶的個性化服務和精準營銷提供了可能。

什麼是FastReID?

目前,ReID往往被應用到不同規模的特定目標軌跡分析上,這就會導致系統處理的數據規模快速成倍的增長,模型的推理速度變慢,最終使得ReID算法的性能不能被完全發揮。此外,ReID領域中的學術研究與工程模型部署存在着較大的差距,代碼對齊問題使得學術研究成果很難直接轉化爲可落地的產品,限制其在大規模商業化場景中的應用。

爲加速學術界研究人員和工業界工程師對重識別技術的發展, FastReID代碼開源庫應運而生。

參照了Detectron2的整體概念和設計哲學,FastReID設計成了一個高度模塊化和可拓展的架構,從而可以讓研究人員快速的實現新的idea;更重要的是,該框架友好的管理系統配置和工程部署函數可以讓工程師快速的部署它。FastReID開源庫可針對ReID任務提供完整的工具箱,包括模型訓練、模型評估、模型部署等模塊,並且實現了在多個任務中性能領先的模型。

下圖,完整列出了FastReID各個模塊,上下分別爲訓練和推理。訓練階段包括模塊: 圖像預處理(Preprocssing)、骨幹網(Backbone)、聚合模塊(Aggregation)、Head 模塊、訓練策略、損失函數; 在推理階段包含模塊:度量部分,以及度量後處理指對檢索結果的處理,包括K-reciprocal coding和 Query Expansion (QE) 兩種重排序方法。

詳細架構解析可見:

🔗 FastReID:首個產業級通用目標重識別開源庫?

基於此,在 V1.0 的全新升級中,FastReID 經過對以上各個模塊的優化,更新了FastReID V1.0 版本,不僅實現了更快的分佈式訓練和測試,提供模型一鍵轉碼(模型一鍵導出 caffe/onnx/tensorRT)等功能外,而且還實現了模型蒸餾,自動超參搜索以及更多任務的擴展,有潛力做更多的事情,也有了更多的應用場景。

FastReID V1.0更新詳解

1.模型蒸餾:小模型部署獲得更大的精度提升

深度神經網絡一般有較多的信息冗餘,同時模型太大會導致推理速度變慢,消耗更多計算資源,並且降低整個系統的響應速度。所以開發者通常需要在模型部署的時候,考慮對模型進行壓縮,減小模型的參數量。

目前行業裏有較多的模型壓縮方式,比如剪枝,量化,蒸餾等等,其中蒸餾可以保證模型不需要進行結構修改的情況下, 獲得進一步的精度提升,從而可以在使用小模型部署時獲得更好的性能。

雖然蒸餾發展了數十年,但通過大量的實驗發現Hinton的 Distilling the Knowledge in a Neural Network 還是最solid的選擇。基於這篇paper的方式,進一步將原本的蒸餾KL Div loss優化爲具有對稱性的JS Div loss,同時還優化了蒸餾的soft label生成方式。

不同於softmax分類loss,在embedding任務中通常會使用效果更好的margin-based softmax,比如arcface等等, 這時直接使用基於margin的logits生成soft label效果很不好,所以將soft label修改爲去掉margin的logits輸出。

除了可以對label進行蒸餾之外,也可以對feature進行蒸餾。 通過實驗了一大堆不work的特徵蒸餾方法之後,  FastReID發現overhaul-distillation可以在loss 蒸餾的基礎上進一步對網絡進行提升,所以也將該方法加入其中。由於overhaul需要對 backbone進行一些修改,獲得激活函數relu之前的feature,通過構建了一個新的project去修改backbone而不是直接去FastReID裏面修改 backbone,這樣可以避免影響其他的project和以前訓練的模型。

要在FastReID中使用蒸餾也非常簡單,只需要首先按照正常的方式訓練一個 teacher model,如果只想使用loss蒸餾,可以使用Distiller作爲meta_arch。如果希望加上overhaul進行feature蒸餾,也只需要使用DistillerOverhaul作爲meta_arch就可以。最後再指定teacher model的配置文件和訓好的weights就可以了。

舉個例子,用 R101_ibn 作爲 teacher model,R34 作爲 student model:

1 teacher model training
2 python3 projects/FastDistill/train_net.py 
3 --config-file projects/FastDistill/configs/sbs_r101ibn.yml 
4 --num-gpus 4
5
6 # loss distillation
7 python3 projects/FastDistill/train_net.py 
8 --config-file projects/FastDistill/configs/kd-sbs_r101ibn-sbs_r34.yaml 
9 --num-gpus 4 
10 MODEL.META_ARCHITECTURE Distiller
11 KD.MODEL_CONFIG projects/FastDistill/logs/dukemtmc/r101_ibn/config.yaml 
12 KD.MODEL_WEIGHTS projects/FastDistill/logs/dukemtmc/r101_ibn/model_best.pth
13
14 # loss+overhaul distillation
15 python3 projects/FastDistill/train_net.py 
16 --config-file projects/FastDistill/configs/kd-sbs_r101ibn-sbs_r34.yaml 
17 --num-gpus 4 
18 MODEL.META_ARCHITECTURE DistillerOverhaul
19 KD.MODEL_CONFIG projects/FastDistill/logs/dukemtmc/r101_ibn/config.yaml 
20 KD.MODEL_WEIGHTS projects/FastDistill/logs/dukemtmc/r101_ibn/model_best.pth


2.定位轉型:最全最多的任務支持

FastReID V1.0優化了整體的代碼結構,不僅能夠同時兼顧算法研究和業務落地,還能使開發者更加方便地擴展不同的自定義任務,並能基於FastReID內部的核心代碼,用少量代碼即可實現一個新項目的開發。 優化後的算法庫不僅能夠進行目標重識別的任務,同時還支持行人屬性識別、地標檢索、行人和車輛跟蹤、圖片分類等等任務。

其實,在之前的版本中,FastReID注重爲算法研究提供便利,但是面對高速開發的業務, FastReID發現用戶需要額外花費很多的時間去做相同的事情。這就意味着,FastReID不僅需要保留很好的靈活性能夠支持算法研究,還需要有很強的擴展性能夠支持大量自定義的業務快速開發。

然而,每種任務都有屬於自己的一些特殊性,把這些特殊性全部往FastReID裏面“塞”肯定不現實。爲了不引入冗餘性,我們通過對每種task單獨構建project的方式對FastReID進行擴展,同時也爲開發者提供了一些擴展任務的參考寫法和example。

對於自定義的項目,開發者只需要判斷是否需要加入新的配置文件、是否需要加入新的數據集、是否需要加入新的網絡結構、是否需要加入新的測試協議等內容。如果這些內容在FastReID裏面已經有現成的實現,那麼直接將FastReID作爲一個庫導入相應的模塊即可。對於內部沒有實現的內容,開發者可以自己實現一個最小化的版本,與FastReID提供的內容進行拼接,這樣就能夠實現一個完整的自定義項目開發。

3.面向開發者更友好:自動超參搜索

自開源至今,FastReID一直在努力思考如何讓開發者上手更加容易。之前的版本中, FastReID具備擴展各種任務的能力,但卻無法提供一些參考案例和demo。並且,由於之前的版本主要集中在目標重識別相關領域的模型訓練和開發,FastReID所提供的配置文件和默認的超參數往往是針對重識別任務的,對於擴展的任務其實並不具有指導意義。

在新版的升級中,FastReID V1.0不僅爲開發者提供了更多通用任務的最小實現模板,還提供了相應的配置文件和參數設定, 方便開發者能夠基於模板進行特定任務的簡單修改。此外,爲開發者在使用FastReID開發新項目時提供baseline結果,還能夠避免開發者花費大量精力對不熟悉的任務進行調參。

衆所周知,“煉丹”一直困擾着各位“調參俠”,特別是每次遇到新的場景,就需要重新調參來適應新的數據分佈,非常浪費時間。而在FastReID V1.0中加入自動超參搜索的功能,就能解放各位“調參俠”的雙手。

舉個例子,如果你想用 Bayesian 超參搜索跑 12 組試驗,可以使用下面的代碼就可以開始自動分佈式訓練,如果有 4 張卡,那麼可以 4 個試驗同步一起跑。

1 python3 projects/FastTune/tune_net.py 
2 --config-file projects/FastTune/configs/search_trial.yml 
3 --num-trials 12 --srch-alog "bohb"



更具體的使用方式,請參考:https://github.com/JDAI-CV/fast-reid/issues/293 。

總結

自2020年6月開源至今,FastReID在各種任務中的評測結果都表現得十分搶眼。這個SOTA級的ReID方法集合工具箱(SOTA ReID Methods and Toolbox),已面向學術界和工業界落地,並在京東內部該開源庫已經成爲了京東內部ReID技術研究和開發的核心引擎。

2021年,FastReID計劃繼續加入更多先進的算法,不斷提高性能,提供更完善的文檔、參考案例和demo,同時進一步優化計算效率,進一步提升大規模數據下的穩定性。

我們也熱忱歡迎個人、實驗室使用FastReID,互相交流,互相合作。希望在給ReID社區提供穩定高效代碼實現的同時,大家也能夠基於FastReID去做算法研究,擴展到更多其他任務上,共同加速人工智能研究,共同實現技術突破。

推薦閱讀

歡迎點擊【京東科技】,瞭解開發者社區

更多精彩技術實踐與獨家乾貨解析

歡迎關注【京東科技開發者】公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章