行人檢測/人體檢測綜述

行人檢測/人體檢測綜述

更詳細的資料整理到了個人的github上,地址爲
https://github.com/whitenightwu/11-Algorithm_and_Data\11-Paper Summary(根據應用劃分)\53-行人檢測和行人重識別\Pedestrian Detection

數據集

現在用的最多的數據集是CityPersons、Caltech-USA和KITTI,二者都是比較大且具有挑戰性的。Caltech-USA有大量的方法使用因而比較起來比較方便,而KITTI的數據集更加豐富一些但是用的。

1)Caltech dataset,其評價方法FPPW>FPPI

2)CityPersons是目前的最佳選擇。行人檢測任務存在一個領域遷移能力差的問題,例如在 Caltech dataset 上訓練的模型在其上的性能很好,但是其在 KITTI dataset上的性能卻比較差。之所以出現這樣的問題是因爲現有的數據集的多樣性不夠,CVPR 2017上將會公佈一個新的行人檢測數據集:CityPersons。
CityPersons數據集是脫胎於語義分割任務的Cityscapes數據集,對這個數據集中的所有行人提供 bounding box 級別的對齊性好的標籤。由於CityPersons數據集中的數據是在3個不同國家中的18個不同城市以及3個季節中採集的,其中單獨行人的數量明顯高於Caltech 和 KITTI 兩個數據集。實驗結果也表明,CityPersons 數據集上訓練的模型在 Caltech 和 KITTI 數據集上的測試漏檢率更低。也就是說,CityPersons數據集的多樣性更強,因而提高了模型的泛化能力。

3)KITTI數據集

4)INRIA數據集:該數據庫是“HOG+SVM”的作者Dalal創建的,該數據庫是目前使用最多的靜態行人檢測數據庫,提供原始圖片及相應的標註文件。
訓練集有正樣本614張(包含2416個行人),負樣本1218張;測試集有正樣本288張(包含1126個行人),負樣本453張。圖片中人體大部分爲站立姿勢且高度大於100個象素,部分標註可能不正確。圖片主要來源於GRAZ-01、個人照片及google,因此圖片的清晰度較高。在XP操作系統下部分訓練或者測試圖片無法看清楚,但可用OpenCV正常讀取和顯示。

5)TUD行人數據庫

6)CrowdHuman數據集,比較新的數據集,是face++於2018年發佈的


性能指標

1)FPPW (False Positive per Window)
基本含義:給定一定數目N的負樣本圖像,分類器將負樣本判定爲“正”的次數FP,其比率FP/N即爲FPPW。意義與ROC中的假陽率相同。FPPW中,一張圖就是一個樣本。
評價方法一般是FPPW>FPPI。FPPI 相比於FPPW來說,更接近於分類器的實際應用情況。

2)FPPI (False Positive per Image)
基本含義:給定一定數目N的樣本集,內含N張圖像,每張圖像內包含或不包含檢測目標。FPPI = (False Positive 次數)/N。(即平均每張圖中 能 正確檢索到的數目)。

每張圖像均需要標定:包含目標的個數;目標的準確位置L。而後在每張圖像上運行分類器,檢測目標並得到位置p。然後,檢查每張圖像內的檢測結果是否“擊中”標定的目標:
a. 若圖像內無目標,而分類器給出了n個“目標”檢測結果,那麼False Positive 次數 +n;
b. 若圖像內有目標,則判斷p是否擊中L,判斷標準參看上述文章(主要看p與L的重疊率)。若判斷未擊中,則False Positive 次數 +1。

3)miss rate,漏檢率
miss rate = sum(fn) / (sum(tp) + sum(fn)) = (1-recall rate),即miss rate = 測試集正例判別爲負例的數目 / 全部groud truth的數量。
同時,recall rate + miss rate = 1

4)行人檢測評估表的理解
行人檢測評估表即:miss rate VS fppi。

評估表的miss rate 是log-average miss rate。若每幅圖像miss rate爲x。則log-average miss rate爲:
2的[log(x1)+log(x2)+log(x3)+…log(xn)]/n 次冪

實例:測試的n幅Full Image 圖像下出現了多少個誤撿的窗口,假設是100幅中有1個誤撿窗口,即fppi爲10-2,那麼此時的100幅圖像中每一幅圖像都有自己的miss rate,然後對這些miss rate 求log平均,從而得到log-average miss rate。


常用算法

傳統算法

2016年以前,主流方法是多特徵融合的方法加上級聯分類器,即手工特徵 + SVM + adaboost。
常用的特徵有Harry-like、Haar特徵、Hog特徵、改進的HOG、LBP特徵、Edgelet特徵、CSS特徵、COV特徵、積分通道特徵以及CENTRIST特徵。

