天天看點

R-CNN三部曲(一):目标檢測與R-CNN

R-CNN是深度學習最早應用到目标檢測的模型,主要還是對CNN進行改進,補充一些結構功能,使得模型能夠滿足目标檢測的目标位置确定與分類。

CNN的圖像分類效果是非常好的,遺憾的是它無法對目标進行定位,是以R-CNN的思路就是,既然CNN沒法定位目标,那不如把圖像中潛在的目标都找出來,再分析找得對不對。

第一步要做的就是找出圖像中潛在的目标,也就是生成候選區域,方法有很多,比如selective search、edge boxes,這裡以selective search為例,它主要的思路就是根據圖像的顔色、紋理、尺寸相似性和空間重合度,劃分出一個個區域:

R-CNN三部曲(一):目标檢測與R-CNN

可以看出,其實選出來的區域大小是不一緻的,但是CNN要求輸入應為固定大小,是以我們就簡單粗暴地對圖像進行縮放變形,使得它變成我們預設的尺寸。

調整了尺寸之後,會繼續輸入到CNN,利用CNN對每個候選區域(你沒看錯,是每個,是以R-CNN效率很低)進行分類。在這裡我們先回想一下,CNN做分類,其實就是利用卷積層池化層提取特征,最後再用全連接配接層做分類,而R-CNN在利用CNN提取了特征之後,會有兩個head,一個head繼續做分類,一個head做邊界框回歸:

R-CNN三部曲(一):目标檢測與R-CNN

首先我們繼續看看分類操作,還是像傳統的CNN那樣,最後利用全連接配接層進行分類,而在R-CNN的論文中,最後還利用SVM(上圖沒有顯示出來),進一步分析CNN的分類結果是否正确(進行二分類判斷對錯)。主要原因有兩點,第一是實驗證明在這裡SVM的分類效果比CNN好,是以利用SVM進一步提高模型的分類準确度,第二是SVM分類的結果是一個01之間的數值,這個數值可以看成置信度或者分類得分,在測試過程中,我們就可以根據這個得分,挑選前n個最可能的目标。除此之外還有一個作用,比如有幾個候選框,框中了同一個人的頭、手和全身,然後用CNN分類都得到這是一個人,這時候模型就認為圖像裡面有三個人了,可是我們引入了SVM對分類結果評分之後,可能隻有全身的分類得到較高,其他兩個分類得分較低,這時候我們隻需要設定一個合理的門檻值,就能隻保留最合理的那個識别結果(具體可了解一下非極大值抑制)。

而邊界框回歸(bounding-box regression)則主要是為了調整候選框的尺寸位置,使得它更接近真實邊界框,這裡詳細講解一下。

首先,我們要知道,訓練資料是有明确說明圖像中的目标以及邊界框的具體位置資訊的,我們可以用下式表示真實邊界框:

G i = ( G x i , G y i , G w i , G h i ) G^i = (G_x^i, G_y^i, G_w^i, G_h^i) Gi=(Gxi​,Gyi​,Gwi​,Ghi​)

分别表示邊界框的左上角坐标以及框的寬和高。

候選邊界框可以表示為:

P i = ( P x i , P y i , P w i , P h i ) P^i = (P_x^i, P_y^i, P_w^i, P_h^i) Pi=(Pxi​,Pyi​,Pwi​,Phi​)

邊界框回歸,就是想辦法讓候選邊界框無限接近真實邊界框(ground-truth bounding box),那麼候選邊界框怎麼才能接近真實邊界框呢?我們可以認為主要通過兩種操作:一個是對邊界框進行尺度變換,也就是變形,使得它的形狀尺寸接近真實邊界框,也就是對框的寬和高進行處理;另一個是對邊界框進行平移變換,改變框的位置,也就是框的坐标。平移變換的公式如下:

G ^ x = P w d x ( P ) + P x \hat G_x = P_w d_x(P) + P_x G^x​=Pw​dx​(P)+Px​

