天天看點

深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽

深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽

深度學習目标檢測之 R-CNN 系列包含 3 篇文章:

  • 深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽
  • 深度學習目标檢測之 R-CNN 系列:Faster R-CNN 網絡詳解
  • 深度學習目标檢測之 R-CNN 系列:用 Faster R-CNN 訓練自己的資料(caffe 版)

1. 前言

這一篇文章主要是從 R-CNN 的發展曆程來介紹各個版本的 R-CNN 是如何發展的。

R-CNN(Regions with CNN features) 是基于深度學習的早期目标檢測架構發展起來的。如果按照 one-stage 和 two-stage 的分類, R-CNN 系列屬于 two-stage 的方法,即第一步得到包含目标的候選區域,第二步對候選區域進行分類和校準,得到最終的檢測結果。

R-CNN 系列是目标檢測中的重要裡程碑, 整個 R-CNN 系列中現在應用較多的是 Faster R-CNN,但是為了更清楚的了解 Faster R-CNN,是以還是從 R-CNN 講起。

2. R-CNN

R-CNN 在 VOC 2012 上大放異彩,mAP 提升超 30%,其在檢測任務上的意義不亞于同年 AlexNet 在分類任務上的突破。R-CNN 後來(2014年)被整理并發表于 Rich feature hierarchies for accurate object detection and semantic segmentation Tech report 。

如原文開篇所說, R-CNN 主要解決了兩個問題:

  • 如何利用深度神經網絡去做目标的定位?
  • 如何在一個小規模的資料集上訓練能力強勁的網絡模型?

下面透過 R-CNN 的過程來看看作者是如何解決上面這兩個問題的。

深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽

上圖來自原文,簡要的說明下 R-CNN 的過程:

  • 利用 Selective Search 的方法,從輸入圖檔中得到大約 2k 的 region candidates(但是他們的 size 卻是各異)
  • 将這些 region candidates warp 到一個統一的

    size,比如對于 AlexNet,就是 warp 到 227*227

  • 在 image classification 的資料集(ILSVRC2012)上預訓練模型,這裡的分類為 N 類
  • 将上面得到的 region candidates 用于 fine tuning CNN網絡,這裡的 region candidates 可以分為 N+1 類,這裡的加一指的是不包含目标的背景,訓練時的 batch size 為128(32 positive + 96 negtive/background(iou < 0.5)), 比例為 1:3)
  • 對于每一個輸入 CNN 的 region candidates 都會得到一個特征向量,這個向量會被輸入 SVM 分類器進行分類, iou < 0.3 的為 negtive,對于分類後的結果采用 NMS(非極大值抑制) 來進一步減少 region candidates
  • 為了減小定位誤差,專門訓練了一個回歸模型用來修正預測的檢測視窗

下圖大緻表示了 R-CNN 的過程。

深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽

再回到上面的兩個問題:

  • 如何利用深度神經網絡去做目标的定位?

    其實這裡的深度神經網絡僅僅是進行了特征提取,當然這已經是進步了。

  • 如何在一個小規模的資料集上訓練能力強勁的網絡模型?

    先在大的分類資料集上預訓練模型,然後到目标資料集(比如檢測資料集)上 fine tuning。

R-CNN 的缺點是明顯的:

  • 備援計算。Selective Search 的方法相對于傳統的滑窗做法已經有了進步,但是 2k 的 region proposal 中依然有大量的重疊區域,而每個 region proposal 都會輸入 CNN,是以會産生大量的備援計算。特别需要注意的是,這個計算在 test 的時候也依然是少不了的,是以這将是一個非常緻命的弱點。
  • region proposal 的尺度縮放問題。由于 Seletive Search 得到的 region proposal 的尺寸是各不相同的,直接采用 warp 的方式變換到相同的尺寸,這可能導緻目标失真變形。
  • 雖然應用了 CNN,但是其實僅僅隻是用來提取特征,比如 SVMs 和 regressors 并沒有用來更新 CNN
  • 訓練過于複雜。首先是 Selective Search,然後是 CNN,最後還有 SVM 和 regression

3. Fast R-CNN

2015 年 R-CNN 的原作者 Ross Girshick 單槍匹馬一個人提出了 Fast R-CNN。

前面我們提到 warp region proposal 可能會引起目标失真變形的問題,Fast R-CNN 借鑒了 SPP,這樣 CNN 就可以接受不同 size 的輸入,通過 RoI Pooling 層(簡化的 SPP 層)之後會變換到統一的 size,這樣最後輸入全連接配接層的 feature map 還是固定的 size。

另外一點就是上面提到了将 2k 個 region proposal 輸入 CNN 是非常不經濟的,而且沒有必要的,是以 Fast R-CNN 在通過 Selective Search 提取 region proposal 之後, 将整張圖檔輸入 CNN 得到 feature map,然後通過映射關系,找到原圖中的 region proposal 在 feature map 中的對應 patch,将此 patch 作為每個候選框的卷積特征輸入到 RoI Pooling layer 和之後的層,完成特征提取工作。這樣一來相當于 2K 的 region proposal 共享了 CNN 的權重。

下面來具體看下 Fast R-CNN 的完整過程:

  • 在 image classification 的資料集上預訓練模型,這裡的分類為 N 類
  • 利用 Selective Search 的方法,從輸入圖檔中得到大約 2k 的 region candidates(但是他們的 size 卻是各異)
  • 将預訓練模型中的 max pooling 換為 RoI Pooling layer;将最後的 fully connected layer 和 softmax layer(N 類)換為 fully connected layer 和 softmax layer(N+1 類)
  • 最後的模型分為兩個不同的分支:一個是 softmax 對于每一個 ROI 預測的 N+1 類的分類結果;另一個是對上面分類的 ROI 的 bounding box 的回歸結果。
    深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽

從上面的過程可以發現,之前 R-CNN 的處理流程是先提 proposal,然後 CNN 提取特征,之後用 SVM 分類器,最後再做 box regression,而在 Fast R-CNN 中,作者巧妙的把 box regression 放進了神經網絡内部,與 region 分類和并成為了一個multi-task 模型,實際實驗也證明,這兩個任務能夠共享卷積特征,并互相促進。這裡值得一提的是對于這個 multi-task 模型的 loss function 采用了multi-task loss。

經過這一頓猛操作,Fast RCNN(VGG16)相比 RCNN,在訓練速度上快了将近 9 倍,在測試速度上快了 213 倍。

4. Faster R-CNN

不管是 R-CNN 還是 Fast R-CNN 都是采用的 Selective Search 的方式找到的 region proposal,但是這種無監督的方式産生了大量的重疊區域,造成算力的浪費,在 Fast R-CNN 中 Selective Search 花費的時間是 特征提取的時間的 10 倍左右,但是如果減少 region proposal 的數量又可能導緻漏檢。顯然 Selective Search 已經限制了 Fast R-CNN 的發揮。

任少卿和何凱明等人于 2015 年提出了 Faster R-CNN,用 RPN(Region Proposal Nerworks)替代了 Selective Search,即利用神經網絡自己學習生成候選區域的政策,充分利用了 feature map 的價值。這樣一來就真正實作了檢測任務端到端,并且由于速度的提升,基本實作了實時檢測(17 FPS)。

從某種程度上來說,Faster R-CNN 就是在 Fast R-CNN 的基礎上加入了 RPN。

深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度學習目标檢測之 R-CNN 系列: 從 R-CNN 和 Fast R-CNN 到 Faster R-CNN 總覽

參考

  • Object Detection for Dummies Part 3: R-CNN Family
  • R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms
  • FasterRCNN之整體架構詳解
  • 深度學習之 Pytorch 物體檢測實戰(董洪義)

繼續閱讀