目錄
近期正在學習ReID,完全零基礎,打算復現幾種主流的ReID算法,並進行工程化落地。
學習目標:掌握ReID的算法原理、實現方案,動手搭建網絡模型,在數據集上覆現算法。
學習內容:閱讀相關資料、論文、開源代碼,復現算法,工程化落地。
如果你也在學習ReID,歡迎加入免費學習小組,加入方式見文末。
第一階段,ReID的基本概念
包括 ReID的定義、常用數據集、評價指標、實現思路
推薦一個視頻教程:https://edu.csdn.net/huiyiCourse/detail/788,可下載配套PPT
這個博客對視頻進行了總結:https://blog.csdn.net/ctwy291314/article/details/83618646
1.1 ReID定義
全稱Person Re-Identification,主要解決跨攝像頭跨場景下行人的識別與檢索。該技術可以作爲人臉識別技術的重要補充,可以對無法獲取清晰拍攝人臉的行人進行跨攝像頭連續跟蹤,增強數據的時空連續性。
1.2 技術難點
相機拍攝角度,圖片模糊不清楚,室內室外環境變化,行人更換服裝飾配,冬季夏季風格差異,白天晚上光線差異等。
1.3 常用數據集
Market1501 http://liangzheng.com.cn/Project/project_reid.html 網站掛了,聯繫我提供下載地址
DukeMTMC-reID https://github.com/sxzrt/DukeMTMC-reID_evaluation#download-dataset
CUHK03 http://www.ee.cuhk.edu.hk/~xgwang/CUHK_identification.html
1.4 評價指標
Rank1:首位命中率
mAP:平均精度均值
CMC:累計匹配曲線
參考:https://zhuanlan.zhihu.com/p/40514536
https://blog.csdn.net/qq_38451119/article/details/83000061
1.5 實現思路
a.檢索圖經過網絡抽取圖片特徵(Feature) ;
b.底庫裏的所有圖片全部抽取圖片特徵(Feature) ;
c.將檢索圖與地庫圖的特徵計算距離(例如歐式距離) ;
d.根據計算距離進行排序,排序越靠前表示是相似率越高。
1.6 具體方案
方案 | 性能 | 對應論文 |
方案一:表徵學習 基於SoftmaxLoss(分類損失)與 ContrastiveLoss(對比損失) |
Rank1: 79.51% mAP: 59.87% |
Z.Zheng,L.Zheng,andY.Yang. A discriminatively learned cnn embedding for person re-identification. arXiv preprint arXiv:1611.05666, 2016. |
方案二:度量學習 基於Triplet Loss(三元損失) |
Rank1: 84.92% mAP: 69.14% |
A.Hermans, L. Beyer, and B. Leibe. In defense of the triplet loss for person re-identification. arXiv preprint arXiv:1703.07737, 2017. F. Schroff, D. Kalenichenko, and J. Philbin. FaceNet: A Unified Embedding for Face Recognition and Clustering. In CVPR, 2015. 1, 2, 3, 5 |
方案三:局部特徵學習 3.1 基於局部區域調整 |
Rank1: 80.31% mAP: 57.53% |
L. Zhao, X. Li, J. Wang, and Y. Zhuang. 2017. Deeply-learned part-aligned representations for person re-identication. In CVPR. |
3.2 基於姿態估計局部特徵調整 |
Rank1: 84.14% mAP: 63.41% |
C. Su, J. Li, S. Zhang, J. Xing, W. Gao, and Q. Tian. 2017. Pose-driven Deep Convolutional Model for Person Re-identication. In CVPR. |
3.3 PCB | Rank1: 93.8% mAP:81.6% | Y. Sun, L. Zheng, Y. Yang, Q. Tian, and S. Wang. Beyond part models: Person retrieval with refined part pooling. arXiv preprint arXiv:1711.09349, 2017. |
第二階段:復現算法
2.1 PCB的骨幹網絡
選取上述的PCB方案,搭建網絡,訓練模型。
PCB使用修改版的ResNet-50作爲骨幹網,下圖是ResNet不同層數的網絡結構,
圖片來自ResNet論文: Deep Residual Learning for Image Recognition
ResNet論文中指出,Downsampling is performed by conv3 1, conv4 1, and conv5 1 with a stride of 2.
所以,原始的ResNet-50 的下采樣倍數爲2^5 = 32倍,即輸入的圖像到輸出的特徵圖縮小了32倍。
而PCB論文中指出,輸入尺度爲384x128(高比寬爲3:1),經過骨幹網絡後,輸出的特徵圖尺度爲24x8,
所以下采樣比例爲16,因此,ResNet-50中 conv5_1的stride需要由2改爲1.
2.2 PCB的流程
結合下圖,介紹PCB的流程:
1.輸入圖像,尺度爲 高384 x 寬128 x 通道3,送入修改後的ResNet-50,輸出特徵圖T,尺度爲 高24 x 寬8 x 通道2048
2.將T在高的維度上等分爲6份,分別執行平均池化,得到向量g,尺度爲 6 x 1 x 1 x 2048
3.對向量g執行1x1卷積,得到向量h,尺度爲6 x 1 x 1 x 256
4.對每個向量h送入 256 x 751 全連接層的分類訓練
疑問:得到6個分類向量後,行人分類是怎麼處理的?
參考論文中的這麼一段:
2.3 PCB的細節
訓練階段,輸入圖像,得到T、g、h,再經過全連接層得到6個1x751的向量,對這6個1x751的向量分別計算分類損失再累加。
測試階段,輸入圖像,得到6個1x2048的g向量,然後對其進行拼接,得到一個1x12288的向量,(或者使用拼接後的h向量 1x1536) 用這個與特徵庫中的向量進行匹配,找到距離最近的作爲檢索結果。
用代碼來解釋最爲直觀:
參考項目:https://github.com/layumi/Person_reID_baseline_pytorch
項目的中文版解析:https://zhuanlan.zhihu.com/p/50387521
從train.py中的第215行可以看出,訓練階段,對6個全連接層的結果分別計算softmax,進行累加後,作爲分類的預測值,
從第220行可以看出,對6個部分分別計算交叉熵損失,再將6個損失值累加,得到最終的loss
從test.py的第158行可以看出,提取特徵時,取的是上述流程圖中的g,即尺度爲6x2048的特徵向量
在實現細節上,代碼中分別對6個分片除以它們的2範數,目的是降低不同維度上取值範圍的差異性(可以理解爲歸一化)。
2.4 PCB-RPP
論文裏還提出了PCB的改進策略:RPP - Refined Part Pooling
T中直接進行了6等分,但被強行分到同一個區域內的向量可能並不相似,特別是位於分界線兩側的那些向量。
RPP的目標就是對每個區域內的向量進行重新分配。通過計算f與g之間的餘弦距離,找到與f最相近的g,將該 f 劃分到對應的 g 區域內,劃分結果如下圖中右側所示。
RPP通過一個線性層緊接着一個softmax激活層,對每個 f 向量進行區域分類。
得到分類之後的T,再對屬於同一分區的f計算均值,得到6個分區的平均值向量g,後續結果與PCB流程相同。
RPP的流程如下:
論文提供了兩個變種的方案:
Variant 1. 將所有h向量平均,得到單個h向量,送入全連接層進行分類訓練;測試階段,將g或h進行拼接,再進行分類。
Variant 2. 網絡結構不變,只是將全連接層進行權值共享。
以及IDE ( 論文 Person reidentification: Past, present and future中的方案,本文對其進行了相應的改進)
並給出了不同方案的測試結果:
2.5 算法復現
推薦一個網站:https://www.paperswithcode.com/
專門用於查找論文復現的項目代碼,比如PCB的搜索結果:
PCB的訓練過程已在百度AI Studio上使用PaddlePaddle進行復現,源碼:
https://aistudio.baidu.com/aistudio/projectdetail/468702
項目仍在更新維護中,歡迎提出寶貴意見。
第三階段:工程化落地
3.1 業務邏輯
基於PCB-RRP封閉環境下的ReID工程化落地的業務邏輯:
1.加載ResNet-50預訓練網絡模型,修改分類數目,在Market-1501數據集上繼續訓練網絡;
2.對Market-1501數據集中的751個行人分別計算特徵向量,存儲備用;
3.獲取一個行人的圖片,提取特徵向量,然後與751個特徵進行比較,找到與之距離最小的1個或多個特徵對應的原圖作爲備選結果。
其實上述的場景已經很接近於以圖搜圖了,只不過數據集是封閉的,而且量也不大。
雖然不是大規模的數據,但也可以藉此機會感受一下以圖搜圖的完整流程。
3.2 Milvus
這裏隆重介紹一款開源的特徵向量相似度搜索引擎 Milvus https://www.milvus.io/cn/
3.3 以圖搜圖
官方提供了【基於 Milvus 和 VGG 實現以圖搜圖】項目的源碼:
https://github.com/milvus-io/bootcamp/blob/master/solutions/pic_search/README.md
內置了VGG網絡用於提取圖像特徵,用戶只需要提供訓練集和待測試的圖片即可,特徵提取、匹配過程對用戶完全透明。
架構如圖所示:
如需使用其他網絡模型、修改圖像resize後的尺寸,則需要修改源代碼:
webserver / src / preprocessor/ vggnet.py
修改網絡後,需要提供預訓練模型文件,
位於webserver / data / models / 路徑下:
可參考官網的博客:
【Milvus帶你實現輕鬆搭建以圖搜圖系統】https://zilliz.blog.csdn.net/article/details/103884272
3.4 效果展示
本人使用Market-1501的bounding_box_test文件夾中19732張圖片作爲底庫,使用query文件夾中的圖片進行檢索,效果如下:
Milvus提供的以圖搜圖解決方案中,使用的骨幹網絡是VGG-16,圖片需要resize爲224*224再送入進行特徵提取,展示框的寬高比是1 : 1,導致圖像有點變形。
而Market-1501數據集中的圖片都是細長條狀的,因此目前默認環境還不太符合實際應用場景。
修改展示界面中圖像的寬高比:
bootcamp/solutions/pic_search/webclient/src/containers/Setting.tsx
通過網頁中的關鍵字找到對應的位置:
通過對應的容器名,找到對應的配置參數:
修改benchImage中的width和height,即可修改待檢索圖片的展示效果。
可以改爲:
width: "auto",
height:"250px",
而第126行、第127行的像素值,是預覽框的尺寸,這個跟最後的展示沒有關係,不需要改。
搜索結果寬高比的修改:
bootcamp/solutions/pic_search/webclient/src/components/Gallary.tsx
將child中的width和maxHeight分別改爲:
width: "auto",
//maxHeight: "100%", 註釋掉
height:"100%",
重新構建鏡像:
# 構建鏡像
$ docker build -t pic-search-webclient .
效果如下:
後續工作:在界面中顯示搜索結果的圖片名稱、修改骨幹網絡的輸入尺度、修改提取特徵的骨幹網絡。
未完待續。
加入學習小組
關注公衆號,回覆 “組隊”,加入免費學習小組
回覆 “reid”,打包下載上述PPT和6篇論文。