目標檢測之 R-CNN 系列綜述

機器視覺cv 發佈 2021-08-03T08:45:59.378228+00:00

上幾期我們講過目標檢測 One-Stage 的代表 YOLOv3 本來這一期是打算寫 SSD(One-Stage 的另一個代表) 的,發現 SSD 其中涉及的知識是從 R-CNN(Two-Stage)來的,故此。

上幾期我們講過目標檢測 One-Stage 的代表 YOLOv3 本來這一期是打算寫 SSD(One-Stage 的另一個代表) 的,發現 SSD 其中涉及的知識是從 R-CNN(Two-Stage)來的,故此。這一期我們就來理理 R-CNN 系列的部分知識點,同樣,我們會分為 理論、體驗和代碼實戰 三期來進行講解,今天就是理論部分。

在開始 R-CNN 系列之前,我們先引入幾個概念,有助於後面的理解

選擇性搜索( selective search )

作者:J. R. R. Uijlings 2012 提出的

在 Two-Stage 的目標檢測中,一般是分為兩個步驟,1) 先選取有可能存在目標的候選框,2) 然後對候選框進行預測,判斷是否是對應的類別。所以選擇性搜索乾的就是第一步:選取候選框。當然候選框的選取也有很多算法,比如滑窗等,建議讀者去看相應的資料。如下圖,選擇性搜索就是在輸入圖中找出可能存在目標的候選框,具體步驟如下:

首先通過將圖像進行過分割得到若干等區域組成區域的集合 S,這是一個初始化的集合;然後利用顏色、紋理、尺寸和空間交疊等特徵,計算區域集裡每個相鄰區域的相似度; 找出相似度最高的兩個區域,將其合併為新集並從區域集合中刪除原來的兩個子集。重複以上的疊代過程,直到最開始的集合 S 為空,得到了圖像的分割結果,得到候選的區域邊界,也就是初始框。

下圖就是上述過程的可視化,難怪有大佬會說,學目標檢測,應該先學分割,哈哈哈~

RoI Pooling

RoI Pooling 全稱就是 Region of Interesting Pooling,具體操作如下:

  1. 原始圖片經過特徵提取後得到 feature maps,將原圖上的 RoI (比如上面選擇性搜索得到的候選框)映射到 feature maps 上
  2. 將映射後的區域劃分為相同大小的 sections(sections 數量與輸出的維度相同)
  3. 對不同的 section 做 max pooling 操作

這樣我們就可以從不同大小的方框得到固定大小的相應 的 feature maps。值得一提的是,輸出的 feature maps 的大小不取決於 RoI 和卷積 feature maps 大小。RoI pooling 最大的好處就在於極大地提高了處理速度。 具體處理的方式如下動圖所示:以左上角坐標為 (1,1) ,假設原圖上的目標映射到 feature maps 是 (1, 4) ->(7, 8) 將這一塊區域經過劃分成不同的 section 做 max pooling 。

ROI pooling

下面就是 R-CNN 系列的相關知識了

R-CNN:Region-based Convolutional Neural Networks

設計理念

R-CNN 的設計流程如下:

R-CNN

  1. 通過 selective search 算法在輸入原圖中找出大約 2000 個框框(因為傳統的算法這一步產生了非常多的框,由於很多是無效的,所以導致計算資源浪費)
  2. 對找出的框框進行縮放操作(因為 CNN 網絡包含有全連接層,輸出的特徵圖尺寸需要一樣(論文中是 227×227),同時在論文中進行縮放之前會將邊框擴大 p=16 個像素),用預訓練模型(在 Imagenet 訓練的模型)進行特徵提取操作(得到 4096 維度的特徵),提取的特徵保存在磁碟中用於下一步驟。
  3. 用 20 個(類別數目) SVM (二分類)對每個框框進行類別判別,計算出得分
  4. 對每個類別的邊框做 NMS(非極大值抑制)操作,得到一些分數較高的框
  5. 分別用 20 個回歸器對上述 20 個類別中剩餘的建議框進行回歸操作,最終得到每個類別的修正後的得分最高的 bounding box。

