論文心得系列
Faster R-CNN : Towards Real-Time Object Detection with Region Proposal Network
(以上的圖片部分參考至此篇論文)
論文連結 : https://arxiv.org/pdf/1506.01497.pdf
目錄 :
1.前情提要以及背景介紹
2.核心技術 (Region Proposal Network)
3.如何訓練Faster R-CNN以及運作中的小細節
4.結論
1.前情提要以及背景介紹 :
Deeplearning於近幾年蓬勃發展,尤其自CNN被提出後,於影像端更是發展迅速,各種物體辨識的類神經網路架構相湧而出。
然而在實際的產品應用端上,除了物體辨識以外,更重要的還是物件偵測。而Real-Time的物件偵測更是deeplearning於實際產品應用中的一個大挑戰。
大神Ross Girshick提出了一系列的R-CNN(Region-CNN)架構來解決這個應用端的問題,其中包含了R-CNN、fast R-CNN、faster R-CNN。
我們今天要記錄的就是faster R-CNN,此篇paper於2016/1/6中提出(時間點相當的重要!因為類神經網路發展的速度非常的快速,可以透過提出的時間點,來與其他的網路架構進行結合比較),而提出的目的最主要是為了要解決fast R-CNN仍然不夠即時的問題。
在fast R-CNN中,是藉由selective-search的方法先將可能是物體的部分框起來,再利用convolution neural network來進行特徵的擷取以及分類並校正邊框(如下圖)

利用selective-search框出物體--->透過捲積網路進行特徵解取--->最後再用fully connected網路將物體分類及調整box
其中最消耗時間的就在前端的selective-search,並且不符合類神經網路架構的精神(應該要把疑難雜症的問題都交給類神經網路才對,而不是用傳統的方法來解決),因此在faster R-CNN中加入了一個全新的網路架構 : Region Proposal Networks。
此篇論文將透過Region Proposal Networks來處理selective-seach在做的事。也就是讓類神經網路把影像中可能是物體的部份給框起來!
藉此,可以讓整個架構的流程更加的順暢,並提高準確度與速度。
2.核心技術 :
2-1.網路架構
首先在Faster R-CNN所提出的論文中,並未對如何對特徵擷取以及最後的物件分類與位置的微調去做琢磨(多數沿用Fast R-CNN的設定)。更多的是將精力放在如何利用類神經網路建構出能取代selective-search的模型。所以在論文中提出一個簡單的設計架構圖,如下圖 :

可以看到這個流程主要可以分為三個部分 :
(1)利用CNN來進行特徵擷取
(2)Reggion Proposal Network : 選出可能有物體的框
(3)物件分類以及邊框微調
在這篇論文中有嘗試使用不同的CNN-Net來進行特徵擷取(VGG16、ZFNet),然而隨著時間的發展,如今有更多表現更好的網路架構,如ResNet、Inception等等。這部分是我們可以自由選擇搭配的,對於我們的資料集以及硬體設備選擇一個恰當的model來做特徵擷取,而尾端的分類與位置的微調多半是使用與fast R-CNN一樣的fully connected neural network來做連結訓練。
最後就是這篇論文的重頭戲 : Reggion Proposal Network。
2-2.Reggion Proposal Network介紹
我們可以用簡單幾句話來介紹Reggion Proposal Network : 先生成無數個框,對這些框做評分以及微調(大小與中心),將好的留下、壞的拿掉。
沒錯!就是這麼簡單,那首先如何生成無數個框呢?
2-2-1.框要如何選? Anchor !
最直覺也是最暴力的方式就是選定所有的框框size,然後對所有的pixel點進行平滑移動,用最暴力的方式把所有的框都給挑出來。

然而在這樣選取的時候會發生一個問題,雖然平滑的次數有限(based on image size),但框的大小並無限制,會發現根本沒辦法把所有的框給窮舉。那該怎麼辦呢?
注意我們剛剛所描述的流程,其中有一個步驟是微調,也就是說,我們其實不用把所有的框都進行窮舉,直覺上來說,只要有一個框就好,反正當我們框到物體以後,儘管框的大小不一致,但仍然可以透過微調的步驟將其調整回來,然而這樣的想法卻有著致命的錯誤,因此,此篇論文所提出的概念Anchor誕生了。
那究竟是什麼錯誤呢?
(1)竟然已經說明是微調了,就代表著調整的幅度不大,也就是說當選定框的size與實際物體大小差距過大時,我們是無法調整回來的。(尺度大小的問題)
(2)假如同時有兩個物體很靠近的時候,這個框要像誰靠近並fitting呢?

由這個例子我們可以看到,當我們的籃框移動到紅色這點pixel的時候,因為兩個物體(狗、硬幣)有著相同的中心點,我們在做所謂微調的動作的時候,會無法準確的將兩個物體都給判斷出來。如果微調至硬幣,則狗就會無法被框出;反之如果為調製狗的大小,硬幣就會無法被框出,而這就是選擇單一框大小最致命的地方。
接著我們先看看這篇論文提供了一個選擇框的方式 : Anchor Box。
對於每個pixel點,我們都會產生K個固定大小的Anchor Box(這個Anchor Box的大小是自己挑選的)如下圖

