1. 程式人生 > >OHEM演算法及Caffe程式碼詳解

OHEM演算法及Caffe程式碼詳解

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/u014380165/article/details/73148073
這是CVPR2016的一篇論文,用於目標檢測,本篇博文先介紹這個演算法,然後介紹其Caffe程式碼。

論文:Training Region-based Object Detectors with Online Hard Example Mining 
論文連結:https://arxiv.org/abs/1604.03540

演算法概述:
OHEM(online hard example miniing)演算法的核心思想是根據輸入樣本的損失進行篩選,篩選出hard example,表示對分類和檢測影響較大的樣本,然後將篩選得到的這些樣本應用在隨機梯度下降中訓練。在實際操作中是將原來的一個ROI Network擴充為兩個ROI Network,這兩個ROI Network共享引數。其中前面一個ROI Network只有前向操作,主要用於計算損失;後面一個ROI Network包括前向和後向操作,以hard example作為輸入,計算損失並回傳梯度。作者將該演算法應用在Fast RCNN中,網路結構還是採用VGG16和VGG_CNN_M_1024,資料集主要採用VOC2007,VOC2012和COCO資料集。 
演算法優點:1、對於資料的類別不平衡問題不需要採用設定正負樣本比例的方式來解決,這種線上選擇方式針對性更強。2、隨著資料集的增大,演算法的提升更加明顯(作者是通過在COCO資料集上做實驗和VOC資料集做對比,因為前者的資料集更大,而且提升更明顯,所以有這個結論)。

演算法的測試結果:在pascal VOC2007上的mAP為78.9%,在pascal VOC2012上的mAP為76.3%。注意,這些結果的得到包含了一些小tricks,比如multi-scale test(測試時候採用多尺度輸入),bounding box的不斷迭代迴歸。

程式碼的github地址:https://github.com/abhi2610/ohem

演算法詳解:
如前所述,OHEM演算法的核心是選擇一些hard example作為訓練的樣本,那麼什麼樣的樣本是hard example呢?答案是:有多樣性和高損失的樣本。

在論文中作者主要是將OHEM演算法用在Fast RCNN結構中。因此可以先回顧下Fast RCNN的結構。 
Fast RCNN的結構圖如下,主要包含兩個部分:1、卷積網路。主要由多個卷積層和max pooling層組成;2、ROI pooling網路。主要包括ROI pooling層,一些全連線層和兩個損失層。

hard example是根據每個ROI的損失來選擇的,選擇損失最大的一些ROI。但是這裡有一個問題:重合率比較大的ROI之間的損失也比較相似。因此這裡作者採用NMS(non-maximum suppresison)去除重合率較大的ROI,這裡作者給的閾值是當IOU大於0.7就認為重合率較高,需去除。 
注意,這裡作者沒有采用設定背景和目標樣本數的比例方式處理資料的類別不平衡問題。因為如果哪個類別不平衡,那麼這個類別的損失就會比較大,這樣被取樣的可能性也比較大。

那麼具體要怎麼把OHEM放在Fast RCNN網路結構中呢?可能首先會想到的做法是修改損失層,將沒選擇的ROI的loss設定為0。但是這種做法並不高效,因為即便很多ROI的loss都是0,也就是不需要更新梯度,但是這樣仍需要給每個ROI都分配儲存空間,並且每個ROI都需要後向傳播。

因此就有了作者將OHEM應用在Fast RCNN的網路結構,如下圖。這裡包含兩個ROI network,上面一個ROI network是隻讀的,為所有的ROI在前向傳遞的時候分配空間。下面一個ROI network則同時為前向和後向分配空間。 
首先,ROI經過ROI plooling層生成feature map,然後進入只讀的ROI network得到所有ROI的loss;然後是hard ROI sampler結構根據損失排序選出hard example,並把這些hard example作為下面那個ROI network的輸入。

