目標檢測之六:OHEM 在線難例挖掘

https://zhuanlan.zhihu.com/p/102817180

6.OHEM 在線難例挖掘

OHEM(Online Hard negative Example Mining,在線難例挖掘)見於[5]。兩階段檢測模型中,提出的RoI Proposal在輸入R-CNN子網絡前,我們有機會對正負樣本(背景類和前景類)的比例進行調整。通常,背景類的RoI Proposal個數要遠遠多於前景類,Fast R-CNN的處理方式是隨機對兩種樣本進行上採樣和下采樣,以使每一batch的正負樣本比例保持在1:3,這一做法緩解了類別比例不均衡的問題,是兩階段方法相比單階段方法具有優勢的地方,也被後來的大多數工作沿用。

論文中把OHEM應用在Fast R-CNN,是因爲Fast R-CNN相當於目標檢測各大框架的母體,很多框架都是它的變形,所以作者在Fast R-CNN上應用很有說明性。

Fast R-CNN框架

上圖是Fast R-CNN框架,簡單的說,Fast R-CNN框架是將224×224的圖片當作輸入,經過conv,pooling等操作輸出feature map,通過selective search 創建2000個region proposal,將其一起輸入ROI pooling層,接上全連接層與兩個損失層。

 

OHEM圖解,應用於Fast R-CNN

作者將OHEM應用在Fast R-CNN的網絡結構,如上圖,這裏包含兩個RoI network,上面一個RoI network是隻讀的,爲所有的RoI 在前向傳遞的時候分配空間,下面一個RoI network則同時爲前向和後向分配空間。在OHEM的工作中,作者提出用R-CNN子網絡對RoI Proposal預測的分數來決定每個batch選用的樣本。這樣,輸入R-CNN子網絡的RoI Proposal總爲其表現不好的樣本,提高了監督學習的效率。

首先,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時爲負樣本。

總結來說,對於給定圖像,經過selective search RoIs,同樣計算出卷積特徵圖。但是在綠色部分的(a)中,一個只讀的RoI網絡對特徵圖和所有RoI進行前向傳播,然後Hard RoI module利用這些RoI的loss選擇B個樣本。在紅色部分(b)中,這些選擇出的樣本(hard examples)進入RoI網絡,進一步進行前向和後向傳播。

MMDetection中,OHEM(online hard example mining):(源碼解析)

rcnn=[
        dict(
            assigner=dict(
                type='MaxIoUAssigner',
                pos_iou_thr=0.4, # 更換
                neg_iou_thr=0.4,
                min_pos_iou=0.4,
                ignore_iof_thr=-1),
            sampler=dict(
                type='OHEMSampler',
                num=512,
                pos_fraction=0.25,
                neg_pos_ub=-1,
                add_gt_as_proposals=True),
            pos_weight=-1,
            debug=False),
        dict(
            assigner=dict(
                type='MaxIoUAssigner',
                pos_iou_thr=0.5,
                neg_iou_thr=0.5,
                min_pos_iou=0.5,
                ignore_iof_thr=-1),
            sampler=dict(
                type='OHEMSampler', # 解決難易樣本,也解決了正負樣本比例問題。
                num=512,
                pos_fraction=0.25,
                neg_pos_ub=-1,
                add_gt_as_proposals=True),
            pos_weight=-1,
            debug=False),
        dict(
            assigner=dict(
                type='MaxIoUAssigner',
                pos_iou_thr=0.6,
                neg_iou_thr=0.6,
                min_pos_iou=0.6,
                ignore_iof_thr=-1),
            sampler=dict(
                type='OHEMSampler',
                num=512,
                pos_fraction=0.25,
                neg_pos_ub=-1,
                add_gt_as_proposals=True),
            pos_weight=-1,
            debug=False)
    ],
    stage_loss_weights=[1, 0.5, 0.25])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章