求行人檢測再識別完整源代碼?

鄙人目前正在弄一點視頻監控的東西,用到行人再識別技術。行人檢測目前已經做得相對程序,各種源代碼也有,但是行人再識別目前才剛剛起步。我在Github上找到了用DGD方法實現再識別的程序,但是輸入的都是從監控視頻剪切好的圖像。所以想問各路大神,有沒有完整的源代碼,直接實現從視頻行人檢測到再識別?


大家通常還是分兩步做。一步檢測,一步重識別。

全圖中檢測行人+行人重識別放在統一框架下做得少的可能原因有兩個:1. 通常認為檢測和識別是兩個任務,大家要麼研究detector,要麼就研究recognizer,最後再連接在一起;2.更重要的是,即使採用handdrawn的行人框,重識別也沒有解決得很好。所以大家仍聚焦在解決重識別問題上,而沒有考慮統一框架。

和之前 @走出去 的回答一樣,end2end 的學習,學界是有在研究的。如 CUHK的《End-to-End Deep Learning for Person Search》用了fasterRCNN的框架,提出如果檢測框框好的話,對識別也是有直接幫助的。所以他們直接採用了end2end learning。Github地址為ShuangLI59/person_search 同時提出了數據集。

其次,還有LiangZheng在https://arxiv.org/abs/1604.02531 中提出對於行人檢測框和重識別關係的討論,在論文中他們採用了各種detector+各種recogniser的組合。比如最常見dpm+CNN。

來探索那種組合更能提高重識別結果。

關於行人重識別綜述,推薦一下liang zheng 2016年的綜述: Past, Present and Future 寫了從傳統方法到深度學習,從圖片到視頻的行人重識別的方法。

以下為一些公開的行人重識別代碼鏈接:(我會持續更新)

  • LOMO: Person Re-identification by Local Maximal Occurrence Representation and Metric Learning
  • Improved CNN: [python implementation (tensorFlow) ]: Ning-Ding/Implementation-CVPR2015-CNN-for-ReID [c++ dlib version ]: ptran516/idla-person-reid
  • 2stream-CNN: [Matconvnet]: layumi/2016_person_re-ID [Caffe]: D-X-Y/caffe-reid
  • CNN+Pose: erichuang0771/PoseBox-Reid
  • DomainDropout: Cysu/dgd_person_reid
  • PersonSearch: ShuangLI59/person_search
  • Baseline: zhunzhong07/IDE-baseline-Market-1501
  • k-reciprocal re-ranking: zhunzhong07/person-re-ranking
  • Triplet: VisualComputingInstitute/triplet-reid

感謝@乜咩牙 補充代碼鏈接。

行人重識別 數據集鏈接:

  • Re-ID Dataset Summary: https://robustsystems.coe.neu.edu/sites/robustsystems.coe.neu.edu/files/systems/projectpages/reiddataset.html

圖像數據集(Image-based):

  • CUHK01, 02, 03: Rui Zhaoamp;amp;amp;#x27;s Homepage
  • Market-1501, PRW: Liang Zhengamp;amp;amp;#x27;s Homepage
  • DukeMTMC_reID: layumi/DukeMTMC-reID_evaluation

Attribute相關數據集:

  • RAP : An introduction to the RAP dataset
  • Attribute for Market-1501and DukeMTMC_reID: vana-yutian (組裡妹子標的,大家可以支持一下~)

視頻相關數據集:

  • Mars:http://liangzheng.org/Project/project_mars.html
  • PRID2011:ICG - Downloads

NLP相關數據集:

  • 自然語言搜圖像:http://xiaotong.me/static/projects/person-search-language/dataset.html
  • 自然語言搜索行人所在視頻:http://www.mi.t.u-tokyo.ac.jp/projects/person_search

------------新paper----------

回復中提到論文基本是幾個不同的方向。在這裡列出這些paper和新paper的arXiv鏈接,和大家共同學習。(和自然語言結合;svd做更好更短的embedding;Reranking對map提升很大,pratical的work;GAN做數據增強,防止過擬合;Attribute 傳統multitask,IDlevel提供數據集;Triplet loss扶我起來,我還能幹;PoseBox檢測part然後fusion)

  • Caption:[1702.05729] Person Search with Natural Language Description
  • SVDNet:[1703.05693] SVDNet for Pedestrian Retrieval
  • Reranking:[1701.08398] Re-ranking Person Re-identification with k-reciprocal Encoding
  • GAN:[1701.07717] Unlabeled Samples Generated by GAN Improve the Person Re-identification Baseline in vitro
  • Attribute:[1703.07220] Improving Person Re-identification by Attribute and Identity Learning
  • Triplet Loss:[1703.07737] In Defense of the Triplet Loss for Person Re-Identification
  • PoseBox:[1701.07732] Pose Invariant Embedding for Deep Person Re-identification
  • NLPVideo:[1704.07945] Spatio-temporal Person Retrieval via Natural Language Queries


Zhedong的總結已經很全面了,我再軟廣告一下 :)

我們對之前End-to-End Deep Learning for Person Search這篇文章又做了一些改進,提出了一個新的Online Instance Matching (OIM) Loss,用於更好地解決一個人的類別太多但一個mini-batch裡面樣本不夠多樣,導致沒法訓練分類器的問題。

論文新版本換了個名字:Joint Detection and Identification Feature Learning for Person Search,代碼還是在原來的地方:ShuangLI59/person_search

另外我們也把提出的OIM Loss應用在了傳統的Person ReID問題(基於crop好的照片)上,效果比直接用Softmax訓練分類器要好,代碼放到了這個新寫的庫裡面:Cysu/open-reid

補充一些OpenReID這個庫的介紹,其功能主要有:

  • 為常用的數據集提供一個統一的介面,方便做實驗
  • 實現了一些評價指標(發現CUHK03和Market1501用的CMC演算法還不太一樣Orz,詳見 Evaluation Metrics)
  • 實現了一些常用的訓練方法和模型(Softmax分類,Triplet Loss,OIM等)

我們也總結了實驗中發現的一些trick在 Training Identification Nets。OpenReID這個庫還在不斷完善中,歡迎各種建議和GitHub PR。


更新keras版本的reID代碼和模型,代碼沒來得及整理,我自己也好久沒用了,當個參考作用吧

https://github.com/michuanhaohao/keras_reid

git@github.com:michuanhaohao/keras_reid.git

包含classification和triplet loss, triplet hard loss

以及一個性能一般般的模型

============原回答==============

detection我沒做過,reID的話要不八月份我在GitHub上開源我的基於tensorflow/keras復現identification loss/triplet loss/quadruplet loss版本的代碼吧,到時候更新在這裡,八月份前我暫不開源所以也不要私信我要代碼了,一個原因是現在代碼和屎一樣亂,另外一個原因是因為參加一個reID的比賽,等到比賽結束之後再開源。其實 @鄭哲東 總結的很好,他和鄭良老師為reID貢獻了很多文章,大家去騷擾他,哲東也開源了他們的代碼,但是都是基於caffe實現的,所以我用keras復現了一下,但是實話實說相同的model我和哲東他們的performance一直差了10個點左右,可能data argumentation和手工藝調參上還是有tricks吧。

其實reID訓練大體上就是基於四種loss,distance loss,identification loss,verification loss,attributes loss。

distance loss 是最常用的loss,就是用feature之間的距離來計算loss,同一個人的feature應該更近,不同人的feature要更遠,那麼用同一個人的距離減掉不同人的距離加上一個正常數和0取max實現,代表的有triplet loss,improved triplet loss,quadruplet loss,這些都可以直接搜到,quadruplet loss搜beyond triplet loss

identification loss就是classification loss,每一個人作為一個類別,來訓練分類問題,把某個全連接層作為feature來做reID,一般identification loss能夠很快收斂,但是面對百萬級,千萬級的數據稍顯吃力

verification loss就是兩張圖來做二分類,判斷是否為同一個人,這個作為輔助訓練還行,作為主訓練的loss估計要崩

attributes loss就是對於不同的屬性做分類,比如上身顏色,是否戴帽子之類的,這個是有用的,但是標註數據太過奢侈,只有企業才能資本來標註可以使用的大量數據吧

===========================================paper=========================

論文的話我覺得補充一點點就好了,哲東已經把我大部分看過的論文都列出來了,另外SVDnet我復現了,只能說效果待考量,其實論文裡面也就提高了一丟丟,我復現的結果壓根就沒有提高,可能我的姿勢不對吧

quadruplet loss:a deep quadruplet network for person re-identification

估計相機間關係輔助reID:Pose-aware Multi-shot Matching for Improving Person Re-identification

對feature加了一層weights,感覺有很嚴重的overfitting問題:[1705.03332] Deep Person Re-Identification with Improved Embedding

基於video的reID:[1701.00193] Video-based Person Re-identification with Accumulative Motion Context

一篇光訓練過程就可以寫一篇論文的懵逼之作:[1611.05244] Deep Transfer Learning for Person Re-identification

鄭良老師的綜述:Past, Present and Future


目前,reid的工作,其實很大意義上還是集中在feature層次,如何更好的抽取深度特徵。

可以參見今年AAAI的那篇multi-task的思路。用softmax做classification,contrastive loss或者image pair融合做identification,triplet loss做ranking,這個幾乎已經是標準架構了,無非在裡面再做細緻調整。其他的就是各種trick了,圖像增強,數據擴充,增加標籤語意監督,以及各種各樣的reranking技巧。