一般的離線訓練過程:
1)輸入爲標準圖像庫中的圖像,對於正樣本,直接提取特徵;對於負樣本,多尺度遍歷整幅圖像,進行特徵提取。提取Harr,LBP,HOG三種特徵並保存爲積分圖形式。
2)對於cascade的每一級進行如下操作:用Adaboost進行特徵選擇,選出最好的特徵。在前面的幾級用Harr和LBP這兩種計算較快的特徵,後幾級用HOG。
3)進行級數調整,直到達到要求的檢測率和錯誤率。

一般的檢測過程(influence過程):
1)輸入圖像,多尺度遍歷整幅圖像,進行特徵提取:提取Harr,LBP,HOG三種特徵並保存爲積分圖形式。
2)將所有子窗口輸入訓練得到的模型中,經cascade分類器後,根據檢測結果即可標定行人區域,通過一些後處理(例如,合併臨近的窗口),就可以對行人進行定位,達到檢測的目的。

特別介紹一下HOG+SVM

方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和圖像處理中用來進行物體檢測的特徵描述子。
出於速度上的實用性考慮,至今雖然有很多行人檢測算法,但基本都是以HOG+SVM的思路爲主(如果要進一步提升精度的話,還會加入adaboost,這樣就需要相當的優化技巧了)。
HOG+SVM作爲經典算法直接就集成到opencv裏面去了,可以直接調用實現行人檢測。
例子:https://github.com/icsfy/Pedestrian_Detection

深度學習興起前的基於NN的傳統算法

在2015年,最好的行人檢測方法是通過Adaboost學習的決策樹,包括SquaresChnFtrs,InformedHaar,SpatialPooling,LDCF和Regionlets,這些方法都是ICF結構的變體。
之前的基於cnn的方法使用的是人工設計的特徵,最早的方法ConvNet的輸入是YUV圖像,DBN-Isol和DBN-Mut的輸入是HOG,MultiSDP使用HOG+CSS作爲輸入,JointDeep和SDN使用YUV+梯度作爲輸入。

NN算法

用cnn的有太多了,但沒有一個特別主流的cnn算法,而目前主流的行人檢測算法大多基於兩階段的檢測器框架,即rcnn相關方法,如 fast faster等等。
svm加hog這類方法更多用於做分類classification ,而不是檢測detection。即拿到一個對象後對其進行判斷,而不是在一副圖像裏找一個對象。如果遍歷來做計算量就上去了。

較早時候,基於CNN的行人檢測方法中比較好的是SDN(在這之前的方法沒有直接使用LeNet的)。
後來,將CNN結合DPM,提出了新的形變池化層。
https://github.com/samylee/Multi_Scale_PersonDet這一個是用mtcnn的,實時但效果也沒說。
RepLoss是face++的,效果很好。


難點

1)一個是低分辨率情況的背景和小尺寸的人很難區分。小尺度的弊端:a)大多數小尺寸實例出現帶有邊框模糊,外觀模糊。將它們與雜亂的背景和其他重疊實例區分開很難。b)大尺寸的行人實例通常表現出與小尺寸實例顯着不同的視覺特徵。
解決:對與小目標檢測,用結合FPN+在線hard samples數據增強,再調整合適大小的anchors,就很不錯了。

2)另一個是遮擋問題。對於行人檢測而言,實際情況中幾乎都是遮擋的,所以根本性的難題就是遮擋問題。
也有兩種:a)多個人在一起的時候基於CNN的單個行人的檢測定位誤差相對較大,即行人個體之間的相互遮擋,這往往會引入大量的干擾信息,進而導致虛檢;b)其他物體對行人的遮擋,這往往會帶來目標信息的缺失,進而導致漏檢。
對於遮擋情況下的行人檢測,主要有兩種解決思路:一是對目標候選框分成不同part逐一處理、區別對待再加以特徵融合;二是從loss的角度使得目標候選框對相互遮擋的情況更具判別性,如CVPR2018的RepLoss,ECCV2018的OR-CNN。

儘管近年來有大量工作聚焦於行人檢測中的遮擋問題,但現有算法距離該問題的解決依然還有很長的路要走,從論文中展現的結果來看,遮擋情況下的檢測結果要遠遠劣於非遮擋情況下的結果。一個很關鍵的原因來自於人羣密集場景下行人自遮擋的情況普遍存在,在訓練數據有限的情況下,基於有監督訓練得到的檢測器難以學習到無法窮盡的各種遮擋情況,因此如何利用現有的無監督或者半監督方式來改善這個問題,應該是非常值得探索的一個方向,期待你的精彩發現。

對行人檢測問題的分析