實際訓練的時候,每個mini-batch包含N個影象,共|R|個ROI,也就是每張影象包含|R|/N個ROI。經過hard ROI sampler篩選後得到B個hard example。作者在文中採用N=2,|R|=4000,B=128。 
另外關於正負樣本的選擇:當一個ROI和一個ground truth的IOU大於0.5,則為正樣本;當一個ROI和所有ground truth的IOU的最大值小於0.5時為負樣本。

對上面Fig2中的圖例截圖放大:

實驗結果:
資料集採用pascal VOC2007,結構包括VGG_CNN_M_1024(VGGM)和VGG16。這裡作者的對比了許多因素,比如1,2和3,4是對比是否有hard mining的差異,也就是一個是資料不平衡,一個是採用hard mining控制正負樣本的比例;還有減小每個batch中的影象數量的影響等。其中7,8,9,10是採用所有ROI訓練的標準Fast RCNN,因為增加了ROI數量的同時也要增大學習率,實驗結果也還可以。綜上,實驗證明這些的影響都不大,最後作者加上OHEM明顯提高了mAP。

然後是訓練損失之間的對比,採用每個ROI的平均損失作為縱座標,迭代次數為橫座標。可以看出如果bg_lo為0,也就是正負樣本是不均衡的,那麼損失是最大的。同時採用OHEM的損失是最小的。右邊的圖表和左邊的圖表的主要差別在於N=1,也就是min-batch的影象數量為1,損失上升了不少。

在計算時間和儲存上是比Fast RCNN要差一些的。

最後是在VOC 2007資料集上各演算法的mAP對比:除了OHEM本身的效果以外,也可以看出增加訓練資料的效果以及在訓練和測試時採用multi-scale,對bounding box採用multi-stage的迴歸等的效果。

以及在VOC2012上的對比:

一個更詳細的關於multi-scale和iterative bbox regression的對比:可以看出multi-scale不管應用在訓練還是測試階段都有不錯的提升效果,這個和很多采用特徵融合的方式做目標檢測的演算法其實本質是一樣的,比如SSD演算法,FPN演算法等等。還有就是Iterative bounding box regression也是非常有效,具體怎麼實現還得看程式碼。

在COCO資料集上的對比可以參看論文,這裡不再列出。

總結:
總的來講,OHEM演算法通過選擇hard example的方式來訓練,不僅解決了正負樣本類別不均衡問題,同時提高了演算法準確率,算是一個不錯的trick。可以聯絡另一篇博文:A-Fast-RCNN演算法,也是類似的關於利用hard example來提高mAP,只不過那篇演算法是生成hard example,而這篇演算法是選擇hard example。

Caffe程式碼:
1、資料層


2、VGG16的卷積層
最後一層為conv5_3。

3、只讀 ROI Network
包含一個ROI pooling層,兩個常規全連線層(fc6,fc7),一個分類得分的全連線層,一個迴歸的全連線層,一個算分類概率的softmax層。

分類得分的全連線層:注意這裡有個propagate_down引數設為false,也就是不回傳梯度,後面的迴歸同理。

迴歸的全連線層:

算分類概率的softmax層:

4、hard ROI mining層
輸入包括:分類概率的輸出,迴歸的輸出,最開始資料層的輸出(rois,labels,targets和兩個weights)

5、另一個ROI Network
注意這裡的ROI pooling層和前面那個只讀ROI Network的ROI pooling層的主要區別在於輸入變成了rois_hard,即挑選後的hard example。然後依然是兩個常規的全連線層(fc6,fc7),一個分類全連線層和一個迴歸全連線層。

看看ROI Network的分類全連線層:可以和前面只讀ROI Network的分類全連線層做對比

6、分類損失層和迴歸損失層
(前者用SoftmaxWithLoss,後者用SmoothL1Loss)


--------------------- 
作者:AI之路 
來源:CSDN 
原文:https://blog.csdn.net/u014380165/article/details/73148073?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!