本系列筆記主要記錄本人在閱讀過程當中的收穫,儘可能詳細到實現層次,水平有限,歡迎留言指出問題~算法
這篇文章被認爲是深度學習應用於目標檢測的開山之做,天然是要好好讀一下的,因爲文章是前些日子讀的,因此僅憑記憶把印象深入的地方記錄一下,許多地方是本身理解,有錯誤請指出。學習
這篇文章幹了一件什麼事情呢,就是用selective search生成一堆建議區域,而後把這些建議區域根據必定的準則作成分類訓練集,微調預訓練的CNN,C而後用CNN提取的特徵和對應的類別訓練SVM二分類器,最後通過非極大值抑制過濾後獲得的結果對應的region proposal就做爲檢測邊框。預測的時候,要對每個region proposal執行一次CNN+SVM。優化
我理解的是,CNN(或者說CNN+SVM)在RCNN中仍然只是一個分類模型,對selective search生成的region proposals進行分類,通過後處理,留下的被斷定爲目標的region proposal就做爲最後的檢測結果。spa
做者使用selective search算法生成大約2k個就建議區域,這是一個傳統算法,組合多種策略和人工特徵能夠直接給出合乎條件的目標區域。這裏的問題是,生成的邊框尺寸大小不一,背景多目標少,不少只能框住目標的一部分,這些對後面的訓練策略有影響。code
做者先在公開數據集上預訓練了一個CNN的分類模型,而後在當前任務上微調。具體的,上一步生成一堆建議區域有不少只框住了目標的一部分,做者把IoU>0.5的認定爲正樣本,其他的爲負樣本,因而造成了一個分類的訓練集,以此來微調模型。blog
這裏面還有個細節,上一步生成的一堆建議區域,並不能直接送入CNN,由於當時的CNN分類模型都是若干卷積層+全鏈接層這樣的結構,由於全鏈接層的緣故,模型的輸入必須是某個固定的尺寸,所以哪些大小不一的region proposals必須先warp到fixed size。具體warp方法不展開講了。圖片
一樣須要造成一個訓練集(X,Y),此次標準不同,將IoU=1的認定爲正樣本(y=1),IoU<0.3的認定爲負樣本(y=0)。具體的,IoU是region proposal與ground truth的交併比,而訓練集的X則是該region proposal通過CNN encode獲得的特徵向量。深度學習
使用非極大值抑制去除重複檢測io
爲何不直接用CNN模型進行分類,而要使用SVM呢?ast
爲何訓練CNN和SVM時候,正負例斷定標準IoU閾值設置不一樣呢?
答:這兩個問題是相關的,我認爲本質上是由於這是一個多階段的模型,不少地方須要trade off,第一步生成的建議區域是正例少負例多,構建訓練集的時候就容易不平衡,所以須要放寬正例的條件,可是要想定位準確,就須要正例更精準,這就是矛盾所在,所以有了不一樣的IoU閾值和引入SVM。具體的,因爲算法最後給出的檢測結果就是通過篩選的region proposal,那麼確定但願它跟ground truth更吻合,也就是IoU接近於1,那麼天然的要把哪些容易產生干擾的樣本剔除掉爲好。但訓練CNN須要大量樣本,在當前任務下,負例多正例少,一次調高IoU閾值爲0.5,增長正例數量,防止過擬合;而訓練SVM須要樣本數量少,由於IoU閾值設置嚴格,以提升定位準確率。
4.1 對每個region proposal都要過一遍CNN,重複計算嚴重拖累的模型的效率
直觀的想,解決這個問題就是要共享計算,也就是要先對圖片進行一次總體卷積,而後在feature map上選取region proposal,可是這時的region proposal的尺寸又是大小不一的了,不知足全鏈接層的輸入要求。。針對這個問題,提出了SPP-Net和Fast-RCNN,後面陸續展開講。
4.2 經過selective search生成region proposals。
這部分是不能經過學習優化的,而後經過對這些分類代替迴歸定位,感受潛力有限。是否迴歸生成region proposals更優,還不太肯定,等讀到後面的論文再說。
4.3 多階段的模型,尤爲是加入不能學習的算法,形成一種脫節感,限制了深度學習模型的威力。