對行人檢測問題的分析,來自《How Far are We from Solving Pedestrian Detection》中,caltech行人測試集上的failure case進行分析,failure case主要有兩類,一類是false positive,一類是false negative。
1)false positive(不是人,卻預測成了人)來源的原因分析如下圖,主要有9個來源,9個來源又被歸爲三類原因:定位不準、背景、標註錯誤。定位不準的問題文章認爲來自於訓練集標註的框不準,於是文章重新標註了一遍數據集,最後實驗下來發現提高訓練集標註框的精度的確有助於提高檢測器的效果。而背景問題也是行人檢測裏邊的老大難問題,比如路邊的指示牌、車後面的方向燈、樹葉等等都可能被識別爲行人,現在也沒啥好的解決方法。
2)false negative來源的原因分析,主要有6個來源。其中尺寸小和遮擋是衆所周知的難題。而side view和cyclists,文章認爲是由於訓練集裏這兩類情況表達不足,也就是訓練集裏邊這類情況比較少,解決這種問題的最好方法是在訓練集中增加對應圖片。對於尺寸小的問題,文章又進一步分析,尺寸小的行人包含三種問題:模糊不清、像素點少、對比度差,經過實驗,文章發現像素點少纔是尺寸小的行人容易出現false negative的原因。

對於傳統機器學習的改進

對於傳統機器學習的改進,做的最多的就是增加或者多樣化輸入圖像的特徵。通過更多的和更高維度的特徵,分類的任務似乎是變簡單了,結果也有了改進。很多種類的特徵已經被發現:邊緣信息,顏色信息,紋理信息,局部形狀信息,協方差特徵,還有其他等等。越來越多的特徵已被證明可以系統性的改善性能。
還有hand-crafted feature,part and occlusion建模。

瞎逼逼一些

人臉檢測的算法也可以用於行人檢測,它們都是目標檢測,只是針對的應用場合不同(所以可能會有先驗條件上的不同,這就導致了算法上的不同)

只要detection夠強,這算法就效果很好,但detect並不能每一幀都檢測到,所以後來又有了deep sort,多目標一般都是tracking by detection。

看知網時,發現還有很多論文是基於紅外的行人檢測

用上GPU,稍微快一點的都是實時行人檢測

曠視科技俞剛的歷經
基於深度學習,Detection 組開始做的第一個任務就是行人檢測,最開始使用 fast rcnn,後來慢慢切換到 faster rcnn。同時 Detection 組開始基於行人檢測做人體骨架算法。另外,爲了更精細的定位人體框,Detection 組又做了一些分割算法。

2018年行人檢測

在過去的一年中,行人檢測領域的工作大致可被歸爲以下三類:
卷積神經網絡爲通用物體檢測任務帶來了全面的性能提升。而行人檢測技術也使用了Faster R-CNN 這樣的通用檢測框架,因而性能也得到了很大的提升。在 CVPR 2015中,當時在競賽中的最好方法使用的還是傳統的ACF 檢測器,其漏檢率是18.5%;而在 ECCV 2016中,在使用了 CNN 後,行人檢測漏檢率降低到了9.6%。

第一類是將傳統的檢測方法Boosting trees 和 CNN 結合起來。張姍姍等人在CVPR 2016的工作是使用 ICF 提取proposal,然後使用 CNN 進行重新打分來提高檢測的性能;在 ECCV 2016上,中山大學林倞教授課題組使用RPN 提取 proposal,同時提取卷積特徵,然後使用 Boosting trees進行二次分類,性能得到了很大的提升。

第二類是解決多尺度問題,例如在視頻數據中人的尺度變化問題。顏水成教授課題組提供了一種解決方法:訓練兩個網絡,一個網絡關注大尺度的人,另一個網絡關注小尺度的人,在檢測時將兩個網絡進行加權融合得到最終的結果,這樣能使性能得到很大的提升;UCSD 在 ECCV 2016上有一個類似的工作,提出在高層提取大尺度人的特徵,在低層提取小尺度人的特徵,這樣能保留儘量多的信息量,使得對小尺度的行人也有較好的檢測效果。

第三類是使用語義分割信息來輔助行人檢測。首先對整個圖像進行語義分割,然後將分割的結果作爲先驗信息輸入到檢測網絡中(包括傳統的 ICF 網絡,以及現在常用的CNN),這樣可以通過對整體環境的感知來提高檢測的效果。

實際代碼測試

行人檢測有三個可以嘗試的(有代碼和model的):ALFNet、HOG和faster-rcnn的變種

1)ALFNet是2018年ECCV的,優先嚐試,性能好,速度差不多是ssd/mtcnn的速度(https://github.com/liuwei16/ALFNet)

2)HOG基本上是2015年前最好的了,就算是現在精度也不差,而且直接用opencv就行。(https://github.com/icsfy/Pedestrian_Detection)

3)faster-rcnn的變種有很多,基本上是刷榜跑分的論文,可以去試一下 (https://github.com/CharlesShang/TFFRCNN)和(https://github.com/longcw/faster_rcnn_pytorch)


參考資料

https://blog.csdn.net/xiaofei0801/article/details/72800977

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