總結一下,常見loss,contrastive loss,triplet loss,center loss,coupled clusters loss,structured loss,quadruplet loss,以及對應的改進版,基本已經差不多了,而且都是行人,車輛,人臉,實例等檢索識別任務通用的損失函數。

另外,在image pairs融合這一部分有相當多的工作可以考慮,卷積層融合,還是全連接相減,依然還有不少東西可以挖。

多標籤學習,是單純的大量softmax呢,還是多重交叉熵,也有一些東西可以做。

part model,包括單純切割,或者是用pose定位切塊,也是能顯著提升性能的。

其他的其實單從性能上的話,transfer learning,cross domain,gan模型數據擴增,以及reranking。

基本上以上這些工作都是對實際性能提升會有一些幫助的,基本上我復現之後,都能在我原模型基礎上好2到5個點之間。

至於其他的一些零零碎碎的論文,比如在線的馬式距離之類,看上去很漂亮,但是複線的並不能work,還是有待討論。畢竟從工業界的思路來說,粗暴簡單性能好才是硬道理。


行人檢測和行人再識別是兩個不同的問題。行人檢測是從整個場景圖象中檢測出行人並進行跟蹤,而再識別是行人分類問題。行人再識別(行人重識別)【包含與行人檢測的對比】這篇文章對這兩個問題分析的比較到位。

目前行人檢測發展的比較成熟,行人檢測資源(上)綜述文獻做了詳細的總結,Github上也有很多現成的程序,而再識別由於行人在走路時發生形體變化、拍攝角度的不同常會導致難以分類,所以應用並不廣泛。

目前常見的再識別有基於特徵和基於統計兩種方式,一般都是先採用行人檢測框出行人,再將框出的圖像作為分類的輸入圖像,而在《End-to-End Deep Learning for Person Search》這篇論文中,作者用fast-rcnn框架,直接將行人檢測和再識別整合到一個卷積神經網路上,減少了行人檢測框錯行人導致的誤差,實驗準確率達到了60%以上。相關程序在Github上有,GitHub - ShuangLI59/person_search: End-to-End Deep Learning for Person Search。

(以上為小白近期總結,不當之處歡迎指出,也歡迎交流。)


推薦實驗室大牛寫的

https://github.com/Cysu/open-reid

包含多種state of the art 演算法實現以及全套測試工具,非常良心。


行人檢測程序:huangshiyu13/RPNplus


你這裡再識別準確率如何,完整代碼涉及的東西比較多,要涉及到檢測後跟蹤,並對目標進行特徵提取,存儲及後續查詢比對,最近在研究lmnn和tdl方法,可以多交流下


完整的end-to-end的系統比較複雜,不過把行人檢測與再識別結合到一起我覺得應該算是一個比較有前途的方向,至少feature可以重複利用。CVPR17上CUHK Tong Xiao的工作算是一個比較典型的解決方案(Joint Detection and Identification Feature Learning for Person Search)。

單獨說行人再識別的部分,我們最近剛剛release了 benchmark paper 的code: https://github.com/RSL-NEU/person-reid-benchmark 裡面包含了大部分基於傳統pipeline的feature和metric learning的源碼,single shot和multi shot都有。目前資料庫支持有限,後續還會不斷更新和完善,也歡迎大家多提意見多開issue 。


基於深度學習去做行人再識別,我還是無法理解這個target person怎麼去定義,他的特徵是怎麼得到呢?求解答


有沒有人做 background suppression 或者foreground segmentation (也就是 human silhouette)?

找了一些以提取特徵為主的非DL方法 (SDALF,color name),好多都提及要做segmentation, 但是找不到可以做segmentation的code, 有沒有大神可以指個方向呀? 特別是 stel component analysis.


難道reid不是和saliency一樣的偽科學么


個人感覺,行人再識別問題的描述應該為:給一個目標行人的圖片,然後在海量的視頻中找到這個人。所以,(1)行人檢測,將視頻中的行人準確的檢測出來、存儲;(2)特徵表示,對目標圖片和檢測出來的行人圖片做特徵提取和特徵表示;(3)距離度量,對特徵表示後的數據進行距離度量(總之就是一種比較策略),將滿足閾值要求對應的圖片選出來,即同一行人。
不知道自己理解的是否正確,希望與各位交流共勉!


推薦閱讀:

PowerShell 為什麼 alias 了 curl 就引起了如此大的爭議?
php 方法內部能不能定義方法並調用?
WPF 的開源項目有哪些?
有哪些值得學習的 Go 語言開源項目?
Windows 使用了哪些第三方的開源軟體?

TAG:開源 | 計算機視覺 | 深度學習DeepLearning | 行人重識別 | 行人檢測 |