關鍵設計點

  1. 目標區域提案縮放

由於特徵提取存在全連接層,故要將目標區域縮放到指定大小,在論文中,使用到了兩種縮放方案:

  • 各向異性縮放:比較粗暴的方法:直接 resize 到所需大小
  • 各向同性縮放:(1) 向外擴充至正方形 (2) 用固定的背景顏色填充

目標區域提案縮放


  1. 回歸框的設計

以下圖檢測貓為例,藍色的框是 selective search 提取出的 region proposal 經過評分以後得到的邊框,紅色的框是 ground truth。當圖中紅色的框被分類器識別為貓,但是由於藍色框的定位不准 (IoU<0.5),相當於沒有正確檢測出貓。所以為了使定位更準確,即使得 region proposal 更接近於 ground truth,我們可以對藍色的框進行微調,微調就需要使用 bounding box regression,具體思路如下:

假設下面紅色的框 P 是經過評分以後得到的某個類別的邊框,藍色的框是 ground truth ,為了使紅色的框去擬合藍色的框,我們需要找到一種映射關係,就是平移和縮放,公式如下

其中

代表偏移量,在訓練的過程,我們輸入的參數是

image

是 region proposal 所對應的 pool 5 層的特徵(R-CNN 使用的是 https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf 和 https://arxiv.org/abs/1409.1556 的 CNN 架構)


在測試時,根據變換關係進行轉換,這裡為什麼寬高縮放需要進行對數變換可以看文後的考題解答

R-CNN 優缺點

  • 優點
  • 使用 selective search 方法大大提高候選區域的篩選速度(對比傳統算法)。
  • 用在 ImageNet 數據集上進行學習的參數對神經網絡進行預處理,解決了在目標檢測訓練過程中標註數據不足的問題。
  • 使用 CNN 對 region proposals(候選框) 計算 feature vectors。從經驗驅動特徵(SIFT、HOG)到數據驅動特徵(CNN feature map),提高特徵對樣本的表示能力。
  • 通過線性回歸模型對邊框進行校準,減少圖像中的背景空白,得到更精確的定位
  • 缺點
  • R-CNN 存在冗餘計算, 因為 R-CNN 的方法是先生成候選區域,再對區域進行卷積,其中候選區域會有一定程度的重疊,造成後續 CNN 提取特徵時出現重複運算,同時,由於 R-CNN 是將提取的特徵存儲下來,然後用 SVM 進行分類,所以需要大的存儲空間
  • 由於使用的是 CNN 進行特徵提取,所以需要對候選框進行縮放操作,但實際情況是 selective search 方法選取的框有各種尺寸,所以會造成目標變形

效果

最終 R-CNN 的 mAP 是 58.5%

R-CNN 效果

SPP

SPP 是空間金字塔池化層(Spatial Pyramid Pooling,SPP)的簡稱。

paper https://arxiv.org/pdf/1406.4729.pdf

設計理念

上一節我們知道,R-CNN 有個缺陷:R-CNN 特徵提取的 CNN 網絡存在全連接層,所以輸入的大小必須經過 crop(裁剪)或者 warp (縮放),也就是下圖的第一個流程,SPP 的設計理念是在在提取特徵的過程中,在卷積層和全連接層之間加了一層空間金字塔池化層(Spatial Pyramid Pooling) 這一層的作用就是將輸入圖片經過卷積層提取以後得到的不同尺寸的特徵圖操作成一樣的尺寸,保證全連接層的有效輸入,如下圖的第二個流程。

SPP 的理念不僅可以用在目標檢測上面,同時也能用在圖像分類上面,當然我們這裡只講目標檢測方面的應用,不過設計理念是相通的,具體思路可以看原始論文。下面我們就來講講 SPP 的運算過程是怎麼樣的

SPP 其實就是一系列最大池化操作,那麼池化操作就必須有兩個參數,窗口的大小 win 和步長 stride,那麼這兩個是怎麼計算的呢?我們需要說明幾個變量的含義:

  • 金字塔層級的 bins 大小:n×n 。如下圖所示的三個正方形(n×n=4×4 藍色、n×n=2×2 綠色和 n×n=1×1 的灰色正方形)
  • conv5 提取的 feature maps 的大小是 a×a(下圖那塊黑色的東東,a 代表是可以任意值)

我們就以 a×a=13×13 為例來計算 win 的大小和 stride 的大小。win = a/n 向上取整,stride=a/n 向下取整,如 n=4 時 win = 13/4=3.25 向上取整就是 4,stride=13/4=3.25 向下取整就是 3。當 n=2 和 n=1 時計算也是類似。當不同 level 的池化計算結束後,就將其展開成一個向量,如這裡的 4×4=16、2×2=4、1×1=1 並將其合併成一個長向量,得到的是一個 21 維度的向量,然後輸入後續的全連接層。

在論文中還有張表,不過這裡和上面有點不同的是這裡第一個 pool 大小是 3×3 的,不過這是不影響的,這其中也可以說明的是,我們可以自行設計 pool 的 level 個數以及 pool 的大小,這其中存在很多人為設計的因素。

3 level 的 SPP 架構

效果

SPP 用在分類的精度比較如下所示:

是否使用 SPP 在分類上的精度比較

SPP 用在目標檢測上的精度比較如下所示:

SPP 在目標檢測上的精度比較

綜上可以看出 SPP 的使用雖然在目標檢測取得了和 R-CNN 差不多的效果,但是,對於模型來說,使其可以接受更多尺度的輸入,其速度也比較 R-CNN 快 24-102 倍

優缺點

  1. 創新點:計算整幅圖像的 the shared feature map,然後根據 object proposal 在 shared feature map 上映射到對應的 feature vector(就是不用重複計算 feature map 了)。
  2. 缺點:和 R-CNN 一樣,訓練是多階段(multiple-stage pipeline)的,速度還是不夠 "快",特徵還要保存到本地磁碟中。

Fast R-CNN

paper: https://arxiv.org/abs/1504.08083

Fast R-CNN 是基於 R-CNN 和 SPPnets 進行的改進。有些理念是相似的,這裡就不在贅述。

設計理念

Fast R-CNN achitecture

從上面我們知道 R-CNN 有計算冗餘的缺陷,我們能不能只需一步就將特徵提取出來,而不是根據候選框來提取特徵,並且不需要進行特徵的保存,Fast R-CNN 就是為這樣而設計的(借鑑了 SPP 的思想)

  1. 對圖片輸入進行特徵提取,得到特徵圖(整個提取的過程就這一步)
  2. 也是根據 selective search 算法提取候選框,然後得到的候選框映射到上面提取的特徵圖上(這裡面涉及的知識點也很多,即映射的關係計算,需要再深入理解)
  3. 由於每個候選框的大小不一樣,使用 RoI Pooling 操作,得到固定的維度特徵,通過兩個全連接層,分別使用 softmax 和回歸模型進行檢測

創新點

  1. 實現了一次卷積處處可用,類似於積分圖的思想,從而大大降低了計算量。
  2. 用 RoI pooling 層替換最後一層的 max pooling 層,同時引入建議框數據,提取相應建議框特徵
  3. 同時它的訓練和測試不再分多步,不再需要額外的硬碟來存儲中間層的特徵,梯度也能夠通過 RoI Pooling 層直接傳播。Fast R-CNN 還使用 SVD 分解全連接層的參數矩陣,壓縮為兩個規模小很多的全連接層。

效果

  1. 在 VOC07, 2010, and 2012 三個數據集達到了當時最好的 mAP
  2. 比 R-CNN, SPPnet 更快的訓練和測試速度
  3. 微調 VGG16 的卷積層提升 mAP

Fast R-CNN 實驗效果

Faster R-CNN

paper: https://arxiv.org/abs/1506.01497

設計理念

R-CNN,SPPNet,Fast R-CNN 都沒有解決一個問題,就是 selective search 方法低效率的滑動窗口選擇問題,它仍然生成了大量無效區域,多了造成算力的浪費,少了則導致漏檢。

Faster R-CNN 採用與 Fast R-CNN 相同的設計,只是它用內部深層網絡代替了候選區域方法。新的候選區域網絡(RPN)在生成 ROI 時效率更高

Faster R-CNN 是深度學習中的 two-stage 方法的奠基性工作,提出的 RPN 網絡取代 Selective Search 算法後使得檢測任務可以由神經網絡端到端地完成。

下面就看看 RPN 的原理是怎麼樣的:

以一張任意大小的圖片作為輸入,輸出一批矩形區域的提名,每一個區域都會對應目標的分數和位置信息。實際上就是在最終的卷積特徵層上,在每個點利用滑窗生成 k 個不同的矩形框來提取區域,k 一般取為 9。

K 個不同的矩形框被稱為 anchor,具有不同尺度和比例。用分類器來判斷 anchor 覆蓋的圖像是前景還是背景。對於每一個 anchor,還需要使用一個回歸模型來回歸框的精細位置。

Faster R-CNN 的主要步驟如下:

  • 特徵提取:與 Fast R-CNN 相同,Faster R-CNN 把整張圖片輸入神經網絡中,利用 CNN 處理圖片得到 feature map;
  • 區域提名:在上一步驟得到的 feature map 上學習 proposal 的提取;
  • 分類與回歸:對每個 Anchor Box 對應的區域進行二分類,判斷這個區域內是否有物體,然後對候選框位置和大小進行微調,分類。 Faster R-CNN 中 RPN 的結構如下:

RPN

Faster R-CNN 架構

Faster R-CNN 網絡

創新

  • 與 selective search 方法相比,RPN 網絡將候選區域的選擇從圖像中移到了 feature map 中,因為 feature map 的大小遠遠小於原始的圖像,此時的滑動窗口的計算量呈數量級的降低。
  • 並且 RPNs 和 RoI Pooling 還共用了基礎的網絡,更是大大地減少了參數量和預測時間。
  • 由於是在特徵空間進行候選框生成,可以學到更加高層語義的抽象特徵,生成的候選區域的可靠程度也得到了大大提高。

考題

(1) rcnn 框架中需要幾個 svm 模型?幾個邊框回歸模型?

有多少個類別就需要多少個 svm 模型,多少個回歸模型

(2) rcnn 框架中邊框回歸為什麼要做對數變換?使用時有哪些注意事項?

縮放的大小必須大於 0,約束到對數空間方便訓練優化

(3) rcnn 框架中 nms 是每一類單獨進行還是所有框一起進行?

對每一類單獨進行 NMS 操作

(4) rcnn 框架中正負樣本如何定義的?為什麼 finetune cnn 和訓練 svm 時不同?

rcnn 中候選區與 ground truth 的 iou 大於等於 0.5 為正樣本,小於 0.5 為負樣本。svm 中全部包含了目標體為正樣本,iou 小於 0.3 為負樣本。finetune 時的正負樣本定義是為了增加樣本數量,因為 cnn 對小樣本容易過擬合,所以需要大量樣本訓練。svm 是為了提高精度。

(5) rcnn 框架中如何進行難負樣本挖掘的?

訓練 SVM 時,負樣本遠遠大於正樣本,因此,對每個候選區,只有和 ground truth 的 IoU 小於 0.3 的時候,才為負樣本。

(6) Fast rcnn 與 SPPnet 的異同點?

  • 相同
  • 都是使用選擇性搜索來得到候選框
  • 都只是在原圖上提取一次特徵
  • 不同
  • SPPnet 使用的是金字塔結構來解決全連接層輸入問題,Fast R-CNN 使用的是 RoI Pooling 解決全連接層輸入問題
  • SPPnet 還是需要分步驟訓練,且需要額外的空間

(7) fast rcnn 框架中正負樣本如何定義?

Fast-rcnn 中當候選區與一個 gt 的 iou 大於 0.5 時為正樣本,與所有的 gt 的 iou 小於 0.5 時為負樣本。

(8) faster rcnn 中 rpn 中使用了多少個回歸器?

Faster rcnn 中使用了 9 個回歸器,不同尺度長寬比的 ancher 分別對應一個回歸器。

(9) faster rcnn 中 rpn 中使用了怎樣的正負樣本策略?

Faster rcnn 中 iou 大於 0.7 或者與一個 gt 的 iou 最大的 anchor 為正樣本,iou 小於 0.3 的 anchor 為負樣本。

(10) faster rcnn 中 rpn 和 fast rcnn 是如何訓練的?

三種策略,參考 https://zhuanlan.zhihu.com/p/24916624 和論文和代碼

紙上得來終覺淺,絕知此事要 coding ~~~~~

參考

  • https://zhuanlan.zhihu.com/p/31426458 一文讀懂 Faster RCNN 建議看看,大佬寫得非常好,強烈推薦
  • https://zhuanlan.zhihu.com/p/24916624 Faster R-CNN
  • https://zhuanlan.zhihu.com/p/32404424 從編程實現角度學習 Faster R-CNN(附極簡實現)
  • https://www.learnopencv.com/selective-search-for-object-detection-cpp-python/ 選擇性搜索參考 [1]
  • https://blog.csdn.net/yuanlulu/article/details/82157071 選擇性搜索參考 [2]
  • https://blog.deepsense.ai/region-of-interest-pooling-explained/ RoI Pooling 參考 [1]
  • https://zhuanlan.zhihu.com/p/73654026 RoI Pooling 參考 [2]
  • https://zhuanlan.zhihu.com/p/27485018 SPP 參考
  • https://zhuanlan.zhihu.com/p/60794316 回歸框設計參考
  • https://blog.csdn.net/zijin0802034/article/details/77685438 邊框回歸參考
  • https://mp.weixin.qq.com/s/6DuOc2tJg-vgSMiqKRqnlA 有三 AI:一文道盡 R-CNN 系列目標檢測
  • https://mp.weixin.qq.com/s/Bnibfng4Sv6qbMk5BEFwnQ 有三 AI:萬字長文詳解 Faster RCNN 原始碼
  • [http://noahsnail.com/2018/01/03/2018-01-03-Faster%20R-CNN% E8% AE% BA% E6%96%87% E7% BF% BB% E8% AF%91% E2%80%94% E2%80%94% E4% B8% AD% E8%8B% B1% E6%96%87% E5% AF% B9% E7%85% A7/](http://noahsnail.com/2018/01/03/2018-01-03-Faster R-CNN 論文翻譯 —— 中英文對照 /) Faster R-CNN 論文翻譯
  • https://zhuanlan.zhihu.com/p/69250914?utm_source=wechat_session&utm_medium=social&utm_oi=1010668791688228864 目標檢測 ——Faster RCNN 簡介與代碼注釋
  • https://github.com/scutan90/DeepLearning-500-questions/

幾個代碼倉庫:

  • https://github.com/chenyuntc/simple-faster-rcnn-pytorch
  • https://github.com/ruotianluo/pytorch-faster-rcnn
  • https://github.com/ShaoqingRen/faster_rcnn
  • https://github.com/jwyang/faster-rcnn.pytorch
  • https://github.com/open-mmlab/mmdetection
關鍵字: