全面升級(jí)!FastReID V1.0正式開(kāi)源:Beyond reID

極市導(dǎo)讀
?FastReID V1.0于1月18日發(fā)布,本次更新最大的特點(diǎn)是將 FastReID 擴(kuò)展到了更多的任務(wù)上,并在這些任務(wù)上均達(dá)到了 SOTA 結(jié)果。本文介紹了其在知識(shí)蒸餾、自動(dòng)超參搜索、任務(wù)支持方面的改進(jìn)。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
FastReID 從20年6月發(fā)布以來(lái),收到了很多用戶(hù)的反饋,當(dāng)初的 V0.1 版本存在大量需要優(yōu)化的部分。經(jīng)過(guò)了最近半年的持續(xù)優(yōu)化,終于在 21年1月18日低調(diào)地發(fā)布了 FastReID V1.0。這次更新包括非常多的方面,最大的特點(diǎn)是將 FastReID 擴(kuò)展到了更多的任務(wù)上,并在這些任務(wù)上均達(dá)到了 SOTA 結(jié)果。
tldr: 經(jīng)過(guò)對(duì)各個(gè)模塊的優(yōu)化,我們更新了FastReID V1.0 版本,不僅實(shí)現(xiàn)了更快的分布式訓(xùn)練和測(cè)試,提供模型一鍵轉(zhuǎn)碼(模型一鍵導(dǎo)出 caffe/onnx/tensorRT)等功能外,而且還實(shí)現(xiàn)了模型蒸餾,自動(dòng)超參搜索以及更多任務(wù)的擴(kuò)展,比如人臉識(shí)別,細(xì)粒度檢索等等。
下面簡(jiǎn)單介紹一下 FastReID V1.0 的各項(xiàng)改進(jìn)。
Embedding 知識(shí)蒸餾
深度神經(jīng)網(wǎng)絡(luò)一般有較多的信息冗余,同時(shí)大模型會(huì)導(dǎo)致模型的推理速度變慢,會(huì)消耗更多計(jì)算資源,并且降低整個(gè)系統(tǒng)的響應(yīng)速度。所以在模型部署的時(shí)候需要考慮模型壓縮,減小模型的參數(shù)量。目前有較多的壓縮方式,比如剪枝,量化和蒸餾等。其中蒸餾是一種比較流行的范式,可以保證模型不需要進(jìn)行結(jié)構(gòu)修改的情況下,得到較大的性能提升。為此,我們?cè)贔astReID中支持了模型蒸餾,可以時(shí)小模型部署獲得更大的精度提升。
雖然蒸餾發(fā)展了數(shù)十年,我們通過(guò)大量的實(shí)驗(yàn)發(fā)現(xiàn) Hinton 的 Distilling the Knowledge in a Neural Network[1](https://arxiv.org/abs/1503.02531) 還是最 solid 的選擇。同時(shí)將原本的蒸餾 loss 優(yōu)化為具有對(duì)稱(chēng)性的 JS Div loss,最后修改蒸餾的 soft label 生成方式。
不同于 softmax 分類(lèi) loss,在 embedding 任務(wù)中通常會(huì)使用效果更好的 margin-based softmax,比如 arcface 等等, 這時(shí)直接使用基于 margin 的 logits 生成 soft label 效果很不好,所以將 soft label 修改為去掉 margin 的 logits 輸出。
除了可以對(duì) label 進(jìn)行蒸餾之外,也可以對(duì) feature 進(jìn)行蒸餾。通過(guò)實(shí)驗(yàn)了一大堆不 work 的特征蒸餾方法之后,發(fā)現(xiàn) overhaul-distillation[2](https://github.com/clovaai/overhaul-distillation) 可以在 loss 蒸餾的基礎(chǔ)上進(jìn)一步對(duì)網(wǎng)絡(luò)進(jìn)行提升,所以也將該方法加入到了 FastReID 中。由于overhaul需要對(duì) backbone 進(jìn)行一些修改,獲得 relu 之前的 feature,為此,構(gòu)建了一個(gè)新的 project 而不是直接去 FastReID 里面修改 backbone。
最后我們?cè)?dukeMTMC[3] 上進(jìn)行實(shí)驗(yàn),使用 r101_ibn 作為 teacher model, r34 作為 student model,可以獲得如下的效果提升。

蒸餾的使用也非常簡(jiǎn)單,只需要首先按照正常的方式訓(xùn)練一個(gè) teacher model,如果只想使用 loss 蒸餾,可以使用 Distiller 作為 meta_arch。如果希望加上 overhaul,也只需要使用 DistillerOverhaul作為 meta_arch 就可以。最后再指定 teacher model 的配置文件和訓(xùn)好的 weights 就可以了。
下面用 R101_ibn 作為 teacher model,R34 作為 student model 舉一個(gè)例子
# teacher model training
python3 projects/FastDistill/train_net.py \
--config-file projects/FastDistill/configs/sbs_r101ibn.yml \
--num-gpus 4
# loss distillation
python3 projects/FastDistill/train_net.py \
--config-file projects/FastDistill/configs/kd-sbs_r101ibn-sbs_r34.yaml \
--num-gpus 4 \
MODEL.META_ARCHITECTURE Distiller
KD.MODEL_CONFIG projects/FastDistill/logs/dukemtmc/r101_ibn/config.yaml \
KD.MODEL_WEIGHTS projects/FastDistill/logs/dukemtmc/r101_ibn/model_best.pth
# loss+overhaul distillation
python3 projects/FastDistill/train_net.py \
--config-file projects/FastDistill/configs/kd-sbs_r101ibn-sbs_r34.yaml \
--num-gpus 4 \
MODEL.META_ARCHITECTURE DistillerOverhaul
KD.MODEL_CONFIG projects/FastDistill/logs/dukemtmc/r101_ibn/config.yaml \
KD.MODEL_WEIGHTS projects/FastDistill/logs/dukemtmc/r101_ibn/model_best.pth自動(dòng)超參搜索
煉丹一直困擾著各位調(diào)參俠,特別是每次遇到新的場(chǎng)景,就需要重新調(diào)參來(lái)適應(yīng)新的數(shù)據(jù)分布,非常浪費(fèi)時(shí)間。所以決定在 FastReID 中加入了自動(dòng)超參搜索的功能來(lái)解放各位調(diào)參俠的雙手,讓大家可以更好的劃水。
通過(guò)一系列調(diào)研,最后決定使用 ray-tune[4] (https://docs.ray.io/en/master/tune/index.html)這個(gè)超參搜索的庫(kù)。在集成到 FastReID 中間也遇到了非常多的坑,不過(guò)最后成功地在 FastReID 中實(shí)現(xiàn)了自動(dòng)超參搜索的功能。
使用方式非常簡(jiǎn)單,如果你想用 Bayesian 超參搜索跑 12 組試驗(yàn),可以使用下面的代碼就可以開(kāi)始自動(dòng)分布式訓(xùn)練,如果有4張卡,那么可以4個(gè)試驗(yàn)同步一起跑
python3 projects/FastTune/tune_net.py \
--config-file projects/FastTune/configs/search_trial.yml \
--num-trials 12 --srch-alog "bohb"
另外需要搜索的超參空間需要在 projects/FastTune/tune_net.py 中進(jìn)行配置,更具體的使用方式可以參考 tutorial(https://github.com/JDAI-CV/fast-reid/issues/293)。
唯一不足的是還不能用pytorch的分布式數(shù)據(jù)并行,后續(xù)有時(shí)間會(huì)進(jìn)一步優(yōu)化,希望這能夠成為大家打比賽刷分,做業(yè)務(wù)的利器。
最多最全的任務(wù)支持
我們剛剛發(fā)布 FastReID V0.1 時(shí),它只是作為一個(gè)目標(biāo)重識(shí)別的 toolbox,支持重識(shí)別的業(yè)務(wù)模型和 research。
后面考慮到各種識(shí)別任務(wù)的模型結(jié)構(gòu)都長(zhǎng)得差不多,所以希望 FastReID 只需要稍微 customize 就能夠支持各種不同的任務(wù)。
但是每種任務(wù)都有自己的一些特殊性,把這些特殊性全部往 FastReID 里面塞肯定是不現(xiàn)實(shí)的。為了不引入冗余性,通過(guò)對(duì)每種 task 單獨(dú)構(gòu)建 project 的方式對(duì) FastReID 進(jìn)行擴(kuò)展,同時(shí)也相當(dāng)于提供了一些擴(kuò)展任務(wù)的參考寫(xiě)法和 example,畢竟文檔一直沒(méi)有時(shí)間寫(xiě)(逃~)。
最后呈現(xiàn)在 FastReID 的 projects 中一共可以支持 image classification (FastCls), attribute recognition (FastAttr), face recognition (FastFace) 和 fine-grained image retrieval (FastRetri) 4 種比較常見(jiàn)的識(shí)別任務(wù),同時(shí)我們也分別跑了幾個(gè) benchmark 以保證代碼的實(shí)現(xiàn)是正確的。

Image Retrieval

Face Recognition
同時(shí)大家在 customize 自己的 project 時(shí),也可以將這些 projects 中的東西進(jìn)行排列組合來(lái)實(shí)現(xiàn)新的功能,比如將 FastDistill 和 FastFace 組合在一起,就可以實(shí)現(xiàn)人臉識(shí)別中的模型蒸餾。
總結(jié)
一套好的 codebase 對(duì)于大家做實(shí)驗(yàn)和做業(yè)務(wù)都起著事半功倍的效果,大家也越來(lái)越發(fā)現(xiàn)代碼的工程質(zhì)量不僅影響業(yè)務(wù)模型的研發(fā)效率和性能,同時(shí)還對(duì)研究工作有著影響。
FastReID 不僅僅希望能給 ReID 社區(qū)提供穩(wěn)定高效的代碼實(shí)現(xiàn),同時(shí)也希望大家能夠基于 FastReID 去做算法研究,同時(shí)擴(kuò)展到更多其他任務(wù)上。
也希望大家能夠踴躍地在 GitHub 上提 issue 和 PR,讓我們一起把 FastReID 越做越好。
在此感謝 JD AI 的同事和老師的支持,正是因?yàn)榇蠹业呐ψ?FastReID 變得更好,科研項(xiàng)目也都在 FastReID 上取得了更好的性能。
JDAI-CV/fast-reidgithub.com
也歡迎大家關(guān)注 JDAI-CV 中的其他項(xiàng)目
JDAI-CV/centerXgithub.com
JDAI-CV/FaceX-Zoogithub.com
JDAI-CV/Partial-Person-ReIDgithub.com
Reference
推薦閱讀
武漢大學(xué)等發(fā)布ReID最新綜述!囊括三大視覺(jué)頂會(huì),提出新基準(zhǔn)方法AGW|TPAMI2021
ReID任務(wù)大幅領(lǐng)先,港中文開(kāi)源自步對(duì)比學(xué)習(xí)框架,充分挖掘無(wú)監(jiān)督學(xué)習(xí)樣本|NeurIPS 2020
Black reID:解決現(xiàn)實(shí)場(chǎng)景中的行人重識(shí)別常見(jiàn)的黑衣人問(wèn)題

