1 目標檢測任務
目標檢測 = 目標識別+定位
目標識別(classification):
輸入:圖片
輸出:物體的類別
評估方法:準確率
定位(localization):
輸入:圖片
輸出:方框在圖片中的位置(x,y,w,h)
評估方法:檢測評價函數 intersection-over-union ( IOU )
IoU
bounding box的定位精度。因爲我們算法不可能百分百跟人工標註的數據完全匹配,因此就存在一個定位精度評價公式:IOU。 它定義了兩個bounding box的重疊度,如下圖所示:
就是矩形框A、B的重疊面積佔A、B並集的面積比例。
1.1 傳統目標檢測方法
傳統目標檢測流程:
- 區域選擇(窮舉策略:採用滑動窗口,且設置不同的大小,不同的長寬比對圖像進行遍歷,時間複雜度高)
- 特徵提取(SIFT、HOG等;形態多樣性、光照變化多樣性、背景多樣性使得特徵魯棒性差)
- 分類器(主要有SVM、Adaboost等)
傳統目標檢測的主要問題:
- 基於滑動窗口的區域選擇策略沒有針對性,時間複雜度高,窗口冗餘
- 手工設計的特徵對於多樣性的變化沒有很好的魯棒性
1.2 R-CNN系列方法
1.2.1 R-CNN
1) R——Region Proposal
候選區域建議:利用圖像中的紋理、邊緣、顏色等信息,預先找出圖中目標可能出現的位置。
Selective Search
對於目標識別任務,比如判斷一張圖片中有沒有車、是什麼車,一般需要解決兩個問題:目標檢測、目標識別。而目標檢測任務中通常需要先通過某種方法做圖像分割,事先得到候選框;直觀的做法是:給定窗口,對整張圖片滑動掃描,結束後改變窗口大小重複上面步驟,缺點很明顯:重複勞動耗費資源、精度和質量不高等等。
針對上面的問題,一種解決方案是借鑑啓發式搜索的方法,充分利用人類的先驗知識。J.R.R. Uijlings在《Selective Search for Object Recoginition》提出一種方法:基於數據驅動,與具體類別無關的多種策略融合的啓發式生成方法。圖片包含各種豐富信息,例如:大小、形狀、顏色、紋理、物體重疊關係等,如果只使用一種信息往往不能解決大部分問題,例如:
左邊的兩隻貓可以通過顏色區別而不是通過紋理,右面的變色龍卻只能通過紋理區別而不是顏色。
基於以上準則設計Selective Search算法:
採用層次分組算法解決尺度問題。
引入圖像分割中的自下而上分組思想,由於整個過程是層次的,在將整個圖合併成一個大的區域的過程中會輸出不同尺度的多個子區域。整個過程如下:利用《Efficient Graph-Based Image Segmentation》(基本思想:將圖像中每個像素表示爲圖上的一個節點,用於連接不同節點的無向邊都有一個權重,這個權重表示兩個節點之間的不相似度,通過貪心算法利用最小生成樹做圖像分割)生成初始候選區域;
採用貪心算法合併區域,計算任意兩個領域的相似度,把達到閾值的合併,再計算新區域和其所有領域的相似度,循環迭代,直到整個圖變成了一個區域,算法如下:
多樣化策略
三個方面:使用多種顏色空間、使用多種相似度計算方法、搜索起始區域不固定。
- 顏色空間有很多種:RGB、HSV、Lab等等,不是論文重點;
- 相似度衡量算法,結合了4重策略:
◆ 顏色相似度
以RGB爲例,使用L1-norm歸一化每個圖像通道的色彩直方圖(bins=25),每個區域被表示爲25×3維向量: ;
顏色相似度定義爲:
區域合併後對新的區域計算其色彩直方圖:
新區域的大小爲:◆ 紋理相似度
使用快速生成的類SIFT特徵,對每個顏色通道在8個方向上應用方差爲1的高斯濾波器,對每個顏色通道的每個方向提取 的直方圖,所以整個紋理向量維度爲: ,表示爲: ;
紋理相似度定義爲:
◆ 大小相似度該策略希望小的區域能儘早合併,讓合併操作比較平滑,防止出現某個大區域逐步吞併其他小區域的情況。相似度定義爲:
其中 爲圖像包含像素點數目。◆ 區域規則度相似度
能夠框住合併後的兩個區域的矩形大小越小說明兩個區域的合併越規則,如:
區域規則度相似度定義爲:
最終相似度爲所有策略加權和,文中採用等權方式:
使用Selective Search做目標識別
訓練過程包含:提取候選框、提取特徵、生成正負樣本、訓練模型,圖示如下:
早期圖像特徵提取往往是各種HOG特徵或BoW特徵,現在CNN特徵幾乎一統天下。
檢測定位效果評價採用Average Best Overlap(ABO)和Mean Average Best Overlap(MABO):
其中: 爲類別標註、 爲類別 下的ground truth, 爲通過Selective Search生成的候選框。
2)R-CNN
R-CNN訓練步驟
pre-train:拿一個在ImageNet上pre-train的CNN模型(如AlexNet/VGG)作爲初始模型(前五個卷積層提取特徵的能力已較成熟)
fine-tune:由於物體標籤訓練數據少,如果要直接採用隨機初始化CNN參數的方法,那麼目前的訓練數據量是遠遠不夠的。這種情況下,最好的方法是,利用pre-train的CNN的參數進行參數初始化後,再在該CNN上用 selective search 搜索出來的候選框 (自己的數據集) 對CNN的所有層(卷積層+FC層)進行再訓練,使得CNN能適應待檢測的新數據集。
- fine-tune的Loss仍採用AlexNet網絡的softmax的loss
- 將最後一個全連接層的輸出(分類數)從1000改爲N+1(你自己的數據集的類別總數N+1個背景類),然後這一層直接採用參數隨機初始化的方法,其它網絡層的參數不變(SGD,學習率0.001)
- 正負樣本的定義:
- 正樣本(N個類別):區域建議的框和標籤標的真正的矩形框(Ground-truth)重合IoU≥0.5
- 負樣本(背景類):IoU<0.5
**用FC7的特徵訓練線性SVM分類器:**fine-tune之後,這個模型就適應了這套檢測的數據集,之後把SS的正負樣本再經過fine-tune好的CNN,取FC7的特徵(4096)分類,一共N個SVM,每個SVM都會輸出概率值,概率值最高的對應的標籤是貓,則該SS對應的class=cat
- Loss採用的是SVM的Hinge loss,不再是softmax的loss
- 每個類別對應一個SVM分類器,屬於該類別就1,否則0(共需訓練N個SVM)
- 正負樣本定義:
- 正樣本:所有Ground-truth區域對應的FC7層的特徵(注意和fine-tune時不同)
- 負樣本:跟Ground-truth重合IoU<0.3的SS區域的FC7
4. 用Conv5的特徵訓練Bounding box迴歸模型:將SS區域的位置 精度進行提升,映射爲更精確的
- Loss是迴歸模型採用的square loss
1. 一個輸入特徵是:Selective Search輸入到AlexNet前向運算的第五層卷積層Conv5的輸出特徵;
2. 另一個輸入特徵是:Bounding box對 , 是SS提出的候選框的位置信息,只有跟Ground-truth( )重合的 的 才考慮;
是Conv5的特徵, 是要學習的參數一共有4個 , 的 對應 共4個 , 是直角座標系下的比例關係, 是極座標系下的比例關係,因此 最終要算出的是一個offset值,是一個校準量而不是絕對座標值
測試階段
Conv5的特徵和學習好的4個 參數相乘: 得到 各自對應的offset:
之後各自經過座標系變換得到Ground-truth的輸出
R-CNN測試步驟
輸入測試圖像
利用selective search算法在圖像中從下到上提取2000個左右的Region Proposal
先將每個Region Proposal作16個像素的膨脹以保證所有物體的信息都能進來,之後縮放成CNN可接受的尺寸(如AlexNet的輸入尺寸爲224x224)的大小並輸入到CNN(AlexNet/VGG16)
縮放的方式
1) 各向異性縮放
這種方法很簡單,就是不管圖片的長寬比例,管它是否扭曲,進行縮放就是了,全部縮放到CNN輸入的大小224*224,如下圖(D)所示;
2) 各向同性縮放
因爲圖片扭曲後,估計會對後續CNN的訓練精度有影響,於是作者也測試了“各向同性縮放”方案。有兩種辦法:
A. 先擴充後裁剪: 直接在原始圖片中,把bounding box的邊界進行擴展延伸成正方形,然後再進行裁剪;如果已經延伸到了原始圖片的外邊界,那麼就用bounding box中的顏色均值填充;如上圖(B)所示;
B. 先裁剪後擴充:先把bounding box圖片裁剪出來,然後用固定的背景顏色填充成正方形圖片(背景顏色也是採用bounding box的像素顏色均值),如上圖(C)所示;對於上面的異性、同性縮放,文獻還有個padding處理,上面的示意圖中第1、3行就是結合了padding=0,第2、4行結果圖採用padding=16的結果。經過最後的試驗,作者發現採用各向異性縮放、padding=16的精度最高。
使用fine-tune過的AlexNet計算2種特徵
- FC7的特徵送入N個SVM分類器進行分類,每個SS區域都會得到N個類別分值,哪個類別的分值最高就認爲該Bounding box是哪個類別;
- 對每個類別下的所有區域進行非極大值抑制:如SS提出的2k個區域中可能有100個區域在cat這個類別的SVM分類器的輸出值是最大的,那我們需要對這100個cat的候選區域用非極大值抑制進行篩選過濾,把多餘或重合的區域剔除,最終可能剩下3個重合度不高的區域(可能是3只不同的貓)
- 把該類別下所有候選區域(如100個屬於cat的區域)按SVM的輸出的概率分值進行從大到小排序;
- 剔除冗餘區域:第2-100個區域依次和排第1的區域進行IoU比較,如果 ,說明重合度很高,那麼該區域就扔掉;
- 經過一輪剔除後,此時如果還剩下50個區域,第1個區域是上一輪分值最大的那個區域,保存下來不再參與後續剔除,剩下的49個區域作爲新的集合再次回到第1步,排序並比較IoU,一直循環;
- 最後100個區域裏可能剩下3個保存下來的SS區域
- Conv5特徵:取這3個的Conv5的特徵送到迴歸模型獲取Bound box的offset去修正原來的SS算法
R-CNN性能評價
[email protected] (mean Average Precision)
每一類分別計算AP,然後做mean平均
- AP是Precision-Recall Curve下面的面積:準確率(precision)和召回率(recall)不能兼得,所以隨着準確率地提升,召回率不能下降太快,即AP的面積越大越好
準確率(precision):
召回率(recall):
True Positive區域:與Ground truth區域的
- False Positive區域:
- False Negative區域:遺漏的Ground truth區域(一共100只cat,只檢測出90只cat,剩下的10只沒檢測出來的就是FN)
Bounding box迴歸詳解
Source: 邊框迴歸(Bounding Box Regression)詳解
1. 爲什麼要bbox迴歸?
對於上圖,綠色的框表示Ground Truth, 紅色的框爲Selective Search提取的Region Proposal。那麼即便紅色的框被分類器識別爲飛機,但是由於紅色的框定位不準(IoU<0.5), 那麼這張圖相當於沒有正確的檢測出飛機。 如果我們能對紅色的框進行微調, 使得經過微調後的窗口跟Ground Truth 更接近, 這樣豈不是定位會更準確。 確實,Bounding-box regression 就是用來微調這個窗口的。
Bounding box regression流程?
我們的目標是尋找一種關係使得輸入原始的窗口 經過映射得到一個跟真實窗口 更接近的迴歸窗口 。
即給定 ,尋找一種映射 ,使得 並且
那麼經過何種變換才能將窗口 變爲窗口 呢? 比較簡單的思路就是: 平移+尺度放縮:
先做平移 , ,這是R-CNN論文的:
然後再做尺度縮放 , 對應論文中:
觀察(1)-(4)我們發現, 邊框迴歸學習的就是 這四個變換。下一步就是設計算法得到這四個映射。
線性迴歸就是給定輸入的特徵向量 , 學習一組參數 , 使得經過線性迴歸後的值跟真實值 (Ground Truth)非常接近. 即 。
Bounding-box 的輸入以及輸出?
輸入:
,這個是什麼? 輸入就是這四個數值嗎?其實真正的輸入是這個窗口對應的 CNN 特徵,也就是 R-CNN 中的 Pool5 feature(特徵向量)。 (注:訓練階段輸入還包括 Ground Truth, 也就是下邊提到的
輸出:
需要進行的平移變換和尺度縮放 , 或者說是 。 我們的最終輸出不應該是 Ground Truth 嗎? 是的, 但是有了這四個變換我們就可以直接得到 Ground Truth, 這裏還有個問題, 根據(1)~(4)我們可以知道, 經過 得到的並不是真實值 ,而是預測值 。的確, 這四個值應該是經過 Ground Truth 和 Proposal 計算得到的真正需要的平移量 和尺度縮放 。
這也就是 R-CNN 中的 :
那麼目標函數可以表示爲 , 是輸入 Proposal 的特徵向量(conv5之後的pooling層的feature map), 是要學習的參數( 表示 , 也就是每一個變換對應一個目標函數) , 是得到的預測值。 我們要讓預測值跟真實值 差距最小。
即:以proposal爲基準,從proposal到ground truth的平移縮放值爲 ,從proposal到預測框的平移縮放值爲 ,兩者的差距越小,說明預測框和ground truth越接近。
得到損失函數爲:
函數優化目標爲:
利用梯度下降法或者最小二乘法就可以得到 。
爲什麼寬高尺度要採用log形式?
我們想要得到一個放縮的尺度,也就是說這裏限制尺度必須大於0。我們學習的 怎麼保證滿足大於0呢?直觀的想法就是 函數,如公式(3), (4)所示,那麼反過來推導就是 函數的來源了。
當輸入的 Proposal 與 Ground Truth 相差較小時(RCNN 設置的是 IoU>0.6), 可以認爲這種變換是一種線性變換, 那麼我們就可以用線性迴歸來建模對窗口進行微調, 否則會導致訓練的迴歸模型不 work(當 Proposal跟 GT 離得較遠,就是複雜的非線性問題了,此時用線性迴歸建模顯然不合理)。這裏我來解釋:
Log函數明顯不滿足線性函數,但是爲什麼當Proposal 和Ground Truth相差較小的時候,就可以認爲是一種線性變換呢?大家還記得這個公式不?參看高數1:
現在回過來看公式(8):
當且僅當 的時候,纔會是線性函數。也就是說Groud Truth和Proposal的寬度w和高度h必須近似相等。
R-CNN缺點
(1) 訓練分爲多個階段,步驟繁瑣: fine-tune+訓練SVM+訓練邊框迴歸器
(2) 訓練耗時,佔用磁盤空間大:5000張圖像產生幾百G的特徵文件
(3) 速度慢: 使用GPU, VGG16模型處理一張圖像需要47s。
(4) 測試速度慢:每個候選區域需要運行整個前向CNN計算
(5) SVM和迴歸是事後操作:在SVM和迴歸過程中CNN特徵沒有被學習更新
R-CNN速度慢的一個重要原因是卷積特徵重複計算量太大,每張圖片的2000個候選區域都需要前向計算CNN特徵,而這些候選區域是有大量重疊的。
SPP-Net的兩大改進:
- 直接輸入整圖,所有區域共享卷積計算(只需要計算一遍卷積),Conv5直接輸出整圖的特徵,再在Conv5的特徵圖上做區域建議
- 然後由於Conv5層後面要接FC層,所以要把每個SS的conv5輸出的特徵映射爲固定的尺寸,因此引入空間金字塔池化(Spatial Pyramid Pooling)