1. 如何用OpenCV自帶的adaboost程序訓練並檢測目標
轉自:http://hi..com/andyzcj/blog/item/3b9575fc63c3201f09244d9a.html可能遇到的問題:1.如果跑到某一個分類器時,幾個小時也沒有反應,而且顯示不出訓練百分比,這是因為你的負樣本數量太少,或者負樣本的尺寸太小,所有的負樣本在這個分類器都被reject了,程序進入不了下一個循環,果斷放棄吧。解決方法:負樣本盡量要大一些,比如我的正樣本是40*15,共300個,負樣本是640*480,共500個。2.讀取樣本時報錯:,網上說這個錯誤是因為opencv規定單幅iplimage的內存分配不能超過10000,可是我的每個負樣本都不會超過這個大小,具體原因不明。後來我把負樣本的數量減少,尺寸加大,這個問題就解決了。最近要做一個性別識別的項目,在人臉檢測與五官定位上我採用OPENCV的haartraining進行定位,這里介紹下這兩天我學習的如何用opencv訓練自己的分類器。在這兩天的學習里,我遇到了不少問題,不過我遇到了幾個好心的大俠幫我解決了不少問題,特別是無忌,在這里我再次感謝他的幫助。一、簡介目標檢測方法最初由PaulViola[Viola01]提出,並由RainerLienhart[Lienhart02]對這一方法進行了改善。該方法的基本步驟為:首先,利用樣本(大約幾百幅樣本圖片)的harr特徵進行分類器訓練,得到一個級聯的boosted分類器。分類器中的"級聯"是指最終的分類器是由幾個簡單分類器級聯組成。在圖像檢測中,被檢窗口依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。分類器訓練完以後,就可以應用於輸入圖像中的感興趣區域的檢測。檢測到目標區域分類器輸出為1,否則輸出為0。為了檢測整副圖像,可以在圖像中移動搜索窗口,檢測每一個位置來確定可能的目標。為了搜索不同大小的目標物體,分類器被設計為可以進行尺寸改變,這樣比改變待檢圖像的尺寸大小更為有效。所以,為了在圖像中檢測未知大小的目標物體,掃描程序通常需要用不同比例大小的搜索窗口對圖片進行幾次掃描。目前支持這種分類器的boosting技術有四種:DiscreteAdaboost,RealAdaboost,GentleAdaboostandLogitboost。"boosted"即指級聯分類器的每一層都可以從中選取一個boosting演算法(權重投票),並利用基礎分類器的自我訓練得到。根據上面的分析,目標檢測分為三個步驟:1、樣本的創建2、訓練分類器3、利用訓練好的分類器進行目標檢測。二、樣本創建訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本,反例樣本指其它任意圖片。負樣本負樣本可以來自於任意的圖片,但這些圖片不能包含目標特徵。負樣本由背景描述文件來描述。背景描述文件是一個文本文件,每一行包含了一個負樣本圖片的文件名(基於描述文件的相對路徑)。該文件創建方法如下:採用Dos命令生成樣本描述文件。具體方法是在Dos下的進入你的圖片目錄,比如我的圖片放在D:\face\posdata下,則:按Ctrl+R打開Windows運行程序,輸入cmd打開DOS命令窗口,輸入d:回車,再輸入cdD:\face\negdata進入圖片路徑,再次輸入dir/b>negdata.dat,則會圖片路徑下生成一個negdata.dat文件,打開該文件將最後一行的negdata.dat刪除,這樣就生成了負樣本描述文件。dos命令窗口結果如下圖:正樣本對於正樣本,通常的做法是先把所有正樣本裁切好,並對尺寸做規整(即縮放至指定大小),如下圖所示:由於HaarTraining訓練時輸入的正樣本是vec文件,所以需要使用OpenCV自帶的CreateSamples程序(在你所按照的opencv\bin下,如果沒有需要編譯opencv\apps\HaarTraining\make下的.dsw文件,注意要編譯release版的)將准備好的正樣本轉換為vec文件。轉換的步驟如下:1)製作一個正樣本描述文件,用於描述正樣本文件名(包括絕對路徑或相對路徑),正樣本數目以及各正樣本在圖片中的位置和大小。典型的正樣本描述文件如下:posdata/1(10).bmp1112323posdata/1(11).bmp1112323posdata/1(12).bmp1112323不過你可以把描述文件放在你的posdata路徑(即正樣本路徑)下,這樣你就不需要加前面的相對路徑了。同樣它的生成方式可以用負樣本描述文件的生成方法,最後用txt的替換工具將「bmp」全部替換成「bmp1112323」就可以了,如果你的樣本圖片多,用txt替換會導致程序未響應,你可以將內容拷到word下替換,然後再拷回來。bmp後面那五個數字分別表示圖片個數,目標的起始位置及其寬高。這樣就生成了正樣本描述文件posdata.dat。2)運行CreateSamples程序。如果直接在VC環境下運行,可以在Project\Settings\Debug屬性頁的Programarguments欄設置運行參數。下面是一個運行參數示例:-infoD:\face\posdata\posdata.dat-vecD:\face\pos.vec-num50-w20-h20表示有50個樣本,樣本寬20,高20,正樣本描述文件為posdata.dat,結果輸出到pos.vec。或者在dos下輸入:"D:\ProgramFiles\OpenCV\bin\createsamples.exe"-info"posdata\posdata.dat"-vecdata\pos.vec-num50-w20-h20運行完了會d:\face\data下生成一個*.vec的文件。該文件包含正樣本數目,寬高以及所有樣本圖像數據。結果入下圖:Createsamples程序的命令行參數:命令行參數:-vec訓練好的正樣本的輸出文件名。-img源目標圖片(例如:一個公司圖標)-bg背景描述文件。-num要產生的正樣本的數量,和正樣本圖片數目相同。-bgcolor背景色(假定當前圖片為灰度圖)。背景色制定了透明色。對於壓縮圖片,顏色方差量由bgthresh參數來指定。則在bgcolor-bgthresh和bgcolor+bgthresh中間的像素被認為是透明的。-bgthresh-inv如果指定,顏色會反色-randinv如果指定,顏色會任意反色-maxidev背景色最大的偏離度。-maxangel-maxangle,-maxzangle最大旋轉角度,以弧度為單位。-show如果指定,每個樣本會被顯示出來,按下"esc"會關閉這一開關,即不顯示樣本圖片,而創建過程繼續。這是個有用的debug選項。-w輸出樣本的寬度(以像素為單位)-h《sample_height》輸出樣本的高度,以像素為單位。到此第一步樣本訓練就完成了。恭喜你,你已經學會訓練分類器的五成功力了,我自己學這個的時候花了我一天的時間,估計你幾分鍾就學會了吧。三、訓練分類器樣本創建之後,接下來要訓練分類器,這個過程是由haartraining程序來實現的。該程序源碼由OpenCV自帶,且可執行程序在OpenCV安裝目錄的bin目錄下。Haartraining的命令行參數如下:-data存放訓練好的分類器的路徑名。-vec正樣本文件名(由trainingssamples程序或者由其他的方法創建的)-bg背景描述文件。-npos,-nneg用來訓練每一個分類器階段的正/負樣本。合理的值是:nPos=7000;nNeg=3000-nstages訓練的階段數。-nsplits決定用於階段分類器的弱分類器。如果1,則一個簡單的stumpclassifier被使用。如果是2或者,則帶有number_of_splits個內部節點的CART分類器被使用。-mem預先計算的以MB為單位的可用內存。內存越大則訓練的速度越快。-sym(default)-nonsym指定訓練的目標對象是否垂直對稱。垂直對稱提高目標的訓練速度。例如,正面部是垂直對稱的。-minhitrate《min_hit_rate》每個階段分類器需要的最小的命中率。總的命中率為min_hit_rate的number_of_stages次方。-maxfalsealarm沒有階段分類器的最大錯誤報警率。總的錯誤警告率為max_false_alarm_rate的number_of_stages次方。-weighttrimming指定是否使用權修正和使用多大的權修正。一個基本的選擇是0.9-eqw-mode選擇用來訓練的haar特徵集的種類。basic僅僅使用垂直特徵。all使用垂直和45度角旋轉特徵。-w《sample_width》-h《sample_height》訓練樣本的尺寸,(以像素為單位)。必須和訓練樣本創建的尺寸相同。一個訓練分類器的例子:"D:\ProgramFiles\OpenCV\bin\haartraining.exe"-datadata\cascade-vecdata\pos.vec-bgnegdata\negdata.dat-npos49-nneg49-mem200-modeALL-w20-h20訓練結束後,會在目錄data下生成一些子目錄,即為訓練好的分類器。訓練結果如下:恭喜你,你已經學會訓練分類器的九成功力了。四:利用訓練好的分類器進行目標檢測。這一步需要用到performance.exe,該程序源碼由OpenCV自帶,且可執行程序在OpenCV安裝目錄的bin目錄下。performance.exe-datadata/cascade-infoposdata/test.dat-w20-h20-rs30performance的命令行參數如下:Usage:./performance-data-info[-maxSizeDiff][-maxPosDiff][-sf][-ni][-nos][-rs][-w][-h]也可以用opencv的cvHaarDetectObjects函數進行檢測:CvSeq*faces=cvHaarDetectObjects(img,cascade,storage,1.1,2,CV_HAAR_DO_CANNY_PRUNING,cvSize(40,40));//3.檢測人臉
2. deep learning 目標檢測(一)之R-CNN
Since we combine region proposals with CNNs, we call our method R-CNN: Regions with CNN
features.
下面先介紹R-CNN和Fast R-CNN中所用到的邊框回歸方法。
為什麼要做Bounding-box regression?
如上圖所示,綠色的框為飛機的Ground Truth,紅色的框是提取的Region Proposal。那麼即便紅色的框被分類器識別為飛機,但是由於紅色的框定位不準(IoU<0.5),那麼這張圖相當於沒有正確的檢測出飛機。如果我們能對紅色的框進行微調,使得經過微調後的窗口跟Ground Truth更接近,這樣豈不是定位會更准確。確實,Bounding-box regression 就是用來微調這個窗口的。
那麼經過何種變換才能從圖11中的窗口P變為窗口呢?比較簡單的思路就是:
注意:只有當Proposal和Ground Truth比較接近時(線性問題),我們才能將其作為訓練樣本訓練我們的線清爛性回歸模型,否則會導致訓練的回歸模型不work(當Proposal跟GT離得較遠,就是復雜的非線性問題了,此時用線性回歸建模顯然不合理)。這個也是G-CNN: an Iterative Grid Based Object Detector多次迭代實現目標准確定位的關鍵蠢悄。
PASCAL VOC為圖像識別和分類提供了一整套標准化的優秀的數據集,從2005年到2012年每年都會舉行一場圖像識別challenge。
模型詳解
RCNN全程就是Regions with CNN features,從名字也可以看出,RCNN的檢測演算法是基於傳統方法來找出一些可能是物體的區域,再把該區域的尺寸歸一化成卷積網路輸入的尺寸,最後判斷該區域到底是不是物體,是哪個物體,以及對是物體的區域進行進一步回歸的微微調整(與深度學習里的finetune去分開,我想表達的就只是對框的位置進行微微調整)學習,使得框的更加答檔漏准確。
正如上面所說的,RCNN的核心思想就是把圖片區域內容送給深度網路,然後提取出深度網路某層的特徵,並用這個特徵來判斷是什麼物體(文章把背景也當成一種類別,故如果是判斷是不是20個物體時,實際上在實現是判斷21個類。),最後再對是物體的區域進行微微調整。實際上文章內容也說過用我之前所說的方法(先學習分類器,然後sliding windows),不過論文用了更直觀的方式來說明這樣的消耗非常大。它說一個深度網路(alexNet)在conv5上的感受野是195×195,按照我的理解,就是195×195的區域經過五層卷積後,才變成一個點,所以想在conv5上有一個區域性的大小(7×7)則需要原圖為227×227,這樣的滑窗每次都要對這么大尺度的內容進行計算,消耗可想而知,故論文得下結論,不能用sliding windows的方式去做檢測(消耗一次用的不恰當,望各位看官能說個更加准確的詞)。不過論文也沒有提為什麼作者會使用先找可能區域,再進行判斷這種方式,只是說他們根據09年的另一篇論文[1],而做的。這也算是大神們與常人不同的積累量吧。中間的深度網路通過ILSVRC分類問題來進行訓練,即利用訓練圖片和訓練的分類監督信號,來學習出這個網路,再根據這個網路提取的特徵,來訓練21個分類器和其相應的回歸器,不過分類器和回歸器可以放在網路中學習,
R-CNN 模型
如果要擬人化比喻,那 R-CNN 肯定是 Faster R-CNN 的祖父了。換句話說,R-CNN 是一切的開端。
R-CNN,或稱 Region-based Convolutional Neural Network,其工作包含了三個步驟:
1.藉助一個可以生成約 2000 個 region proposal 的「選擇性搜索」(Selective Search)演算法,R-CNN 可以對輸入圖像進行掃描,來獲取可能出現的目標。
2.在每個 region proposal 上都運行一個卷積神經網路(CNN)。
3.將每個 CNN 的輸出都輸入進:a)一個支持向量機(SVM),以對上述區域進行分類。b)一個線性回歸器,以收縮目標周圍的邊界框,前提是這樣的目標存在。
下圖具體描繪了上述 3 個步驟:
Abstract :
R-CNN的兩個貢獻:1.cnn卷積層的能力很強,可以遍歷候選區域達到精確的定位。2.當有標簽的數據很少的時候,我們可以事前進行有標簽(別的數據集上?)的預訓練作為輔助任務,然後對特定的區域進行微調。
Introction:
這篇文章最開始是在PASCAL VOC上在圖像分類和目標檢測方面取得了很好的效果。
為了達到很好的效果,文章主要關注了兩個問題:1.用深層網路進行目標的定位。2.如何用少量的帶標簽的檢測數據來訓練模型
對於 對一個問題目標定位 ,通常有兩個思路可以走:
1.把定位看成回歸問題。效果不是很好。
2.建立劃窗檢測器。
CNN一直採用建立劃窗這個方式,但是也只是局限於人臉和行人的檢測問題上。
本文使用了五個卷積層(感受野食195*195),在輸入時移動步長是32*32。
除此之外,對於定位問題,我們採用區域識別的策略。
在測試階段,本文的方法產生了大約2000個類別獨立的候選區域作為cnn的輸入。然 後得到一個修正後的特徵向量。然後對於特定的類別用線性SVM分類器分類。我們用簡 單的方法(放射圖像變形)來將候選區域變成固定大小。
對於第二個缺少標簽數據的問題
目前有一個思路就是無監督的預訓練,然後再加入有監督的微調。
作為本文最大的貢獻之二:在ILSVRC數據集上,我們先進行有監督的預訓練。然 後我們在PASCAL這個小數據集上我們進行特定區域的微調。在我們的實驗中,微調 可以提升8%的mAP。
本文的貢獻;效率高
僅僅是特別類別的計算是合乎情理的矩陣運算,和非極大值抑制演算法。他們共享權 值,並且都是低維特徵向量。相比於直接將區域向量作為輸入,維數更低。
本文方法處理能實現目標檢測,還以為實現語義分割。
2.用R-CNN進行目標檢測:
有3個Model:
(1)產生獨立的候選區域。
(2)CNN產生固定長度的特徵向量。
(3)針對特別類別的一群svm分類器。
2.1 模塊的設計
候選區域:
之前有大量的文章都提過如果產生候選區域。本文採用SS(selective search )方法。參考文獻【34】+【36】
特徵抽取:
對於每個候選區域,我們採用cnn之後得到4096維向量。
2.2 測試階段的檢測
在測試階段,我們用選擇性搜素的方式在測試圖片上選取了2000個候選區域,如上圖所示的步驟進行。
運行時間分析: 總之當時相比很快。
2.3訓練模型
有監督的預訓練: 我們使用了大量的ILSVRC的數據集來進行預訓練CNN,但是這個標簽是圖片層的。換句話說沒有帶邊界這樣的標簽。
特定區域的微調: 我們調整VOC數據集的候選區域的大小,並且我們把ImageNet上午1000類,變成了21類(20個類別+1個背景)。我們把候選區域(和真實區域重疊的)大於0.5的標記為正數,其他的標記為負數。然後用32個正窗口和96個負窗口組成128的mini-batch。
目標類別分類器:
對於區域緊緊的包括著目標的時候,這肯定就是正樣本。對於區域裡面全部都是背景的,這也十分好區分就是負樣本。但是某個區域裡面既有目標也有背景的時候,我們不知道如歌標記。本文為了解決這個,提出了一個閾值:IoU覆蓋閾值,小於這個閾值,我們標記為負樣本。大於這個閾值的我們標記為正樣本。我們設置為0.3。這個是一個超參數優化問題。我們使用驗證集的方法來優化這個參數。然而這個參數對於我們的最後的性能有很大的幫助。
一旦,我們得到特徵向量。因為訓練數據太大了。我們採用standard hard negative mining method(標准難分樣本的挖掘)。這個策略也是的收斂更快。
2.4 Results on PASCAL VOC 201012
3.3. Visualization, ablation, and modes of error
3.1. Visualizing learned features
提出了一個非參數的方法,直接展現出我們的網路學習到了什麼。這個想法是將一個特定的單元(特性)放在其中使用它,就好像它自己是一個對象檢測器正確的。具體方法就是:我們在大量候選區域中,計算每個單元的激勵函數。按從最高到最低排序激活輸出,執行非最大值抑制,然後顯示得分最高的區域。我們的方法讓選定的單元「為自己說話」通過顯示它所觸發的輸入。我們避免平均為了看到不同的視覺模式和獲得洞察力為單位計算的不變性。我們可以看到來著第五個maxpooling返回的區域。第五層輸出的每一個單元的接受野對應輸出227*227的其中的195*195的像素區域。所以中心那個點單元有全局的視覺。
3.2. Ablation studies
實際上ablation study就是為了研究模型中所提出的一些結構是否有效而設計的實驗。比如你提出了某某結構,但是要想確定這個結構是否有利於最終的效果,那就要將去掉該結構的網路與加上該結構的網路所得到的結果進行對比,這就是ablation study。
Performance layer-by-layer, without fine-tuning.
我們只觀察了最後三層
Performance layer-by-layer, with fine-tuning.
微調之後,fc6和fc7的性能要比pool5大得多。從ImageNet中學習的pool5特性是一般的,而且大部分的提升都是從在它們之上的特定領域的非線性分類器學習中獲得的。
Comparison to recent feature learning methods.
見上圖
3.3. Detection error analysis
CNN的特徵比HOG更加有區分。
3.4. Bounding box regression
有了對錯誤的分析,我們加入了一種方法來減少我們的定位錯誤。我們訓練了一個線性的回歸模型
HOG和SIFT很慢。但是我們可以由此得到啟發,利用有順序等級和多階段的處理方式,來實現特徵的計算。
生物啟發的等級和移不變性,本文採用。但是缺少有監督學習的演算法。
使得卷積訓練變得有效率。
第一層的卷積層可以可視化。
【23】本文採用這個模型,來得到特徵向量
ImageNet Large Scale Visual Recognition Competition
用了非線性的激勵函數,以及dropout的方法。
【34】直接將區域向量作為輸入,維數較高。IoU覆蓋閾值=0.5,而本文設置為0.3,能提高5個百分點。產生候選區域的方式:selective search 也是本文所採取的方式是結合【34】+【36】。
【5】產生候選區域的方式為:限制參數最小割
bounding box regression
HOG-based DPM文章3.2section中的對比試驗。
縮略圖概率。
[18][26][28]文章3.2section中的對比試驗。
3. 小目標檢測的方法總結
一、圖片輸入層面
基於以上結論,採用多尺度訓練過程中,要在避免那些極小的和極大的(多尺度後)帶來的不好的影響時,考慮保證目標有足夠的多樣性。所以在進行多尺度訓練過程中,將每種輸入尺度下,不滿足要求的proposal以及anchor忽略。論文中使用了三種尺度如圖所示,比一般的多尺度訓練的尺度跨度要大。
二、 Neck部分(採用金字塔結構改進方案的)
一般意義的FPN網路結構是最右邊似的結構,而本文中採用的結構則是
該方法首先無疑是增加了計算量,優點就是最終輸出的每一層的特徵不是一個線性的變換(應該想表述的說不是從一層特徵直接到另一層特徵),而是使用共享的多層特徵。最終相比RetinaNet提升一個點左右吧,效果一般。VisDrone2020檢測的冠軍團隊採用了這個結構
該文章利用多個TUM模塊試圖更充分構建的特徵金字塔的網路結構,靠前的TUM提供淺層特徵,中間的殲哪TUM提供中間層特徵,靠後的TUM提供深層特徵,通過這種方式能夠多次將深層淺層特徵融合,參數量多了。和RetinaNet對比可以看到,512輸入,都不採用multi-scale推理,mAP由33提升到37.6,小目標精度也提升了一點;以參數量和計算量堆砌的精度提升,不是好方法。
文章認為不同層的重要程度應該和嫌租目標的絕對尺度分布有關系,所以在FPN自上而下融合的時候,加入了一個尺度因子用來平衡金字塔不同層的重要性。個人感覺意義不大,實際提升也不明顯。氏者碼
三、 Head部分的改進方案
在VisDrones上的冠軍方案和若干其他方案都採用了這種「雙頭部」的方案。soft-NMS似乎可以提升幾個點。
四、 小目標目前檢測不好,主要原因不是小,應該是小且和背景接近,對比度不高。所以可以借鑒偽裝物體檢測的思路;
4. 目標檢測演算法圖解:一文看懂RCNN系列演算法
姓名:王咫毅
學號:19021211150
【嵌牛導讀】CNN如此風靡,其衍生演算法也是層出不窮,各種衍生演算法也可以應用於各種應用場景,各類場合。本文則是了解每個衍生演算法的各個使用場景、原理及方法。
【嵌牛鼻子】RCNN 目標檢測
【嵌牛提問】RCNN系列演算法有何區別和聯系?
【嵌牛正文】
在生活中,經常會遇到這樣的一種情況,上班要出門的時候,突然找不到一件東西了,比如鑰匙、手機或者手錶等。這個時候一般在房間翻一遍各個角落來尋找不見的物品,最後突然一拍大腦,想到在某一個地方,在整個過程中有時候是很著急的,並且越著急越找不到,真是令人沮喪。但是,如果一個簡單的計算機演算法可以在幾毫秒內就找到你要找的物品,你的感受如何?是不是很驚奇!這就是對象檢測演算法(object detection)的力量。雖然上述舉的生活例子只是一個很簡單的例子,但對象檢測的應用范圍很廣,跨越多個不同的行業,從全天候監控到智能城市的實時車輛檢qian測等。簡而言之,物體檢測是強大的深度學習演算法中的一個分支。
在本文中,我們將深入探討可以用於對象檢測的各種演算法。首先從屬於RCNN系列演算法開始,即RCNN、 Fast RCNN和 Faster RCNN。在之後的文章中,將介紹更多高級演算法,如YOLO、SSD等。
1.解決對象檢測任務的簡單方法(使用深度學習)
下圖說明了對象檢測演算法是如何工作。圖像中的每個對象,從人到風箏都以一定的精度進行了定位和識別。
下面從最簡單的深度學習方法開始,一種廣泛用於檢測圖像中的方法——卷積神經網路(CNN)。如果讀者對CNN演算法有點生疏,建議 閱讀此文 。
這里僅簡要總結一下CNN的內部運作方式:
首先將圖像作為輸入傳掘卜顫遞到網路,然後通過各種卷積和池化層處理,最後以對象類別的形式獲得輸出。
對於每個輸入圖像,會得到一個相應的類別作為輸出。因此可以使用這種技術來檢測圖像中的各種對象。
1.首先,將圖像作為輸入;
2.然後,將圖像分成不同的區域;
3.然後,將每個區域視為單獨的圖像;
4.將所有這些區域傳遞給CNN並將它們分類為各種類別;
5.一旦將每個區域劃分為相應的類後,就可以組合所有這些區域來獲取具有檢測到的對象的原始圖像:
使用這種方法會面臨的問題在於,圖像中的對象可以具有不同的寬高比和空間位置。例如,在某些情況下,對象可能覆蓋了大部分圖像,而在其他情況下,對象可能只覆蓋圖像的一小部分,並且對象的形狀也可能不同。
基於此,需要劃分大量的區域,這會花費大量的計算時間。因此,為了解決這個問題並減少區域數量,可以使用基於區域的CNN,它使用提議方法選擇區域。
2.基於區域的卷積神經網路
2.1 RCNN的思想
RCNN演算法不是在大量區域上工作,而是在圖像中提出了一堆方框,並檢查判敗這些方框中是否包含任何對象。RCNN 使用選擇性搜索從圖像中提取這些框。
下面介紹選擇性搜索以及它如何識別不同的區域。基本上四個區域形成一個對象:不同的比例、顏色、紋理和形狀。選擇性搜索在圖像中識別這些模式弊裂,並基於此提出各種區域。以下是選擇性搜索如何工作的簡要概述:
首先, 將圖像作為輸入:
然後,它生成初始子分段,以便獲得多個區域:
之後,該技術組合相似區域以形成更大的區域(基於顏色相似性、紋理相似性、尺寸相似性和形狀兼容性):
最後,這些區域產生最終的對象位置(感興趣的區域);
下面是RCNN檢測對象所遵循的步驟的簡要總結:
1.首先採用預先訓練的卷積神經網路;
2.重新訓練該模型模型——根據需要檢測的類別數量來訓練網路的最後一層(遷移學習);
3.第三步是獲取每個圖像的感興趣區域。然後,對這些區域調整尺寸,以便其可以匹配CNN輸入大小;
4.獲取區域後,使用SVM演算法對對象和背景進行分類。對於每個類,都訓練一個二分類SVM;
最後,訓練線性回歸模型,為圖像中每個識別出的對象生成更嚴格的邊界框;
[對上述步驟進行圖解分析]( http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf ):
首先,將圖像作為輸入:
然後,使用一些提議方法獲得感興趣區域(ROI)(例如,選擇性搜索):
之後,對所有這些區域調整尺寸,並將每個區域傳遞給卷積神經網路:
然後,CNN為每個區域提取特徵,SVM用於將這些區域劃分為不同的類別:
最後,邊界框回歸(Bbox reg)用於預測每個已識別區域的邊界框:
以上就是RCNN檢測物體的全部流程。
2.2 RCNN的問題
從上節內容可以了解到RCNN是如何進行對象檢測的,但這種技術有其自身的局限性。以下原因使得訓練RCNN模型既昂貴又緩慢:
基於選擇性搜索演算法為每個圖像提取2,000個候選區域;
使用CNN為每個圖像區域提取特徵;
RCNN整個物體檢測過程用到三種模型:
CNN模型用於特徵提取;
線性svm分類器用於識別對象的的類別;
回歸模型用於收緊邊界框;
這些過程相結合使得RCNN非常慢,對每個新圖像進行預測需要大約40-50秒,這實際上使得模型在面對巨大的數據集時變得復雜且幾乎不可能應用。
好消息是存在另一種物體檢測技術,它解決了RCNN中大部分問題。
3.了解Fast RCNN
3.1Fast RCNN的思想
RCNN的提出者Ross Girshick提出了這樣的想法,即每個圖像只運行一次CNN,然後找到一種在2,000個區域內共享該計算的方法。在Fast RCNN中,將輸入圖像饋送到CNN,CNN生成卷積特徵映射。使用這些特徵圖提取候選區域。然後,使用RoI池化層將所有建議的區域重新整形為固定大小,以便將其饋送到全連接網路中。
下面將其分解為簡化概念的步驟:
1.首先將圖像作為輸入;
2.將圖像傳遞給卷積神經網路,生成感興趣的區域;
3.在所有的感興趣的區域上應用RoI池化層,並調整區域的尺寸。然後,每個區域被傳遞到全連接層的網路中;
4.softmax層用於全連接網以輸出類別。與softmax層一起,也並行使用線性回歸層,以輸出預測類的邊界框坐標。
因此,Fast RCNN演算法中沒有使用三個不同的模型,而使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回所標識類的邊界框。
對上述過程進行可視化講解:
將圖像作為輸入:
將圖像傳遞給卷積神經網路t,後者相應地返回感興趣的區域:
然後,在提取的感興趣區域上應用RoI池層,以確保所有區域具有相同的大小:
最後,這些區域被傳遞到一個全連接網路,對其進行分類,並同時使用softmax和線性回歸層返回邊界框:
上述過程說明了Fast RCNN是如何解決RCNN的兩個主要問題,即將每個圖像中的1個而不是2,000個區域傳遞給卷積神經網路,並使用一個模型來實現提取特徵、分類和生成邊界框。
3.2Fast RCNN的問題
Fast RCNN也存在一定的問題,它仍然使用選擇性搜索作為查找感興趣區域的提議方法,這是一個緩慢且耗時的過程,每個圖像檢測對象大約需要2秒鍾。
因此,又開發了另一種物體檢測演算法——Faster RCNN。
4.了解Faster RCNN
4.1. Faster RCNN的思想
Faster RCNN是Fast RCNN的修改版本,二者之間的主要區別在於,Fast RCNN使用選擇性搜索來生成感興趣區域,而Faster RCNN使用「區域提議網路」,即RPN。RPN將圖像特徵映射作為輸入,並生成一組提議對象,每個對象提議都以對象分數作為輸出。
以下步驟通常採用Faster RCNN方法:
1.將圖像作為輸入並將其傳遞給卷積神經網路,後者返回該圖像的特徵圖;
2.在這些特徵圖上應用RPN,返回提議對象及其分數;
3.在這些提議對象上應用RoI池層,以將所有提案降低到相同的大小;
4.最後,將提議傳遞到全連接層,該層在其頂部具有softmax層和線性回歸層,以對對象的邊界框進行分類和輸出;
這里簡要解釋一下RPN是如何運作的:
首先,Faster RCNN從CNN獲取特徵圖並將它們傳遞到區域提議網路。RPN在這些特徵圖上使用滑動窗口,每個窗口生成不同形狀和大小的k個方框( Anchor boxe):
方框是固定尺寸的邊界箱,具有不同的形狀和尺寸。對於每個方框,RPN預測兩件事:
預測錨是對象的概率;
用於邊界框回歸器調整錨點以更好地適合物體的形狀;
在有了不同形狀和大小的邊界框後,將其傳遞到RoI池層。對每個提案並對其進行裁剪,以便每個提案都包含一個對象。這就是RoI池層所做的事情,它為每個方框提取固定大小的特徵圖:
然後將這些特徵圖傳遞到全連接層,該層具有softmax和線性回歸層,最終對對象進行分類並預測已識別對象的邊界框。
4.2Faster RCNN的問題
上述討論過的所有對象檢測演算法都使用區域來識別對象,且網路不會一次查看完整圖像,而是按順序關注圖像的某些部分,這樣會帶來兩個復雜性的問題:
該演算法需要多次通過單個圖像來提取到所有對象;
由於不是端到端的演算法,不同的系統一個接一個地工作,整體系統的性能進一步取決於先前系統的表現效果。
鏈接: https://www.jianshu.com/p/51fc039ae7a4
5. Faster R-CNN:使用RPN實時目標檢測
論文: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
目標檢測網路大多依靠 區域生成 (region proposal)演算法來假設目標的位置。 R-CNN 是採用 Selective Search 演算法來提取(propose)可能的 RoIs(regions of interest) 區域,然後對每個提取區域採用標准 CNN 進行分類。選擇性搜索(Selective Search )方法就是在目標對象周圍設定2000個形狀大小位置不一的候選區域,目標物體在候選區域的可能性還是比較大的。然後對這些區域卷積,找到目標物體,雖然大多數區域都是無用的。與尋找幾乎個區域比起來,這種方法要高效的多。
Fast R-CNN ,不在原始圖像生成備選區域,而是先整張圖片通過卷積網路得到特徵圖,然後在特徵圖上使用備選區域演算法得到感興趣的區域在特徵圖的映射,之後使用 Rol Pool將所有區域變成同樣尺寸,大大減少了這些目標檢測網路的運行時間,但是區域生成的計算成為整個檢測網路的瓶頸。
Faster R-CNN 引入了一個 區域生成網路(Region Proposal Network,RPN) ,該網路與檢測網路共享輸入圖像的卷積特徵,從而使接近零枯昌時間成本的區域生成成為可能。 RPN是一個全卷積網路,可以同時在每個位置預測目標邊界和目標分數。RPN經過端到端的訓練,可以生成高質量的區域候選框,然後提供給Fast R-CNN用於檢測。
Faster R-CNN 由兩個模塊組成:第一個模塊是區域生成的深度全卷積網路,第二個模塊是使用備選區域的Fast R-CNN檢測器。整個系統是一個單個的,統一的目標檢測網路。使用最近流行的「注意力」機制的神經網路術語,RPN模塊告訴Fast R-CNN模塊在哪裡尋找目標。
針對一張圖片,需要獲得的輸出有:
Faster R-CNN 第一步是採用基於分類任務(如ImageNet)的 CNN 模型作為特徵提取器。輸入圖片表示為 H × W × D 的形式,經過預訓練 CNN 模型的處理,得到卷積特徵圖(conv feature map)。
Faster R-CNN 最早是採用在 ImageNet 訓練的 ZF 和 VGG ,其後出現了很多其它權重不同的網路.。如 MobileNet 是一種小型效率高的網路結構,僅有 3.3M 參數;而ResNet-152 的沒含扒參數量達到了 60M;新網路結構,如 DenseNet 在提高了結果的同時,降低了參數數量。
以 VGG16 為例:
VGG16 圖片分類時,輸入為 224×224×3 的張量(即,一張 224×224 像素的 RGB 圖片)。網路結構最後採用 FC 層(而不是 Conv 層)得到固定長度的向量,以進行圖片分類.。對最後一個卷積層的輸出拉伸為1維的向量,然後送入 FC 層。官方實現中是採用的卷積層 conv5/conv5_1 的輸出。
在深度上,卷積特徵圖對圖片的所有信息進行了編碼,同時保持相對於原始圖片所編碼 「things」 的位置。例如,如果在圖片的左上角存在一個紅色正方形,而且卷積層有激活響應,那麼該紅色正方形的信息被卷積層編碼後,仍在卷積特徵圖老滑的左上角。因此利用特徵圖檢測目標所在的位置是可行的。
ResNet 結構逐漸取代 VGG 作為基礎網路,用於提取特徵。ResNet 相對於 VGG 的明顯優勢是,網路更大,因此具有更強的學習能力.。這對於分類任務是重要的,在目標檢測中也應該如此。另外,ResNet 採用殘差連接(resial connection) 和 BN (batch normalization) 使得深度模型的訓練比較容易。
然後,RPN(Region Propose Network) 對提取的卷積特徵圖進行處理,尋找可能包含 目標的 預定義數量的區域(regions,邊界框) 。為了生成候選區域,在最後的共享卷積層輸出的卷積特徵圖上做 3x3 卷積,卷積核共有512個(VGG),後面是ReLU,這樣每個 3x3 區域會得到一個512維的特徵向量。然後這個特徵向量被輸入到兩個全連接層——一個邊界框回歸層(reg)和一個邊界框分類層(cls)。
下面解釋 k, 2k, 4k 的含義。
基於深度學習的目標檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表(bounding-boxes),邊界框是具有不同尺寸(sizes)和長寬比(aspect ratios )的矩形。在構建深度神經網路時,最後的網路輸出一般是固定尺寸的張量輸出(採用RNN的除外)。例如,在圖片分類中,網路輸出是 (C, ) 的張量,C是類別標簽數,張量的每個位置的標量值表示圖片是類別的概率值。
在 RPN 中,通過採用 anchors(錨) 來解決邊界框列表長度不定的問題,即在原始圖像中統一放置固定大小的參考邊界框。上面說到RPN對特徵圖做3x3的卷積,假設每一次卷積需要預測 k 個候選區域,因此,reg層具有 4k 個輸出,編碼 k 個邊界框的坐標,cls層輸出 2k 個分數,估計每個區域是目標或是背景的概率。這 k 個區域就是 被 k 個參考邊界框初始化, k 個參考框就是 k 個錨點,作為第一次預測目標位置的參考 boxes。錨點的中心位於卷積核滑動窗口的中心。默認情況下每個滑動位置使用3個不同尺度(128 2 , 256 2 , 512 2 )3個不同長寬比(1:2, 1:1, 2:1)的錨點,k=9。對於大小為W×H(通常約為2400)的卷積特徵圖,總共有 W×H×k 個錨點。對於RPN的最後兩個全連接層,參數的個數為 512×(4+2)×k.
不同於直接檢測目標的位置,這里將問題轉化為兩部分。對每一個 anchor 而言:
有一種簡單的方法來預測目標的邊界框,即學習相對於參考邊界框的偏移量。假設參考 box:( ),待預測量:( ),一般都是很小的值,以調整參考 box 更好的擬合所需要的。
雖然 anchors 是基於卷積特徵圖定義的,但最終的 anchos 是相對於原始圖片的.
由於只有卷積層和 pooling 層,特徵圖的維度是與原始圖片的尺寸成比例關系的. 即,數學地表述,如果圖片尺寸 w×h,特徵圖的尺寸則是w/r×h/r. 其中,r 是下采樣率(subsampling ratio). 如果在卷積特徵圖空間位置定義 anchor,則最終的圖片會是由 r 像素劃分的 anchors 集。在 VGG 中, r=16。
RPN 利用所有的參考邊界框(anchors),輸出一系列目標的良好的 proposals。針對每個 anchor,都有兩個不同的輸出:
RPN是全卷積網路。
對於分類層,每個 anchor 輸出兩個預測值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score.
對於回歸層,也可以叫邊界框調整層,每個 anchor 輸出 4 個預測值:
(Δxcenter,Δycenter,Δwidth,Δheight),用於 anchors 來得到最終的 proposals。根據最終的 proposal 坐標和其對應的 objectness score,即可得到良好的 objects proposals.
RPN 有兩種類型的預測值輸出:二值分類和邊界框回歸調整。
為了訓練RPN,我們為每個錨點分配一個二值類別標簽(是目標或不是目標)。我們給兩種錨點分配一個正標簽:(i)具有與實際邊界框的重疊最高交並比(IoU)的錨點,或者(ii)具有與實際邊界框的重疊超過0.7 IoU的錨點。注意,單個真實邊界框可以為多個錨點分配正標簽。通常第二個條件足以確定正樣本;但我們仍然採用第一個條件,因為在一些極少數情況下,第二個條件可能找不到正樣本。對於所有的真實邊界框,如果一個錨點的IoU比率低於0.3,我們給非正面的錨點分配一個負標簽。既不正面也不負面的錨點不會有助於訓練目標函數。
然後,隨機采樣 anchors 來生成batchsize=256 的 mini-batch,盡可能的保持 foreground 和 background anchors 的比例平衡。
RPN 對 mini-batch 內的所有 anchors 採用二分類交叉熵來計算分類 loss。然後,只對 mini-batch 內標記為 foreground 的 anchros 計算回歸 loss。為了計算回歸的目標targets,根據 foreground anchor 和其最接近的 groundtruth object,計算將 anchor 變換到 object groundtruth 的偏移值 Δ。
Faster R-CNN沒有採用簡單的 L1 或 L2 loss 用於回歸誤差,而是採用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,當 L1 誤差值非常小時,表示為一個確定值即認為是接近正確的,loss 就會以更快的速度消失.
由於 Anchors 一般是有重疊,因此,相同目標的候選區域也存在重疊。
為了解決重疊 proposals 問題,採用 NMS 演算法處理,丟棄與一個 score 更高的 proposal 間 IoU 大於預設閾值的 proposals.
雖然 NMS 看起來比較簡單,但 IoU 閾值的預設需要謹慎處理. 如果 IoU 值太小,可能丟失 objetcs 的一些 proposals;如果 IoU 值過大,可能會導致 objects 出現很多 proposals。IoU 典型值為 0.7。
NMS 處理後,根據 sore 對topN 個 proposals 排序. 在 Faster R-CNN 論文中 N=2000,其值也可以小一點,如 50,仍然能的高好的結果.
當獲得了可能的相關目標和其在原始圖像中的對應位置之後,問題就更加直接了,採用 CNN 提取的特徵和包含相關目標的邊界框,採用 RoI Pooling 處理,並提取相關目標的特徵,得到一個新的向量。
RPN 處理後,可以得到一堆沒有分類得分的目標 proposals。待處理問題為,如何利用這些邊界框並分類。
一種最簡單的方法是,對每個 porposal,裁剪,並送入pre-trained base 網路,提取特徵;然後,將提取特徵來訓練分類器. 但這就需要對所有的 2000 個 proposals 進行計算,效率低,速度慢。Faster R-CNN通過重用卷積特徵圖來加快計算效率,即採用 RoI(region of interest) Pooling 對每個 proposal 提取固定尺寸的特徵圖。然後 R-CNN 對固定尺寸的特徵圖分類。
目標檢測中,包括 Faster R-CNN,常用一種更簡單的方法,即:採用每個 proposal 來對卷積特徵圖裁剪crop,然後利用插值演算法(一般為雙線性插值 bilinear)將每個 crop resize 到固定尺寸14×14×ConvDepth. 裁剪後,利用 2×2 kernel 的 Max Pooling 得到每個 proposal 的最終7×7×ConvDepth 特徵圖.
之所以選擇該精確形狀,與其在下面的模塊(R-CNN)中的應用有關。
R-CNN利用RoI Pooling提取的特徵進行分類,採用全連接層來輸出每個可能的 目標類別的分類得分,是Faster R-CNN框架中的最後一個步驟。
R-CNN 有兩個不同的輸出:
R-CNN 對每個 proposal 的特徵圖,拉平後採用 ReLU 和兩個大小為 4096 維的全連接層進行處理。然後,對每個不同目標採用兩個不同的全連接層處理:一個全連接層有 N+1 個神經單元,其中 N 是類別 class 的總數,包括 background class;一個全連接層有 4N 個神經單元,是回歸預測輸出,得到 N 個可能的類別分別預測 Δcenterx,Δcentery,Δwidth,Δheight。
R-CNN 的目標基本上是與 RPN 目標的計算是一致的,但需要考慮不同的可能的 object 類別 classes.
根據 proposals 和 ground-truth boxes,計算其 IoU。與任何一個 ground-truth box 的 IoU 大於 0.5 的 proposals 被設為正確的 boxes。IoU 在 0.1 到 0.5 之間時設為 background。這里忽略沒有任何交叉的 proposals。這是因為,在此階段,假設已經獲得良好的 proposals。當然,所有的這些超參數都是可以用於調整以更好的擬合 objects。
邊界框回歸的目標計算的是 proposal 與其對應的 ground-truth間的偏移量,只對基於 IoU 閾值設定類別後的 proposals 進行計算。隨機採用一個平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有類別class) 和 75% 的background proposals.
類似於 RPNs 的 losses,對於選定的 proposals,分類 loss 採用 multiclass entropy loss;對於 25% 的 foreground proposals 採用 SmoothL1 loss 計算其與 groundtruth box 的匹配。
由於 R-CNN全連接網路對每個類別僅輸出一個預測值,當計算邊框回歸loss 時需謹慎,只需考慮正確的類別。
類似於 RPN,R-CNN 最終輸出一堆帶有類別分類的objects,在返回結果前,再進一步進行處理。
為了調整邊界框,需要考慮概率最大的類別的 proposals. 忽略概率最大值為 background class 的proposals.
當得到最終的 objects 時,並忽略被預測為 background 的結果,採用 class-based NMS. 主要是通過對 objects 根據類別class 分組,然後根據概率排序,並對每個獨立的分組採用 NMS 處理,最後再放在一起.
最終得到的 objects 列表,仍可繼續通過設定概率閾值的方式,來限制每個類的 objects 數量.
Faster R-CNN在論文中是採用分步方法,對每個模塊分別訓練再合並訓練的權重. 自此,End-to-end 的聯合訓練被發現能夠得到更好的結果.
當將完整的模型合並後,得到 4 個不同的 losses,2 個用於 RPN,2 個用於 R-CNN。4 種不同的 losses 以加權和的形式組織. 可以根據需要對分類 loss 和回歸 loss 設置權重,或者對 R-CNN 和 RPNs 設置不同權重.
採用 SGD 訓練,momentum=0.9. 學習率初始值為 0.001,50K 次迭代後衰減為 0.0001. 這是一組常用參數設置。
6. 目標跟蹤檢測演算法(一)——傳統方法
姓名:劉帆;學號:20021210609;學院:電子工程學院
https://blog.csdn.net/qq_34919792/article/details/89893214
【嵌牛導讀】目標跟蹤演算法研究難點與挑戰在於實際復雜的應用環境 、背景相似干擾、光照條件的變化、遮擋等外界因素以及目標姿態變化,外觀變形,尺度變化、平面外旋轉、平面內旋轉、出視野、快速運動和運動模糊等。而且當目標跟蹤演算法投入實際應用時,不可避免的一個問題——實時性問題也是非常的重要。正是有了這些問題,才使得演算法研究充滿著難點和挑戰。
【嵌牛鼻子】目標跟蹤演算法,傳統演算法
【嵌牛提問】利用目標跟蹤檢測演算法要達到何目的?第一階段的單目標追蹤演算法包括什麼?具體步驟有哪些?它們有何特點?
【嵌牛正文】
第一階段
目標跟蹤分為兩個部分,一個是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一個是對目標特徵進行跟蹤。
1、靜態背景
1)背景差: 對背景的光照變化、雜訊干擾以及周期性運動等進行建模。通過當前幀減去背景圖來捕獲運動物體的過程。
2)幀差: 由於場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類演算法對時間上連續的兩幀或三幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。
與二幀差分法不同的是,三幀差分法(交並運算)去除了重影現象,可以檢測出較為完整的物體。幀間差分法的原理簡單,計算量小,能夠快速檢測出場景中的運動目標。但幀間差分法檢測的目標不完整,內部含有「空洞」,這是因為運動目標在相鄰幀之間的位置變化緩慢,目標內部在不同幀圖像中相重疊的部分很難檢測出來。幀間差分法通常不單獨用在目標檢測中,往往與其它的檢測演算法結合使用。
3)Codebook
演算法為圖像中每一個像素點建立一個碼本,每個碼本可以包括多個碼元(對應閾值范圍),在學習階段,對當前像素點進行匹配,如果該像素值在某個碼元的學習閾值內,也就是說與之前出現過的某種歷史情況偏離不大,則認為該像素點符合背景特徵,需要更新對應點的學習閾值和檢測閾值。
如果新來的像素值與每個碼元都不匹配,則可能是由於動態背景導致,這種情況下,我們需要為其建立一個新的碼元。每個像素點通過對應多個碼元,來適應復雜的動態背景。
在應用時,每隔一段時間選擇K幀通過更新演算法建立CodeBook背景模型,並且刪除超過一段時間未使用的碼元。
4)GMM
混合高斯模型(Gaussian of Micture Models,GMM)是較常用的背景去除方法之一(其他的還有均值法、中值法、滑動平均濾波等)。
首先我們需要了解單核高斯濾波的演算法步驟:
混合高斯建模GMM(Gaussian Mixture Model)作為單核高斯背景建模的擴展,是目前使用最廣泛的一種方法,GMM將背景模型描述為多個分布,每個像素的R、G、B三個通道像素值的變化分別由一個混合高斯模型分布來刻畫,符合其中一個分布模型的像素即為背景像素。作為最常用的一種背景建模方法,GMM有很多改進版本,比如利用紋理復雜度來更新差分閾值,通過像素變化的劇烈程度來動態調整學習率等。
5)ViBe(2011)
ViBe演算法主要特點是隨機背景更新策略,這和GMM有很大不同。其步驟和GMM類似。具體的思想就是為每個像素點存儲了一個樣本集,樣本集中采樣值就是該像素點過去的像素值和其鄰居點的像素值,然後將每一個新的像素值和樣本集進行比較來判斷是否屬於背景點。
其中pt(x)為新幀的像素值,R為設定值,p1、p2、p3….為樣本集中的像素值,以pt(x)為圓心R為半徑的圓被認為成一個集,當樣本集與此集的交集大於設定的閾值#min時,可認為此為背景像素點(交集越大,表示新像素點與樣本集越相關)。我們可以通過改變#min的值與R的值來改變模型的靈敏度。
Step1:初始化單幀圖像中每個像素點的背景模型。假設每一個像素和其鄰域像素的像素值在空域上有相似的分布。基於這種假設,每一個像素模型都可以用其鄰域中的像素來表示。為了保證背景模型符合統計學規律,鄰域的范圍要足夠大。當輸入第一幀圖像時,即t=0時,像素的背景模型。其中,NG(x,y)表示空域上相鄰的像素值,f(xi,yi)表示當前點的像素值。在N次的初始化的過程中,NG(x,y)中的像素點(xi,yi)被選中的可能次數為L=1,2,3,…,N。
Step2:對後續的圖像序列進行前景目標分割操作。當t=k時,像素點(x,y)的背景模型為BKm(x,y),像素值為fk(x,y)。按照下面判斷該像素值是否為前景。這里上標r是隨機選的;T是預先設置好的閾值。當fk(x,y)滿足符合背景#N次時,我們認為像素點fk(x,y)為背景,否則為前景。
Step3:ViBe演算法的更新在時間和空間上都具有隨機性。每一個背景點有1/ φ的概率去更新自己的模型樣本值,同時也有1/ φ的概率去更新它的鄰居點的模型樣本值。更新鄰居的樣本值利用了像素值的空間傳播特性,背景模型逐漸向外擴散,這也有利於Ghost區域的更快的識別。同時當前景點計數達到臨界值時將其變為背景,並有1/ φ的概率去更新自己的模型樣本值(為了減少緩慢移動物體的影響和攝像機的抖動)。
可以有如下總結,ViBe中的每一個像素點在更新的時候都有一個時間和空間上隨機影響的范圍,這個范圍很小,大概3x3的樣子,這個是考慮到攝像頭抖動時會有坐標的輕微來回變化,這樣雖然由於ViBe的判別方式仍認為是背景點,但是也會對後面的判別產生影響,為了保證空間的連續性,隨機更新減少了這個影響。而在樣本值保留在樣本集中的概率隨著時間的增大而變小,這就保證了像素模型在時間上面的延續特性。
6)光流
光流是由物體或相機的運動引起的圖像對象在兩個連續幀之間的視在運動模式。它是2D矢量場,其中每個矢量是一個位移矢量,顯示點從第一幀到第二幀的移動。
光流實際上是一種特徵點跟蹤方法,其計算的為向量,基於三點假設:
1、場景中目標的像素在幀間運動時亮度(像素值或其衍生值)不發生變化;2、幀間位移不能太大;3、同一表面上的鄰近點都在做相同的運動;
光流跟蹤過程:1)對一個連續視頻幀序列進行處理;2)對每一幀進行前景目標檢測;3)對某一幀出現的前景目標,找出具有代表性的特徵點(Harris角點);4)對於前後幀做像素值比較,尋找上一幀在當前幀中的最佳位置,從而得到前景目標在當前幀中的位置信息;5)重復上述步驟,即可實現目標跟蹤
2、運動場(分為相機固定,但是視角變化和相機是運動的)
1)運動建模(如視覺里程計運動模型、速度運動模型等)
運動學是對進行剛性位移的相機進行構型,一般通過6個變數來描述,3個直角坐標,3個歐拉角(橫滾、俯仰、偏航)。
Ⅰ、對相機的運動建模
由於這個不是我們本次所要討論的重點,但是在《概率機器人》一書中提出了很多很好的方法,相機的運動需要對圖像內的像素做位移矩陣和旋轉矩陣的坐標換算。除了對相機建立傳統的速度運動模型外,也可以用視覺里程計等通關過置信度的更新來得到概率最大位置。
Ⅱ、對於跟蹤目標的運動建模
該方法需要提前通過先驗知識知道所跟蹤的目標對象是什麼,比如車輛、行人、人臉等。通過對要跟蹤的目標進行建模,然後再利用該模型來進行實際的跟蹤。該方法必須提前知道要跟蹤的目標對象是什麼,然後再去跟蹤指定的目標,這是它的局限性,因而其推廣性相對比較差。(比如已知跟蹤的物體是羽毛球,那很容易通過前幾幀的取點,來建立整個羽毛球運動的拋物線模型)
2)核心搜索演算法(常見的預測演算法有Kalman(卡爾曼)濾波、擴展卡爾曼濾波、粒子濾波)
Ⅰ、Kalman 濾波
Kalman濾波器是通過前一狀態預測當前狀態,並使用當前觀測狀態進行校正,從而保證輸出狀態平穩變化,可有效抵抗觀測誤差。因此在運動目標跟蹤中也被廣泛使用。
在視頻處理的運動目標跟蹤里,每個目標的狀態可表示為(x,y,w,h),x和y表示目標位置,w和h表示目標寬高。一般地認為目標的寬高是不變的,而其運動速度是勻速,那麼目標的狀態向量就應該擴展為(x,y,w,h,dx,dy),其中dx和dy是目標當前時刻的速度。通過kalman濾波器來估計每個時刻目標狀態的大致過程為:
對視頻進行運動目標檢測,通過簡單匹配方法來給出目標的第一個和第二個狀態,從第三個狀態開始,就先使用kalman濾波器預測出當前狀態,再用當前幀圖像的檢測結果作為觀測值輸入給kalman濾波器,得到的校正結果就被認為是目標在當前幀的真實狀態。(其中,Zt為測量值,為預測值,ut為控制量,Kt為增益。)
Ⅱ、擴展卡爾曼濾波(EKF)和無跡卡爾曼濾波(UKF)
由於卡爾曼濾波的假設為線性問題,無法直接用在非線性問題上,EKF和UKF解決了這個問題(這個線性問題體現在用測量量來計算預測量的過程中)。EKF是通過構建線性函數g(x),與非線性函數相切,並對每一時刻所求得的g(x)做KF,如下圖所示。
UKF與EKF去求解雅可比矩陣擬合線性方程的方法不同,通過對那個先驗分布中的採集點,來線性化隨機變數的非線性函數。與EKF所用的方法不同,UKF產生的高斯分布和實際高斯分布更加接近,其引起的近似誤差也更小。
Ⅲ、粒子濾波
1、初始狀態:基於粒子濾波的目標追蹤方法是一種生成式跟蹤方法,所以要有一個初始化的階段。對於第一幀圖像,人工標定出待檢測的目標,對該目標區域提出特徵;
2、搜索階段:現在已經知道了目標的特徵,然後就在目標的周圍撒點(particle), 如:a)均勻的撒點;b)按高斯分布撒點,就是近的地方撒得多,遠的地方撒的少。論文里使用的是後一種方法。每一個粒子都計算所在區域內的顏色直方圖,如初始化提取特徵一樣,然後對所有的相似度進行歸一化。文中相似性使用的是巴氏距離;
3、重采樣:根據粒子權重對粒子進行篩選,篩選過程中,既要大量保留權重大的粒子,又要有一小部分權重小的粒子;
4、狀態轉移:將重采樣後的粒子帶入狀態轉移方程得到新的預測粒子;
5、測量及更新:對目標點特徵化,並計算各個粒子和目標間的巴氏距離,更新粒子的權重;
6、決策階段:每個粒子都獲得一個和目標的相似度,相似度越高,目標在該范圍出現的可能性越高,將保留的所有粒子通過相似度加權後的結果作為目標可能的位置。
3)Meanshift演算法
MeanShift演算法屬於核密度估計法,它不需要任何先驗知識而完全依靠特徵空間中樣本點的計算其密度函數值。對於一組采樣數據,直方圖法通常把數據的值域分成若干相等的區間,數據按區間分成若干組,每組數據的個數與總參數個數的比率就是每個單元的概率值;核密度估計法的原理相似於直方圖法,只是多了一個用於平滑數據的核函數。採用核函數估計法,在采樣充分的情況下,能夠漸進地收斂於任意的密度函數,即可以對服從任何分布的數據進行密度估計。
Meanshift演算法步驟
1、通過對初始點(或者上一幀的目標點)為圓心,繪制一個半徑為R的圓心,尋找特徵和該點相似的點所構成的向量;
2、所有向量相加,可以獲得一個向量疊加,這個向量指向特徵點多的方向;
3、取步驟二的向量終點為初始點重復步驟一、二,直到得到的向量小於一定的閾值,也就是說明當前位置是特徵點密度最密集的地方,停止迭代,認為該點為當前幀的目標點;
4)Camshift演算法
Camshift演算法是MeanShift演算法的改進,稱為連續自適應的MeanShift演算法。Camshift 是由Meanshift 推導而來 Meanshift主要是用在單張影像上,但是獨立一張影像分析對追蹤而言並無意義,Camshift 就是利用MeanShift的方法,對影像串列進行分析。
1、首先在影像串列中選擇目標區域。
2、計算此區域的顏色直方圖(特徵提取)。
3、用MeanShift演演算法來收斂欲追蹤的區域。
4、通過目標點的位置和向量信息計算新的窗口大小,並標示之。
5、以此為參數重復步驟三、四。
Camshift 關鍵就在於當目標的大小發生改變的時候,此演算法可以自適應調整目標區域繼續跟蹤。
3、小結
第一階段的單目標追蹤演算法基本上都是傳統方法,計算量小,在嵌入式等設備中落地較多,opencv中也預留了大量的介面。通過上面的兩節的介紹,我們不難發現,目標檢測演算法的步驟分為兩部分,一部分是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一部分是對目標特徵進行跟蹤,如上文所提及的方法。所以目標檢測方法的發展,也可總結為兩個方面,一個是如何去獲得更加具有區分性的可跟蹤的穩定特徵,另一個是如何建立幀與幀之間的數據關聯,保證跟蹤目標是正確的。
隨著以概率為基礎的卡爾曼濾波、粒子濾波或是以Meanshift為代表向量疊加方法在目標檢測的運用,使得目標檢測不再需要假設自身的一個狀態為靜止的,而是可以是運動的,更加符合復雜場景中的目標跟蹤。
7. 目標檢測演算法是什麼
目標檢測演算法是先通過訓練集學習一個分類器,然後在測試圖像中以不同scale的窗口滑動掃描整個圖像;每次掃描做一下分類,判斷一下當前的這個窗口是否為要檢測的目標。檢測演算法的核心是分類,分類的核心一個是用什麼特徵,一個是用哪種分類器。
(7)目標檢測器的使用方法擴展閱讀:
目標檢測演算法可以分為:
1、背景建模法,包含時間平均模型、混合高斯模型、動態紋理背景、PCA模型、時一空聯合分布背景模型
2、點檢測法,包含Moravec檢測器、Harris檢測器 、仿射不變點檢測、S IFT
3、圖像分割法,包含Mean Shift方法 、Graph-cut方法、Active Contours方法
4、聚類分析法,包含支持向量機、神經網路、Adaptive Boosting
5、運動矢量場法,包含基於運動矢量場的方法
8. 目標檢測中的樣本不平衡處理方法——OHEM, Focal Loss, GHM, PISA
GitHub
CSDN
目前。計算機視覺中的性能最好的目標檢測方法主要分為兩種: one-stage 和two-stage 方法。two-stage方法分為兩步,第一步為候選區域生成階段(Proposal stage),通過如Selective Search、EdgeBoxes等方法可以生成數量相對較小候選目標檢測框;第二步為分類與回歸階段,對第一階段生成的 Candiate Proposal 進行分類和位置回歸。one-stage 代表性的方法是R-CNN系列,如 R-CNN, Fast R-CNN, Faster R-CNN。 而one-stage 方法直接對圖像的大量 Candiate Proposals 進行分類與回歸。
這兩類方法中均存在類別不平衡問題,two-stage 方法通過第一步已經將當量的候選區域降低到一個數量較小的范圍,同時又在第二步通過一些啟發式原則,將正負樣本的比例降低到一定程度。而 one-stage 優於沒有這降低候選框的步驟,因此,候選區域的數量大大超過 two-stage 方法,因此,在精度上,two-stage 仍然優於 one-stage 方法,但是在速度和模型復雜度上, one-stage 占優勢。
類別不平衡會使檢測器評估 的候選位置,但是通常只有少量的位置存在目標,這回導致兩個問題:
因此,解決樣本不平衡問題是提高目標檢測精度的一個關鍵技術之一。
論文題目: Training Region-based Object Detectors with Online Hard Example Mining
OHEM 是通過改進 Hard Example Mining 方法,使其適應online learning演算法特別是基於SGD的神經網路方法。Hard Example Mining 通過交替地用當前樣本集訓練模型,然後將模型固定,選擇 False Positive 樣本來重新組建用於下一次模型訓練的樣本集。但是因為訓練神經網路本事就是一個耗時的操作,這樣在訓練中固定模型,這樣會急劇降低模型的訓練進程。
Hard Examples Mining通常有兩種方法:
OHEM演算法的大致流程是: 首先計算出每個ROI的loss, 然後按loss從高到低來排列每個 ROI, 然後為每張圖片選擇 個損失最高的 ROI 作為Hard Examples,其中 B 表示總的 ROI 數量, 表示batch-size 的大小,在 Fast R-CNN 中, N=2, B=128時,效果很好。
但是如果直接按照 loss 對所有的 ROI 進行選擇,會有一個缺點,由於 ROI 很多,這樣 很多 ROI 的位置就會相關並重疊,如果和某個高 Loss 的 ROI 重合度很高的其它 ROI很多, 這樣, 這些 ROI 的 Loss 通常也會很多,這樣這些樣本都會被選擇,但是它們可以近似認為時同一個,這樣就會給其它較低 Loss 的 ROI 更少的選擇餘地,這樣就會存在冗餘。為了消除這種冗餘,作者提出先使用 NMS (non-maximum suppression) 刪除部分重合度很高的 ROI, 在使用上述方法進行 選擇 Hard Example。
實現技巧:
論文,作者將該方法是現在 Fsat R-CNN 目標檢測方法中。最簡單做法是更改損失函數層,損失函數層首先計算所有 ROI 的 loss, 然後根據 loss 對 ROI 進行排序,並選擇 hard RoIs, 讓 那些 non-RoIs的損失變為0. 這種方法雖然很簡單,但是非常不高效,因為還需要為所有的 RoIs 分配進行反向傳播時需要的內存空間。
為了克服這個缺點,作者對下面的 Figure 1 進行改進, 如下面的 Figure 2.該改進時使用兩份同樣的 RoI network。 其中一個是只讀的(readonly), 即只進行前向計算,不進行反向傳播優化,所以只需要為前向傳播分配內存,它的參數實時保持和另一個 RoI network(regular RoI network)保持一樣。在每次迭代時,首先使用 readonly RoI network 對每個 ROI 計算起 loss,然後用上面描述的選擇 hard RoIs 的方法選擇 hard RoIs. 然後利用 regular RoI network來對選擇的 hard RoIs 進行前向和後向計算來優化網路。
論文題目 Focal Loss for Dense Object Detection
在改論文中,作者認為樣本類別的不平衡可以歸結為難易樣本的不平衡,從而更改交叉熵損失函數,重新對樣本賦予不同的權值,之前的模型這些樣本都是同等重要的,從而使模型訓練更加關注 hard examples。
首先引入交叉熵的公式:
其中, ,表示真實類別, 表示我們預測的概率,為了方便,我們定義:
因此, ,該方法在 較大時,該loss是一個較小的量級, 如下圖的連線所示所示,因為存在大量的易分類樣本,相加後會淹沒正樣本的loss。
一個常見的解決類別不平衡的方式是引入一個加權因子 來表示正樣本的權重, 表示負樣本的權重。我們按照定義 的方法重新定義 為 , 定義如下:
雖然可以平衡 positive和negative的重要性,但是對 easy/hard 樣本還是無法區分, Focal loss 通過更 Cross loss來達到區分easy/hard的目的:
上圖展示了不同 取值對應的 loss,通過分析上述公式,我們發現,當 非常小時,即樣本被分類錯誤,此時 接近1, loss幾乎不受影響,當 接近於1時,即樣本被分類正確,此時 接近0,此時降低了該樣本的權重,比如,取 , 當時 時,該樣本的 loss 會降低100倍,
在實際應用中,作者使用了該 Focal loss的變體,即加入了 平衡因子:
作者提出,對於二分類,一般模型的模型初始化會同概率的對待正負樣本,由於類別不平衡,負樣本的 loss 會佔主導,作者提出在訓練初始階段對正樣本的概率估計「prior」的概念,用 表示, 通過設置它來達到正樣本的輸出概率低的效果,比如為0.01,從而使模型更加關注正樣本。實際操作中,出了最後一個用於分類的卷積層,其餘卷積層的參數初始化為bias ,而最後一層 , 實驗中設置為 0.01.
兩個實現細節
論文題目: Gradient Harmonized Single-stage Detector
改論文提出 Focal Loss 存在兩個缺點:
該論文有一句概括該篇論文的核心思想的一句話: 類別的不平衡可以歸結為難易樣本的不平衡,難易樣本的不平衡可以歸結為梯度的不平衡原話如下:
如下圖所示:
左邊是樣本數量關於梯度的分布,中間表示各個修正後的函數的梯度(使用了log scale)對原始梯度的,右邊表示所有樣本集的梯度貢獻的分布。
定義 是模型未經過 sigmoid 之前的輸出, 則 ,得出該損失函數對 的梯度為:
定義梯度的模長(norm) 為:
訓練樣本的梯度密度(Gradient Density)定義如下:
其中, 是第 k 個樣本的gradient norm,
這個公式可以理解為,以梯度 為中心,寬度為 的區域內的樣本密度。
梯度密度協調參數:
分母是對梯度位於 范圍的部分樣本進行歸一化,如果所有樣本的梯度時均分分布,那麼對於任意 都有 .(這里不是很理解為什麼N,可以理解它們相等)
通過將梯度密度協調參數將 GHM 嵌入到損失函數中,則 GHM-C Loss 為:
計算公式11時,求和有一個N,再求 時會遍歷所有的樣本,因此該公式的時間復雜度為 .如果並行的化,每個計算單元也有N的計算量。對gradient norm進行排序的最好的演算法復雜度為 ,然後用一個隊列去掃描樣本得到梯度密度的時間復雜度為 n 。基於排序的方法即使並行也不能較快的計算,因為N往往是 甚至 ,仍然是非常耗時的.
作者提出的近似求解的方法如下:
根據上述定義,得出近似梯度密度函數為:
利用上面的公式,由於我們可以事先求好 , 在求和時只需查找 即可,因此時間復雜度為 .
因為loss的計算是基於梯度密度函數,而梯度密度函數根據一個batch中的數據得到,一個batch的統計結果是有雜訊的。與batch normalization相同,作者用Exponential moving average來解決這個問題,也就是
將模型魚的的偏移量定義為 , 將真實的偏移量定義為 ,回歸loss採用 Smooth L1 loss:
其中
則 關於 的梯度為:
從公式可以看出,當樣本操作 時, 所有樣本都有相同的梯度 1, 這就使依賴梯度范數來區分不同樣本是不可能的, 一種簡單的替代方法時直接使用 作為衡量標准,但是該值理論上無限大,導致 無法實現,
為了將 GHM 應用到回歸損失上,作者修改了原始的 損失函數:
該函數和 具有類似的屬性,當d的絕對值很小時,近似 L2 loss, 當d的絕對值比較大時, 近似 L1 loss, 關於d的梯度為:
這樣就將梯度值限制在
定義 , 則 GHM-R Loss 為:
論文題目: Prime Sample Attention in Object Detection
PISA 方法和 Focal loss 和 GHM 有著不同, Focal loss 和 GHM 是利用 loss 來度量樣本的難以程度,而本篇論文作者從 mAP 出法來度量樣本的難易程度。
作者提出提出改論文的方法考慮了兩個方面:
Prime Samples 是指那些對檢測性能有著巨大影響的樣本。作者研究表明樣本的重要程度依賴於它和ground truth 的 IoU值,因此作者提出了一種 IOU-HLR 排序。
在目標檢測中時如何定義正樣本(True Positive)的呢?
剩餘的標注為負樣本。
mAP 的原理揭露了對目標檢測器更重要的 兩個准則 :
基於上述分析,作者提出了一種稱為 IoU-HLR 的排序方法,它既反映了局部的IoU關系(每個ground truth目標周圍),也反映了全局的IoU關系(覆蓋整個圖像或小批圖像)。值得注意的是,不同於回歸前的邊界框坐標,IoU-HLR是根據樣本的最終定位位置來計算的,因為mAP是根據回歸後的樣本位置來計算的。
該排序方法的大致流程如下圖所示,其原理如下:
IoU-HLR遵循上述兩個准則。首先,它通過局部排序(即上面的步驟2)將每個單獨的 GT 的 對應的樣本中 IoU 較高的樣本放在前面,其次通過重采樣和排序(步驟3, 4)將不同 GT 的 對應的樣本中, 將 IoU 較高的放在了前面。
作者提出Prime Sample Attention,一種簡單且有效的采樣策略,該采樣策略將更多的注意力集中到 Prime examples 上, PISA 由兩部分組成: Importance- based Sample Reweighting(ISR)和Classification Aware Regression Loss(為CARL).
PISA 的訓練過程是基於 prime samples 而不是同等對待所有樣本。
作者提出一種基於 soft sampling 的方法: Importance-based Sample Reweighting (ISR), 他給不同樣本根據重要性賦予不同的權重。首先它將Iou-HLR排序轉化為線性映射的真實值。 IoU-HLR在每個類中分別進行計算。對於類 , 假設總共有 個樣本, 通過 IoU-HLR 表示為 . 其中 ,使用一個線性轉換函數將 轉換為 , 表示第 類中的第 個樣本的重要程度:
採用指數函數的形式來京一部將樣本重要性 轉換為 loss 的權值 , 表示對重要樣本給予多大的優先權的程度因子, 決定最小樣本權值的偏差(感覺就是一個決定最小的權值大小的一個變數)。
根據上面得到的權重值,重寫交叉熵:
其中 n 和 m 分別表示真樣本和負樣本的數量, 和 分別表示預測分數和分類目標,需要注意的是,如果只是簡單的添加 loss 權值將會改變 loss 的值,並改變正負樣本的比例,因此為了保持正樣本的總的 loss 值不變, 作者將 歸一化為
(這里不是很理解,歡迎大家解惑)
5.3.1 已經介紹如何染個分類器知道 prime samples, 那麼如何讓回歸其也知道 prime sample,作者提出了 Classification-Aware Regression Loss(CARL) 來聯合優化分類器和回歸其兩個分支。CARL可以提升主要樣本的分數,同時抑制其他樣本的分數。回歸質量決定了樣本的重要性,我們期望分類器對重要樣本輸出更高的分數。兩個分支的優化應該是相互關聯的,而不是相互獨立的。
作者的方法是讓回歸器知道分類器的分數,這樣梯度就可以從回歸器傳播到分期其分支。公式如下:
表示相應類別的預測分數, 表示輸出的回歸偏移量。利用一個指數函數將 轉化為 ,隨後根據所有樣本的平均值對它進行縮放。為了保持損失規模不變,對具有分類感知的 進行歸一化。 是常用的smooth L1 loss。
關於 的梯度與原回歸損失 成正比。 p_i mathcal{L}(d_i, hat d_i) mathcal{L}(d_i, hat d_i)$ 反映了樣本i的定位質量,因此可以認為是一個IoU的估計,進一步可以看作是一個IoU-HLR的估計。可以近似認為,排序靠前的樣本有較低的回歸損失,於是分類得分的梯度較小。對於CARL來說,分類分支受到回歸損失的監督。 不重要樣本的得分被極大的抑制掉,而對重要樣本的關注得到加強。
待續。。。
上面的方法大致可以分為兩種:
Focal Loss認為正負樣本的不平衡,本質上是因為難易樣本的不平衡,於是通過修改交叉熵,使得訓練過程更加關注那些困難樣本,而GHM在Focal Loss的基礎上繼續研究,發現難易樣本的不平衡本質上是因為梯度范數分布的不平衡,和Focal Loss的最大區別是GHM認為最困難的那些樣本應當認為是異常樣本,讓檢測器強行去擬合異常樣本對訓練過程是沒有幫助的。PISA則是跳出了Focal Loss的思路,認為采樣策略應當從mAP這個指標出發,通過IoU Hierarchical Local Rank (IoU-HLR),對樣本進行排序並權值重標定,從而使得recall和precision都能夠提升。
9. 目標檢測系列(一):R-CNN
目標檢測(object detection)是計算機視覺中非常重要的一個領域。在卷積神經網路出現之前,都利用一些傳統方法手動提取圖像特徵進行目標檢測及定位,這些方法不僅耗時而且性能較低。而在卷積神經網路出現之後,目標檢測伍宏神領域發生了翻天覆地的變化。最著名的目標檢測系統有RCNN系列、YOLO和SSD,本文將介紹RCNN系列的開篇作RCNN。
RCNN系列的技術演進過程可參見 基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN 。
目標檢測分為兩步:第一步是對圖像進行分類,即圖像中的內容是什麼;第二步則是對圖像進行定位,找出圖像中物體的具體位置。簡單來說就是圖像裡面有什麼,位置在哪。
然而,由於不同圖片中物體出現的大小可能不同(多尺度),位置也可能不同,而且擺放角度,姿態等都可以不同,同時一張圖片中還可以出現多個類別。這使得目標檢測任務異常艱難。
上面任務用專業的說法就是:圖像識別+定位
兩個不同的分支分別完成不同的功能,分類和定位。回歸(regression)分支與分類分支(classification)共享網路卷積部分的參數值。
還是剛才的分類識別+回歸定位思路。只是現在我們提前先取好不同位置的框,然後將這個框輸入到網路中而不是像思路一將原始圖像直接輸入到網路中。然後計算出這個框的得分,取得分最高的框。
如上,對於同一個圖像中貓的識別定位。分別取了四個角四個框進行分類和回歸。其得分分別為0.5,0.75,0.6,0.8,因此右下角得分最高,選擇右下角的黑框作為目標位置的預測(這里即完成了絕告定位任務)。
這里還有一個問題——檢測位置時的框要怎麼取,取多大?在上面我們是在257x257的圖像中取了221x221的4個角。以不同大小的窗口從左上角到右下角依次掃描的話,數據量會非常大。而且,如果考慮多尺度問題的話,還需要在將圖像放縮到不同水腔虧平的大小來進行計算,這樣又大大增加了計算量。如何取框這個問題可以說是目標檢測的核心問題之一了,RCNN,fast RCNN以及faster RCNN對於這個問題的解決辦法不斷地進行優化,這個到了後面再講。
總結一下思路:
對於一張圖片,用各種大小的框將圖片截取出來,輸入到CNN,然後CNN會輸出這個框的類別以及其位置得分。
對於檢測框的選取,一般是採用某種方法先找出可能含有物體的框(也就是候選框,比如1000個候選框),這些框是可以互相重疊互相包含的,這樣我們就可以避免暴力枚舉所有框了。
講完了思路,我們下面具體仔細來看看RCNN系列的實現,本篇先介紹RCNN的方法。
R-CNN相比於之前的各種目標檢測演算法,不僅在准確率上有了很大的提升,在運行效率上同樣提升很大。R-CNN的過程分為4個階段:
在前面我們已經簡單介紹了selective search方法,通過這個方法我們篩選出了2k左右的候選框。然而搜索出的矩形框大小是不同的。而在AlexNet中由於最後全連接層的存在,對於圖像尺寸有固定的要求,因此在將候選框輸入之前,作者對這些候選框的大小進行了統一處理——放縮到了統一大小。文章中作者使用的處理方法有兩種:
(1)各向異性縮放
因為圖片扭曲可能會對後續CNN模型訓練產生影響,於是作者也測試了各向同性縮放的方法。有兩種方法:
此外,作者對於bounding box還嘗試了padding處理,上面的示意圖中第1、3行就是結合了padding=0,第2、4行結果採用padding=16的結果。經過最後的試驗,作者發現採用各向異性縮放、padding=16的精度最高。
卷積神經網路訓練分為兩步:(1)預訓練;(2)fine-tune。
先在一個大的數據集上面訓練模型(R-CNN中的卷機模型使用的是AlexNet),然後利用這個訓練好的模型進行fine-tune(或稱為遷移學習),即使用這個預訓練好的模型參數初始化模型參數,然後在目標數據集上面進行訓練。
此外,在訓練時,作者還嘗試採用不同層數的全連接層,發現一個全連接層比兩個全連接層效果要好,這可能是因為使用兩個全連接層後過擬合導致的。
另一個比較有意思的地方是:對於CNN模型,卷積層學到的特徵其實就是基礎的共享特徵提取層,類似於傳統的圖像特徵提取演算法。而最後的全連接層學到的則是針對特定任務的特徵。譬如對於人臉性別識別來說,一個CNN模型前面的卷積層所學習到的特徵就類似於學習人臉共性特徵,然後全連接層所學習的特徵就是針對性別分類的特徵了。
最後,利用訓練好的模型對候選框提取特徵。
關於正負樣本的問題:由於選取的bounding box不可能與人工label的完全相同,因此在CNN訓練階段需要設置IOU閾值來為bounding box打標簽。在文章中作者將閾值設置為0.5,即如果候選框bounding box與人工label的區域重疊面積大於0.5,則將其標注為物體類別(正樣本),否則我們就把他當做背景類別(負樣本)。
作者針對每一個類別都訓練了一個二分類的SVM。這里定義正負樣本的方法與上面卷積網路訓練的定義方法又不相同。作者在文章中嘗試了多種IoU閾值(0.1~0.5)。最後通過訓練發現,IoU閾值為0.3的時候效果最好(選擇為0精度下降了4個百分點,選擇0.5精度下降了5個百分點)。即當IoU小於0.3的時候我們將其視為負樣本,否則為正樣本。
目標檢測問題的衡量標準是重疊面積:許多看似准確的檢測結果,往往因為候選框不夠准確,重疊面積很小。故需要一個位置精修步驟。
在實現邊界回歸的過程中發現了兩個微妙的問題。第一是正則化是重要的:我們基於驗證集,設置λ=1000。第二個問題是,選擇使用哪些訓練對(P,G)時必須小心。直觀地說,如果P遠離所有的檢測框真值,那麼將P轉換為檢測框真值G的任務就沒有意義。使用像P這樣的例子會導致一個無望的學習問題。因此,只有當提案P至少在一個檢測框真值附近時,我們才執行學習任務。「附近」即,將P分配給具有最大IoU的檢測框真值G(在重疊多於一個的情況下),並且僅當重疊大於閾值(基於驗證集,我們使用的閾值為0.6)。所有未分配的提案都被丟棄。我們為每個目標類別執行一次,以便學習一組特定於類別的檢測框回歸器。
在測試時,我們對每個提案進行評分,並預測其新的檢測框一次。原則上,我們可以迭代這個過程(即重新評估新預測的檢測框,然後從它預測一個新的檢測框,等等)。但是,我們發現迭代不會改進結果。
使用selective search的方法在測試圖片上提取2000個region propasals ,將每個region proposals歸一化到227x227,然後再CNN中正向傳播,將最後一層得到的特徵提取出來。然後對於每一個類別,使用為這一類訓練的SVM分類器對提取的特徵向量進行打分,得到測試圖片中對於所有region proposals的對於這一類的分數,再使用貪心的非極大值抑制(NMS)去除相交的多餘的框。再對這些框進行canny邊緣檢測,就可以得到bounding-box(then B-BoxRegression)。
參考:
Rich feature hierarchies for accurate object detection and semantic segmentation.
RCNN-將CNN引入目標檢測的開山之作-曉雷的文章
基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN
R-CNN 論文翻譯
10. 詳細解讀TPH-YOLOv5 | 讓目標檢測任務中的小目標無處遁形
1 簡介
針對無人機捕獲場景的目標檢測是最近比較流行的一項任務。由於無人機在不同高度飛行,目標尺度變化較大,這樣給模型的優化也帶來了很大的負擔。此外,在無人機進行高速低空飛行時,也會帶來密集目標的運動模糊問題。
圖1 小目標與密集問題
為了解決上述2個問題,本文提出了 TPH-YOLOv5 。 TPH-YOLOv5 在YOLOv5的基礎上增加了一個prediction heads 來檢測不同尺度的目標。然後通過探索Self-Attention的預測潛力使用了Transformer Prediction Heads(TPH)代侍戚野替原來的prediction heads。同時作者還集成了卷積塊Attention模型(CBAM)來尋找密集場景下的注意力區域。
為了進一步改進 TPH-YOLOv5 ,作者還提供了大量有用的策略,如數據增強、多尺度測試、多模型集成和使用額外的分類器。
在VisDrone2021數據集上的大量實驗表明,TPH-YOLOv5在無人機捕獲場景上具有良好的性能和可解釋性。在DET-test-challenge數據集上,TPH-YOLOv5的AP結果為39.18%,比之前的SOTA方法(DPNetV3)提高了1.81%。在VisDrone Challenge 2021中,TPH-YOLOv5與YOLOv5相比提高了約7%。
本文的貢獻如下:
2 前人工作總結 2.1 Data Augmentation
數據增強的意義主要是擴展數據集,使模型對不同環境下獲得的圖像具有較高的魯棒性。
Photometric和geometric被研究人員廣泛使用。對於Photometric主要是對圖像的色相、飽和度和值進行了調整。在處理geometric時主要是添加隨機縮放、裁剪、平移、剪切和旋轉。
除了上述的全局像素增強方法外,還有一些比較獨特的數據增強方法。一些研究者提出了將多幅圖像結合在一起進行數據增強的方法,如MixUp、CutMix和Mosaic。
MixUp從訓練圖像中隨機選取2個樣本進行隨機加權求和,樣本的標簽也對應於加權求和。不同於通常使用零像素mask遮擋圖像的遮擋工作,CutMix使用另一個圖像的區域覆蓋被遮擋的區域。Mosaic是CutMix的改進版。拼接4幅圖像,極大地豐富了被檢仔型測物體的背景。此外,batch normalization計算每層上4張不同圖像的激活統計量。
在TPH-YOLOv5的工作中主要是結合了MixUp、Mosaic以及傳統方法進行的數據增強。
2.2 Multi-Model Ensemble Method
我們都知道深度學習模型是一種非線性方法。它們提供了更大的靈活性,並可以根據訓練數據量的比例進行擴展。這種靈活性的一個缺點是,它們通過隨機訓練演算法進行學習,這意味著它們對訓練數據的細節非常敏感,每次訓練時可能會得到一組不同的權重,從而導致不同的預測。 這給模型帶來了一個高方差 。
減少模型方差的一個成功方法是訓練多個模型而不是單一模型,並結合這些模老喊型的預測。
針對不同的目標檢測模型,有3種不同的ensemble boxes方法:非最大抑制(NMS)、Soft-NMS、Weighted Boxes Fusion(WBF)。
在NMS方法中,如果boxes的overlap, Intersection Over Union(IoU)大於某個閾值,則認為它們屬於同一個對象。對於每個目標NMS只留下一個置信度最高的box刪除其他box。因此,box過濾過程依賴於這個單一IoU閾值的選擇,這對模型性能有很大的影響。
Soft-NMS是對NMS進行輕微的修改,使得Soft-NMS在標准基準數據集(如PASCAL VOC和MS COCO)上比傳統NMS有了明顯的改進。它根據IoU值對相鄰邊界box的置信度設置衰減函數,而不是完全將其置信度評分設為0並將其刪除。
WBF的工作原理與NMS不同。NMS和Soft-NMS都排除了一些框,而WBF將所有框合並形成最終結果。因此,它可以解決模型中所有不準確的預測。本文使用WBF對最終模型進行集成,其性能明顯優於NMS。
2.3 Object Detection
基於CNN的物體檢測器可分為多種類型:
一些檢測器是專門為無人機捕獲的圖像設計的,如RRNet、PENet、CenterNet等。但從組件的角度來看,它們通常由2部分組成,一是基於CNN的主幹,用於圖像特徵提取,另一部分是檢測頭,用於預測目標的類和Box。
此外,近年來發展起來的目標檢測器往往在backbone和head之間插入一些層,人們通常稱這部分為檢測器的Neck。接下來分別對這3種結構進行詳細介紹:
Backbone
常用的Backbone包括VGG、ResNet、DenseNet、MobileNet、EfficientNet、CSPDarknet53、Swin-Transformer等,均不是自己設計的網路。因為這些網路已經證明它們在分類和其他問題上有很強的特徵提取能力。但研究人員也將微調Backbone,使其更適合特定的垂直任務。
Neck
Neck的設計是為了更好地利用Backbone提取的特徵。對Backbone提取的特徵圖進行不同階段的再處理和合理使用。通常,一個Neck由幾個自底向上的路徑和幾個自頂向下的路徑組成。Neck是目標檢測框架中的關鍵環節。最早的Neck是使用上下取樣塊。該方法的特點是沒有特徵層聚合操作,如SSD,直接跟隨頭部後的多層次特徵圖。
常用的Neck聚合塊有:FPN、PANet、NAS-FPN、BiFPN、ASFF、SAM。這些方法的共性是反復使用各種上下采樣、拼接、點和或點積來設計聚合策略。Neck也有一些額外的塊,如SPP, ASPP, RFB, CBAM。
Head
作為一個分類網路,Backbone無法完成定位任務,Head負責通過Backbone提取的特徵圖檢測目標的位置和類別。
Head一般分為2種:One-Stage檢測器和Two-Stage檢測器。
兩級檢測器一直是目標檢測領域的主導方法,其中最具代表性的是RCNN系列。與Two-Stage檢測器相比One-Stage檢測器同時預測box和目標的類別。One-Stage檢測器的速度優勢明顯,但精度較低。對於One-Stage檢測器,最具代表性的型號是YOLO系列、SSD和RetaNet。
3TPH-YOLOv53.1 Overview of YOLOv5
YOLOv5有4種不同的配置,包括YOLOv5s,YOLOv5m, YOLOv5l和YOLOv5x。一般情況下,YOLOv5分別使用CSPDarknet53+SPP為Backbone,PANet為Neck, YOLO檢測Head。為了進一步優化整個架構。由於它是最顯著和最方便的One-Stage檢測器,作者選擇它作為Baseline。
圖2 THP-YOLOv5整體架構
當使用VisDrone2021數據集訓練模型時,使用數據增強策略(Mosaic和MixUp)發現YOLOv5x的結果遠遠好於YOLOv5s、YOLOv5m和YOLOv5l, AP值的差距大於1.5%。雖然YOLOv5x模型的訓練計算成本比其他3種模型都要高,但仍然選擇使用YOLOv5x來追求最好的檢測性能。此外,根據無人機捕獲圖像的特點,對常用的photometric和geometric參數進行了調整。
3.2 TPH-YOLOv5
TPH-YOLOv5的框架如圖3所示。修改了原來的YOLOv5,使其專一於VisDrone2021數據集:
圖3 TPH-YOLOv5模型結構 微小物體的預測頭
作者統計了VisDrone2021數據集,發現它包含了很多非常小的目標,所以增加了一個用於微小物體檢測的預測頭。結合其他3個預測頭,4頭結構可以緩解劇烈的目標尺度變化帶來的負面影響。如圖3所示,添加的預測頭(Head 1)是由low-level、高解析度的feature map生成的,對微小物體更加敏感。增加檢測頭後,雖然增加了計算和存儲成本,但對微小物體的檢測性能得到了很大的提高。
Transformer encoder block
圖4 Transformer Block
用Transformer encoder塊替換了YOLOv5原版中的一些卷積塊和CSP bottleneck blocks。其結構如圖4所示。與CSPDarknet53中原有的bottleneck blocks相比,作者認為Transformer encoder block可以捕獲全局信息和豐富的上下文信息。
每個Transformer encoder block包含2個子層。第1子層為multi-head attention layer,第2子層(MLP)為全連接層。每個子層之間使用殘差連接。Transformer encoder block增加了捕獲不同局部信息的能力。它還可以利用自注意力機制來挖掘特徵表徵潛能。在VisDrone2021數據集中,Transformer encoder block在高密度閉塞對象上有更好的性能。
基於YOLOv5,作者只在頭部部分應用Transformer encoder block形成transformer Prediction head(TPH)和backbone端。因為網路末端的特徵圖解析度較低。將TPH應用於低解析度特徵圖可以降低計算和存儲成本。此外,當放大輸入圖像的解析度時可選擇去除早期層的一些TPH塊,以使訓練過程可用。
Convolutional block attention mole (CBAM)
CBAM是一個簡單但有效的注意力模塊。它是一個輕量級模塊,可以即插即用到CNN架構中,並且可以以端到端方式進行訓練。給定一個特徵映射,CBAM將沿著通道和空間兩個獨立維度依次推斷出注意力映射,然後將注意力映射與輸入特徵映射相乘,以執行自適應特徵細化。
圖5 CBAM注意力機制
CBAM模塊的結構如圖5所示。通過本文的實驗,在不同的分類和檢測數據集上將CBAM集成到不同的模型中,模型的性能得到了很大的提高,證明了該模塊的有效性。
在無人機捕獲的圖像中,大覆蓋區域總是包含令人困惑的地理元素。使用CBAM可以提取注意區域,以幫助TPH-YOLOv5抵制令人困惑的信息,並關注有用的目標對象。
Self-trained classifier
用TPH-YOLOv5對VisDrone2021數據集進行訓練後,對test-dev數據集進行測試,然後通過可視化失敗案例分析結果,得出TPH-YOLOv5定位能力較好,分類能力較差的結論。作者進一步探索如圖6所示的混淆矩陣,觀察到一些硬類別,如三輪車和遮陽三輪車的精度非常低。
圖6 檢測混淆矩陣
因此,作者提出了一個Self-trained classifier。首先,通過裁剪ground-truth邊界框並將每個圖像patch的大小調整為64 64來構建訓練集。然後選擇ResNet18作為分類器網路。實驗結果表明,在這個Self-trained classifier的幫助下,所提方法對AP值提高了約0.8%~1.0%。
4實驗與結論
最終在test-set-challenge上取得了39.18的好成績,遠遠高於VisDrone2020的最高成績37.37。
圖9 檢測結果圖