零基礎實戰行人重識別ReID項目-基於Milvus的以圖搜圖

目錄

第一階段,ReID的基本概念

1.1 ReID定義

1.2 技術難點

1.3 常用數據集

1.4 評價指標

1.5 實現思路

1.6 具體方案

第二階段:復現算法

2.1 PCB的骨幹網絡

2.2 PCB的流程

2.3 PCB的細節

2.4 PCB-RPP

​2.5 算法復現

第三階段:工程化落地

3.1 業務邏輯

3.2 Milvus

3.3 以圖搜圖

3.4 效果展示

加入學習小組


近期正在學習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篇論文。

 

 

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