G ^ y = P h d y ( P ) + P y \hat G_y = P_h d_y(P) + P_y G^y​=Ph​dy​(P)+Py​

尺度變換公式如下:

G ^ w = P w e x p ( d w ( P ) ) \hat G_w = P_w exp(d_w(P)) G^w​=Pw​exp(dw​(P))

G ^ h = P h e x p ( d h ( P ) ) \hat G_h = P_h exp(d_h(P)) G^h​=Ph​exp(dh​(P))

接下來分析的重點就是,為什麼平移變換和尺度變換的公式的形式是這樣。

首先來看看平移變換公式,我們先來想象一下,如果想要候選框變換成真實框,那麼從坐标的角度來說,隻需要在xy軸的坐标分别加上一個內插補點常數不就行了,是以可以看到,Gx和Gy都是由Px、Py(候選框坐标)加上另一個項。但是如果知道真實框,當然可以直接加一個數,現在的問題就是不知道,是以我們就需要從模型的輸入(CNN特征圖)出發,利用模型計算出這個"常數"。

假設坐标差為:

Δ x = G x − P x = P w d x ( P ) \Delta x = G_x - P_x = P_w d_x(P) Δx=Gx​−Px​=Pw​dx​(P)

d x ( P ) = Δ x / P w d_x(P) = \Delta x / P_w dx​(P)=Δx/Pw​

也就是說,模型要通過輸入計算的實際上就是一個經過歸一化的坐标差,為什麼要歸一化,或者說為什麼內插補點要處以候選框的寬和高,個人認為,更多是為了增強模型的魯棒性。這裡邊界框回歸的輸入尺度是一樣的,是以進不進行歸一化看起來都差不多,但是在後期的模型(比如Faster R-CNN中的RPN),我們會對不同尺度的輸入進行邊界框回歸,這時候邊界框的寬高不同,就會影響了模型對于內插補點計算的判斷,是以如果讓模型直接學習歸一化的內插補點,再乘上歸一化項得出內插補點,模型的效果就會更好。

再說一下這個d§,先來看看模型,輸入的是CNN的特征圖,是以邊界框回歸就是通過特征圖利用不同的參數計算出d_x§和d_y§,而那些參數就是模型要學習的東西了。

對于尺度變換,思路上也是差不多,乘上一個項使得候選框的寬高接近真實框的寬高。問題在于要有一個exp函數,主要原因就是保證這個數值大于0,不然模型如果算出一個負數就不可解釋了。

順帶一提,通過模型求得的參數,可以得知候選框如果要轉化為真實邊界框,需要進行的變換的程度,而這個名額正正可以作為模型的損失函數,判斷候選框與真實框的接近程度。關于邊界框回歸還有很多細節值得探讨,這裡暫不詳細讨論,感興趣的朋友可以繼續深入研究。如果是做計算機視覺的朋友,對于邊界框回歸的這些公式推導細節,都是值得慢慢深入研究的。

最後再簡單說一下模型的訓練過程,主要看看模型的損失函數。損失函數和模型一樣由兩部分相加,一個是分類的損失,一個是邊界框回歸損失,訓練資料标注了真實邊界框的資訊,是以我們訓練模型,就是希望模型的分類結果盡可能準确,得到的候選框盡可能接近真實邊界框。

作為總結,再說一下R-CNN的優缺點,首先優點當然是首次把CNN引入到目标檢測領域,但是缺點也很明顯,第一,選出候選框就很耗時間,一般來說,一幅圖像需要選出兩千多個候選框,第二,我們需要對每個候選框進行一次CNN計算,也就是說,即使隻是處理一幅圖,也要進行兩千多次CNN計算,十分耗時,是以針對R-CNN的這些缺點,就有了改進的Fast R-CNN、Faster R-CNN等模型。

在github寫的自然語言處理入門教程,持續更新:NLPBeginner
在github寫的機器學習入門教程,持續更新:MachineLearningModels
想浏覽更多關于數學、機器學習、深度學習的内容,可浏覽本人部落格

繼續閱讀