此處僅作學習記錄之用。
在目標檢測中我們會事先標記好ground_truth,接下來在圖片中隨機提取一些列sample,與ground_truth重疊率IOU超過一定閾值的(比如0.5), 則認為它是positive sample,否則為negative sample,考慮到實際負樣本的數量遠大於正樣本的數量,我們為了避免network的預測值少數服從多數而向負樣本靠攏,取正樣本數:負樣本數大約為1:3,顯而易見,用來訓練網絡的負樣本為提取的負樣本的子集,那么,我們當然選擇負樣本中容易被分錯類的困難負樣本來進行訓練。
那么負樣本中哪些是困難負樣本(hard negative)呢?困難負樣本是指那些容易被網絡預測為正樣本的proposal,即假正例(false positive), 例如roi里有二分之一目標時,雖然它仍是負樣本,卻容易被判斷為正樣本,這塊roi即為hard negative,訓練hard negative對提升網絡的分類性能具有極大幫助,因為它相當於一個錯題集。
如何判斷它為困難負樣本呢?也很簡單,我們先用初始樣本集去訓練,再用訓練好的網絡模型去預測負樣本集中的負樣本,選擇其中得分最高,即最容易被判斷為正樣本的負樣本為困難樣本,加入負樣本集中,重新訓練網絡,循環往復,然后我們會發現:咦!我們的網絡的分類性能越來越強了!假陽性負樣本與正樣本間也越來約相似了!(因為此時只有這些妖怪區域能迷惑我們的分類器了)
2.原文來自於:https://blog.csdn.net/u012285175/article/details/77866878
最近一直在看關於CNN的目標檢測的文章,在這中間會經常看到hard negative mining這個名詞,在這里把這個詞解釋一下:假設給你一堆包含一個或多個人物的圖片,並且每一個人都給你一個bounding box做標記,如果要訓練一個分類器去做分類的話,你的分類器需要既包含正訓練樣本(人)和負訓練樣本(背景)。
你通過觀察bounding box去創建一個有用的正訓練樣本,那么怎么做才能創建一個有用的負訓練樣本呢?
一個很好的方式就是在開始的時候隨機創建一堆的bounding box候選框,並且不能與你的正樣本有任何的重疊,把這些未與正樣本重疊的新的bounding box作為你的負樣本。
好了,這樣你的正負樣本都有了,可以訓練可用的分類器了,你用滑動窗口在你的訓練圖片上進行運行,但是你會發現你的分類器並不是很好用,分類的效果並不是很好,因為它會拋出一堆錯誤的正樣本,即假正例(當檢測到人時,實際上卻不是人),那么問題就來了,你訓練了一個分類器,然而這個分類器並不能達到你想要的效果,那么應該怎么辦呢?
這個時候就要用到hard negative了,hard negative就是當你得到錯誤的檢測patch時,會明確的從這個patch中創建一個負樣本,並把這個負樣本添加到你的訓練集中去。當你重新訓練你的分類器后,分類器會表現的更好,並且不會像之前那樣產生多的錯誤的正樣本。