(先別管那個2k跟4k)
假設一張影像的大小為MxN,那在這個case我們就會有MxNxK個框,而將這些框丟進評分模型,並進行微調就是我們接下來的步驟。
小結論 : 那Anchor Box不是什麼事都沒做?沒錯!確實什麼事都沒做,他只是提出了你可以使用k個你自己設定的box大小去選框,就這樣!至於k要多大以及你的這些box大小要如何制定?其實是沒有給什麼太大的建設性意見的。直到yolo v2後才有新的辦法推出,透過使用K-mean來設計這些框的大小,這部分等留到yolo再進行補充。
(另外也提到了有別篇論文是使用k-mean的做法來做,但因為不具有平移不變性,所以本文的方法比較好。但這部分...有待商榷。
論文名稱為 Scalable High Quality Object Detection,後續再來進行比對研究 )
在論文裡,使用了3種比例大小,並對其做3次不同的縮放也就是會有9種不同的框(K=9)

稍微對這張圖表進行簡單的說明 : anchor scales指的是整體的面積,而aspect ratios則是長寬的比例,最後的mAP則是faster R-CNN的結果(PASCAL VOC 2012 dataset)。所以可以簡單的對其做計算,即可算出邊框的大小。關於mAP於後續再進行單獨的介紹。
所以很明顯的,我們應該無法用科學的方式得知要取怎麼樣的anchor boxes,只能藉由觀察dataset的樣態進行多方猜測與測試。
2-2-2.如何對選定好的框進行評分並微調邊框?
核心思路保持一致,就是利用類神經網路架構幫我們訓練出一個可以把上述利用anchor boxes產生的框給評分並進行微調。
有了這樣的想法後,接著就要去思考幾個問題 :
- Input、Output要怎麼放?
- loss function怎麼設計?
- 要選定哪種類神經網路架構?
當然這些問題是互相交錯在一起的,我們一步一步進行解析 :
首先我們要訓練這個類神經網路,就需要有資料集,這份資料集正是我們剛剛利用anchor boxes所產生的框,而對於每一個框,我們的輸出希望是一個1x6的向量,分別為{是背景的機率,是物體的機率,x座標,y座標,邊框寬度,邊框長度}
其中(是背景的機率+是物體的機率)=1,為什麼要分成2個output來設計呢? (當初當機想超久的! 想成如果是分成3類就很清楚了,分成多類別一定需要透過多個維度來表示)
這件事與label有著重大的關聯。因為在anchor boxes所產生的框中,幾乎絕對不會有完美貼其真實物體的框,大致上還是會有所出入。所以在label什麼是背景與什麼是物體的情況是利用IoU的計算來判斷 :

對每個pixel所產生的框而言,當其IoU>0.7、或是這個pixel中最大的那個IoU,我們就認為這是個物體(label為1),後者的目的是要避免anchor boxes選擇的沒這麼好導致物體都沒有被框出;而當IoU<0.3且不是這個pixel中最大的那個IoU,則我們認為這個是背景(label為0)。
對於那些模稜兩可的框(像上圖的這個紅框就不是背景也不是物體),並不會幫助我們訓練如何分開背景與物體,所以我們使用上述label的定義來挑出這些沒有用的框(不加入訓練),並且超出圖大小的框也不被納入訓練。
釐清完input與output後,我們開始研究loss funciton設計成什麼樣子,在論文中,給出了下列的式子 :

(在本篇論文中λ =10)
很清楚的可以看到,本篇論文將RPN架構的loss function設計為分類的loss與回歸(計算位置)的loss兩者的比例合。那接著我們分別對其進行探討。
首先是分類問題 : 這部分其實非常直覺也簡單,就是使用cross emtropy來對其計算 :

(備註 : 多數文章的分享這個部分都寫的怪怪的,這部分須看code做確認)
cross emtropy的部分後續的文章也會陸續分享,這邊就不在多加贅述。
接著是回歸(位置調整)的問題 : 這部分就比較沒有這麼直觀了,在論文中,使用了兩個小技巧 :
- 利用smooth l1 norm來計算loss(以下是回歸模型常用的三種loss,分別為L1、L2、smooth L1)

在論文中有提到為什麼使用smooth L1,原因是對於離群點( outliers )的時候,如果使用L2 norm來計算會使得loss被這些離群點牽著走,而無法訓練至好的參數。(尤其是我們上述的label方式,對於每個pixel而言的所有Anchor boxes中至少會選一個最大的IoU的框來label成物體的樣本,這樣很容易造成資料中出現離群點。故使用smooth L1來計算loss;另外L1 norm則是在靠近0的地方不夠平滑,故不使用)
- 接著就要探討到第二個技巧 : 座標轉換。

在faster R-CNN這篇論文中,並沒有直接將物體的座標位置與寬高與ground truth做smooth L1 norm,而是先通過一個座標轉換。
在這裡我試著來解釋為什麼它會這麼做,在取Anchor boxes的時候,有著不同的比例大小,如果直接對物體的座標資訊做計算會導致大的物體的loss會佔據整個loss的比例(物體大--->中心點與長寬的變化相對而言容易較大),為了避免這樣的情況產生,faster R-CNN在設計loss的時候都將其除以本身的長寬大小,藉此避免上述的情況。
而在長寬的變化中取log的原因是對於中心點的偏移而言,我認為這個量是比較小的(因為對每個pixel都會進行平滑),所以避免長寬的loss過大而使得偏移的部分失去用途,故對其取log做平衡。
當作完座標轉換後,最後再計算smooth L1 norm :

在釐清好loss function後,我們回頭對RPN的網路架構進行分析探討,網路架構如下 :

如果把RPN從faster R-CNN單獨拆開來看會發現這就是一個簡單的類神經網路架構而已,在對feature map做3次convolution後分別使其成為分類以及回歸的輸出維度。(做完convolution也就是特徵擷取後,我們希望每個pixel都能output出設定好的Anchor boxes的6個輸出值。這時候就能很精妙的利用1x1的convolution將這些輸出值取出)
上圖中第一個分支為18個1x1的convolution,那這層的output就會是一個18維度的特徵圖,即可將其想像為每個pixel都會有9個Anchor box,而每個Anchor boxes都會有兩個輸出(是背景的輸出值、是物體的輸出值),然後再透過softmax將每個Anchor box的輸出值計算為其機率值(是背景的機率、是物體的機率)最後與label的結果計算分類的loss。
第二個分支為36個1x1的convolution,同理這層的output就會是一個36維度的特徵圖,可將其想像為每個pixel都會有9個Anchor box,而每個Anchor boxes都會有四個輸出(x,y,h,w)最後一同與label計算回歸的loss。
到這裡為止,RPN網路就大致結束了,接著開始介紹整體如何訓練(與一般的網路架構不太一致)
以下為整個Faster R-CNN的樣貌(看完能夠更清楚等等訓練的過程)

3.如何訓練Faster R-CNN以及運作中的小細節
講完RPN網路後,我們會發現在Faster R-CNN中涵蓋了兩個網路架構,那這樣怎麼對它(它們)做訓練呢? 論文中提出了三種訓練這種雙重網路架構的思維 :
- Alternating training(交替訓練)
- Approximate joint training(近似聯合訓練)
- Non-approximate joint training(非近似的聯合訓練)
文中表示此篇論文使用4-step Alternating training來做訓練,我就先此做介紹,另外兩個會在額外的文章進行說明。
- 首先,我們要先訓練RPN網路。在訓練RPN網路之前,我們需要先將一般影像轉換為特徵影像,所以需要pre-train一個ImageNet,才能提供RPN網路的輸入。
在訓練的過程中需要注意到的是,對於一般影像而言,所有的Anchor boxes中佔背景的為多數,所以在訓練的過程中,本篇論文使用的方式為對每張圖隨機挑選128個正樣本(標記為物體的框)以及128個負樣本(標記為背景的框)來做訓練,並未將所有的框一同訓練。
- 使用RPN生成的結果,來訓練一個單獨的Faster R-CNN網路(此網路也是用ImageNet做pre-train)。這時候兩個網路並沒有共享參數層。
這部分在訓練的過程中,如果RPN生成的proposals有著非常多的重疊結果,可以使用NMS去除高度重疊的region proposals(論文中IoU閥值為0.7)
- 使用剛剛訓練好的Faster R-CNN網路來提供RPN網路的輸入,藉此來對RPN網路進行訓練。此時並不調整Faster R-CNN網路的參數。
- 將Faster R-CNN網路的前半段(輸出特徵圖)的部分以及RPN網路的參數固定,僅對Faster R-CNN網路的後半段中fully connected layer進行微調。
4.結論
Faster R-CNN算是整個系列的大成之作,不僅在精準度上完全超越以往的方法,速度上也有非常顯著的提升。然而在研讀這篇論文的過程中,還是留下了許多的問題可以繼續相互討論 :
- 在整個Faster R-CNN的流程中出現了兩次的座標微調,這部分是否有機會可以進行簡化?
- 在訓練兩個網路架構的過程還是以單方面訓練為主。是否有一個較好的方式可以直接進行一次性的訓練,並取得較好的結果?
- 在Anchor的選定似乎可以有更好更有效率的方式。
- 需要設定的參數量非常的多且關鍵。如果實際運用在自身的資料集上,這樣的流程架構是否還能行的通?
以上是我對Faster R-CNN這篇論文的心得分享,謝謝。
