Fast RCNN 中的 Hard Negative Mining


-w980

Fast RCNN 中將與 groud truth 的 IoU 在 [0.1, 0.5) 之間標記為負例, [0, 0.1) 的 example 用於 hard negative mining. 在訓練時一般輸入為N=2張圖片, 選擇 128 個 RoI, 即每張圖片 64 個 RoI. 每張圖片, 按照1:3的比例來抽取的 RoI 的話, 要在負例中抽取 48 個, Fast RCNN 采用 random sampling 策略.

hard negative example

首先我們看看 hard negative example 是怎么定義?

negative,即負樣本,hard 說明是難以正確分類的樣本,也就是說在對負樣本分類時候,loss比較大(label與prediction相差較大)的那些樣本,也可以說是容易將負樣本看成正樣本的那些樣本;

然后我們看看Fast RCNN 中的一些概念

對於目標檢測, 我們會事先標記 ground truth,然后再算法中會生成一系列 proposal,這些 proposal有跟 ground truth重合的也有沒重合的,那么 IoU 超過一定閾值(通常0.5)的則認定為是正樣本,以下的則是負樣本, 然后扔進網絡中訓練。 然而,這也許會出現一個問題那就是正樣本的數量遠遠小於負樣本,這樣訓練出來的分類器的效果總是有限的,會出現許多 false negative, 即預測為負例的正樣本

一般來說, 負樣本遠多於正樣本, 如 99% 的負樣本, 那么算法不需要訓練直接輸出為負例, 准確率也會有 99%, 那么正負樣本不均衡時, 預測偏向於樣本多的一方, 對於目標檢測而言, 負例多, 所以被預測為 false negative(即預測為負例的正樣本) 可能性比較大.

我們為了避免這樣一種情況, 需要使用策略使得正負樣本盡量的均衡一點, Fast RCNN 采用的是隨機抽樣, 使得正負樣本的比例為 1:3, 為何是1:3, 而不是1:1呢? 可能是正樣本太少了, 如果 1:1 的話, 一張圖片處理的 ROI 就太少了, 不能充分的利用 Roi Pooling 前一層的共享計算, 訓練的效率就太低了, 但是負例比例也不能太高了, 否則算法會出現上面所說的 false negative 太多的現象, 選擇 1:3 這個比例是算法在性能和效率上的一個折中考慮, 同時 OHEM(online hard example mining)一文中也提到負例比例設的太大, Fast RCNN 的 mAP將有很大的下降.

一些思考

Fast RCNN中選用 IoU < 0.1 作為hard negative的話,這樣的 IoU 值對應的負樣本一般不會被誤判。我的理解下,不是應該把那些IoU值較高但是標記為負樣本的樣本更容易被誤判嗎?所以 hard negative mining 應該從這些樣本里面(比如在Fast Rcnn中 IoU 在 [0.1, 0.5) 定義的負樣本) 挑選不是更加合理嗎?

我們可以先驗的認為, 如果 Roi 里沒有物體,全是背景,這時候分類器很容易正確分類成背景,這個就叫 easy negative, 如果roi里有二分之一個物體,標簽仍是負樣本,這時候分類器就容易把他看成正樣本,這時候就是 hard negative。

確實, 不是一個框中背景和物體越混雜, 越難區分嗎? 框中都基本沒有物體特征, 不是很容易區分嗎?

那么我認為 Fast RCNN 也正是這樣做的, 為了解決正負樣本不均衡的問題(負例太多了), 我們應該剔除掉一些容易分類負例, 那么與 ground truth 的 IOU 在 [0, 0.1)之間的由於包含物體的特征很少, 應該是很容易分類的, 也就是說是 easy negitive, 為了讓算法能夠更加有效, 也就是說讓算法更加專注於 hard negitive examples, 我們認為 hard negitive examples 包含在[0.1, 0.5) 的可能性很大, 所以訓練時, 我們就在[0.1, 0.5)區間做 random sampling, 選擇負例.

我們先驗的認為 IoU 在[0, 0.1)之內的是 easy example, 但是, [0, 0.1) 中包含 hard negitive examples 的可能性並非沒有, 所以我們需要對其做 hard negitive mining, 找到其中的 hard negitive examples 用於訓練網絡.

按照常理來說 IOU 在[0, 0.1)之內 會被判定為真例的概率很小, 如果這種現象發生了, 可能對於我們訓練網絡有很大的幫助, 所以 Fast RCNN 會對與 ground truth 的 IoU 在 [0, 0.1)之內的是 example 做 hard negitive examples.

傳統 hard example mining 流程

R-CNN 關於 hard negative mining 的部分引用了兩篇論文, 下面兩句話是摘自這兩篇論文中

先要理解什么是 hard negative example?

1. Bootstrapping methods train a model with an initial subset of negative examples, and then collect negative examples that are incorrectly classified by this initial model to form a set of hard negatives. A new model is trained with the hard negative examples, and the process may be repeated a few times.

2. We use the following “bootstrap” strategy that incrementally selects only those “nonface” patterns with high utility value:

  1. Start with a small set of “nonface” examples in the training database.
  2. Train the MLP classifier with the current database of examples.
  3. Run the face detector on a sequence of random images. Collect all the “nonface” patterns that the current system wrongly classifies as “faces” (see Fig. 5b). Add these “nonface” patterns to the training database as new negative examples.
  4. Return to Step2

[17] P. Felzenszwalb, R. Girshick, D. McAllester, and D. Ramanan. Object detection with discriminatively trained part based models. TPAMI, 2010.

[37] K. Sung and T. Poggio. Example-based learning for viewbased human face detection. Technical Report A.I. Memo No. 1521, Massachussets Institute of Technology, 1994.

**什么是 hard negative mining? **

在 bootstrapping 方法中, 我們先用初始的正負樣本(一般是正樣本+與正樣本同規模的負樣本的一個子集)訓練分類器, 然后再用訓練出的分類器對樣本進行分類, 把其中負樣本中錯誤分類的那些樣本(hard negative)放入負樣本集合, 再繼續訓練分類器, 如此反復, 直到達到停止條件(比如分類器性能不再提升).

we expect these new examples to help steer the classifier away from its current mistakes.

hard negative 就是每次把那些頑固的棘手的錯誤, 再送回去繼續練, 練到你的成績不再提升為止. 這一個過程就叫做'hard negative mining'.

R-CNN的實現直接看代碼:rcnn/rcnn_train.m at master · rbgirshick/rcnn Line:214開始的函數定義

作者:R2D2
鏈接:https://www.zhihu.com/question/46292829/answer235112564
來源:知乎, 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM