物體檢測丨從R-CNN到Mask R-CNN

這篇blog是我剛入目標檢測方向,導師發給個人文獻導讀,深刻淺出總結了object detection two-stage流派Faster R-CNN的發展史,讀起來很是有趣。我一直想翻譯這篇博客,在知乎上發現已經有人作過了,並且翻譯的很好,我將其轉載到這裏。ios

這裏貼一下我對R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN的對比,看完下面的文章後不妨回來看看個人總結,有問題的地方歡迎討論。git

1558765925848

如下內容轉載自CNN圖像分割簡史:從R-CNN到Mask R-CNN(譯)github

原文A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN算法

Athelas中能夠看到,卷積神經網絡(Convolutional Neural Networks,CNNs)應用很是普遍,不只僅是用於解決分類問題。這篇博文主要介紹如何利用CNNs進行圖像實例分割。網絡

自從Alex Krizhevsky, Geoff Hinton, and Ilya Sutskever贏得ImageNet 2012,CNNs開始成爲圖像分類任務中的黃金準則。事實上,CNNs以後不斷提高ImageNet比賽中的圖像分類精度,甚至超過了人類的水準。架構

img

圖1 在ImageNet挑戰中,CNNs當前已經達到優於人類的水平,上圖中Y軸表示ImageNet的錯誤率。

雖然分類結果很是驚人,但圖像分類任務相對於人類視覺理解任務的複雜性和多樣性來講是很是簡單的。app

img

圖2 分類任務中的圖像示例,通常圖像構圖完整且只包含一個物體

圖像分類任務中的一張圖像通常只關注一個目標,從而預測圖像是什麼(如圖2所示)。可是咱們在觀察周圍世界時要完成很是複雜的事情。ide

img

圖3 現實生活中的場景通常包含各類各樣相互重疊的不一樣目標、背景和動做

現實世界中的複雜場景通常存在相互重疊的目標和不一樣背景,咱們在觀察時不只可以分辨不一樣的目標,並且能夠識別不一樣目標的邊界、差別以及他們之間的(空間)關係。性能

img

圖4 圖像分割任務的目標是對圖像中的不一樣物體進行分類,並識別其邊界。(源於:[1703.06870] Mask R-CNN)

CNNs是否能夠幫助咱們完成如此複雜的任務?也就是說,給定一張複雜的圖像,咱們是否能夠利用CNNs識別圖像中的不一樣目標以及他們的邊界呢?Ross Girshick和他的同事近幾年的研究代表,答案是固然能夠!測試

本文目標

本博文涵蓋目標檢測和分割中所用主要技術背後的知識,以及這些技術的演化過程,特別是R-CNN(Regional CNN)(CNNs最初應用於檢測和分割問題的方法)及其派生Fast R-CNN和Faster R-CNN,最後咱們會講述Facebook Research最新提出的Mask R-CNN,對這類目標檢測問題擴展到像素級圖像分割。本博文中引用的論文以下:

  1. R-CNN: [1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation
  2. Fast R-CNN: [1504.08083] Fast R-CNN
  3. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  4. Mask R-CNN: [1703.06870] Mask R-CNN

2014: R-CNN - An Early Application of CNNs to Object Detection

img

圖5 目標檢測算法(如R-CNN)識別圖像中主要物體的位置和類別

受Toronto大學Hinton實驗室研究成果的啓發,UC Berkeley大學Jitendra Malik教授的團隊提出當今看來不可避免的問題:

Krizhevsky等的研究成果如何才能擴展到目標檢測?

目標檢測任務從圖像中找到不一樣的物體並對其進行分類(如圖5所示)。Ross Girshick (a name we’ll see again)、Jeff Donahue和Trevor Darrel團隊發現目標檢測問題能夠藉助於Krizhevsky的成果並在PASCAL VOC數據集(ImageNet挑戰中的目標檢測數據集)中進行測試,文中提到:

這篇論文首次代表了在PASCAL VOC數據集上的目標檢測任務中,CNNs可以得到比傳統特徵(如HOG特徵等)好不少的性能。

接下來咱們一塊兒理解一下Regions CNNs(R-CNN)工做的架構。

理解R-CNN

R-CNN的目標是從圖像中正確識別出主要的物體(採用bounding box進行標註):

  • 輸入:圖像
  • 輸出:圖像中每一個物體的Bounding Box+標籤

如何找出這些bounding box呢?R-CNN採用咱們直覺上認爲的方式:給出一堆圖像可能的box,而後判斷這些box是否和物體相關

img

圖6 Selective Search方法採用不一樣尺寸的窗口進行滑動,並查找那些相近紋理、顏色或亮度的相鄰像素。(源於:https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf)

R-CNN採用Selective Search的方法給出region proposals。從高層理解,Selective Search經過不一樣尺寸的窗口在圖像中進行滑動(如圖6所示),對於每一個尺寸方法採用紋理、顏色或亮度對鄰近的像素進行聚合,從而識別物體。

img

圖7 獲取region proposals集合以後,R-CNN採用AlexNet的修改版本判斷這些region proposals是不是有效的region。(源於:[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation)

得到region proposals集合以後,R-CNN將這些區域變換爲標準的方形尺寸,並採用AlexNet的修改版本判斷其是不是有效region(如圖7所示)。

在CNN的最後一層,R-CNN增長了一個簡單的分類器Support Vector Machine(SVM),用於判斷區域是不是物體,以及物體的類別。

精化Bounding Box

如今已經找到Box中的物體,接下來是否能夠tighten bounding box(進一步調整物體邊界,使其更貼近物體周圍),從而獲取物體的真實範圍呢?固然,這也是R-CNN的最後一步,R-CNN對region proposals進行簡單的線性迴歸,從而生成tighten以後的Bounding Box作爲最終結果。迴歸模型的輸入和輸出以下:

  • 輸入:物體在圖像中的sub-regions
  • 輸出:sub-resions中物體的新Bounding Box座標

總結一下,R-CNN的步驟以下:

  1. 生成regions proposals集合做爲Bounding Box;
  2. 採用預訓練的AlexNet+SVM判斷Bouding Box對應圖像的物體類型;
  3. 對已分類物體的Bounding Box進行線性迴歸,輸出Box對應的tighter bounding boxes。

2015: Fast R-CNN - Speeding up and Simplifying R-CNN

R-CNN效果很是好,可是效率過低了,主要的緣由:

  1. 對於每張圖像的每一個region proposal都須要進行前向的CNN(AlexNet)計算,大概每張圖像須要2000次的前向CNN;
  2. 方法中的三個模型是分別訓練的——CNN提取圖像特徵、分類器預測類別、迴歸模型tighten bounding box的邊界,這也致使流程不易訓練。

2015年,R-CNN的做者Ross Girshick解決了上述兩個問題,並提出了Fast R-CNN的算法,接下來介紹一下Fast R-CNN。

RoI(Region of Interest)Pooling

Ross Girshick發現,每張圖像的proposed regions老是樸素重疊的,從而致使重複的CNN前向計算(可能達到2000次)。他的想法很是簡單——爲何不每張圖像計算一次CNN,爲2000個proposed regions找到一種計算共享的方法

img

圖8 在RoIPool方法中,採用一次CNN前向計算提取整幅圖像的特徵圖,圖像中每一個region的特徵則從上述特徵圖中提取。(源於:Stanford’s CS231N slides by Fei Fei Li, Andrei Karpathy, and Justin Johnson)

Fast R-CNN採用RoIPool(Region of Interest Pooling)解決此問題。做爲方法的核心,RoIPool分享整幅圖像的CNN前向計算給不一樣的regions。如圖8所示,特別注意每一個區域的CNN特徵如何從CNN的特徵圖像中選擇對應區域特徵的。接下來對每一個區域的特徵進行pool操做(通常採用max pooling)。這樣的話咱們只須要一次原始圖像的CNN前向計算,而非R-CNN中的2000次!

Combine All Models into One Network

img

圖9 Fast R-CNN將CNN、分類器和邊界線性迴歸融合到一個單獨的網絡中。(源於:https://www.slideshare.net/simplyinsimple/detection-52781995)

Fast R-CNN第二個想法是將CNN、分類和邊界線性迴歸的訓練融合到一個單獨的網絡中。不像R-CNN中的特徵提取(CNN)、分類(SVM)和邊界tighten(迴歸)分別採用三個不一樣的模型,Fast R-CNN採用一個單獨網絡實現上述三個步驟。

圖9展現了具體融合的過程,Fast R-CNN採用softmax layer取代了SVM分類器做爲CNN網絡的類別輸出層,方法增長了一個平行於softmax layer的linear regression layer做爲網絡的邊界座標輸出層,這樣全部的輸出須要來自於同一個網絡!整個模型的輸入和輸出以下:

  • 輸入:圖像以及region proposals
  • 輸出:每一個區域對應物體的類別以及物體的tighter bounding boxes

2016: Faster R-CNN - Speeding Up Region Proposal

通過上述的改進,Fast R-CNN仍然存在一個瓶頸——region proposer。目標檢測方法的第一步就是生成用於測試的潛在bouding box集合或者regions of interest,Fast R-CNN中採用的Selective Search速度很是慢,這也是限制整個算法效率的主要瓶頸。

2015年中,微軟的研究團隊(Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun)提出一種Faster R-CNN的方法,使得region proposal很是高效。

Faster R-CNN的想法來源於region proposals的特徵計算依賴於圖像的特徵(採用CNN一次性計算整幅圖像的特徵),那麼爲什麼不重用這些相同的CNN特徵進行region proposals,從而取代單獨的selective search算法呢

img

圖10 Faster R-CNN方法中採用一個單獨的CNN進行region proposals和分類。(源於:Towards Real-Time Object Detection with Region Proposal Networks)

實際上,這就是Faster R-CNN方法的核心。圖10描述了單獨CNN完成region proposals和分類的過程。這樣只須要訓練一個CNN,region proposals的計算基本能夠忽略。文中描述:

咱們發現用於檢測區域的卷積特徵圖(相似於Fast R-CNN)一樣能夠用來生成region proposals(所以使得region proposals變得絕不費力)。

模型的輸入和輸出以下:

  • 輸入:圖像(不須要region proposals)
  • 輸出:圖像中物體的類別及其對應的bounding box座標

How the Regions are Generated

接下來討論一下Faster R-CNN如何從CNN特徵圖中生成region proposals。Faster R-CNN在CNN特徵的上層增長了一個全卷積網絡,即Region Proposal Network.

img

圖11 Region Proposal Network在CNN的特徵圖上進行滑動窗口操做,對於每一個窗口的位置,網絡會對每一個anchor(候選區域)輸出分數和bounding box(共4*k個box座標,k是anchor的個數)。(源於:Towards Real-Time Object Detection with Region Proposal Networks)

Region Proposal Network在CNN特徵圖上進行滑動窗口操做,而後每一個窗口,輸出k個潛在的bounding box和分數,k個boxes如何選擇和表達呢?

img

圖12 通常行人的bouding box趨向於豎直長方形,據此咱們能夠構建這樣維度的anchor,從而Region Proposal Network的先驗知識。(源於:[CSE 6367 - Assignments - Assignment 1])

直覺上,咱們會認爲圖像中的物體應該符合必定的大小和長寬比,好比行人的形狀更多是長方形的box。相似地,咱們通常也不會關注那些很是窄的boxes。據此,咱們構建了k個這樣的common aspect ratios,並稱做anchor boxes。每一個anchor box輸出bounding box和對應的位置圖像的分數。

考慮這些anchor boxes,Region Proposal Network的輸入和輸出以下:

  • 輸入:CNN特徵圖
  • 輸出:每一個anchor對應的bounding box以及分數(表示bounding box中對應圖像部分是物體的可能性)

而後,將Region Proposal Network中輸出的目標可能bounding box輸入到Fast R-CNN,並生成類別和tightened bounding box。

2017: Mask R-CNN - Extending Faster R-CNN for Pixel Level Segmentation

img

圖13 圖像實例分割的目標是識別場景中像素級的物體。(源於:[1703.06870] Mask R-CNN])

到這裏咱們已經能夠利用CNN特徵快速定位圖像中不一樣目標的bounding boxes了,那麼接下來是否能夠繼續延伸一下,提取像素級的目標實例而不是僅僅給出bounding boxes呢?這就是經典的圖像分割問題,Kaiming He和他的團隊(包括Girshick)在Facebook AI實驗室中採用的架構,Mask R-CNN。

相似於Fast R-CNN和Faster R-CNN,Mask R-CNN的潛在創意來源也是很直接的,鑑於Faster R-CNN在目標檢測中的效果,咱們是否能夠將其擴展到像素級的圖像分割中呢?

img

圖14 Mask R-CNN在Faster R-CNN的CNN特徵提取層的上層增長一個全卷積網絡(Fully Convolutional Network,FCN)用於生成mask(分割輸出結果)。(源於:[1703.06870] Mask R-CNN)

Maks R-CNN在Faster R-CNN的基礎上增長一個分支,用於輸出一個二值掩膜(Binary Mask),判斷給定像素是否屬於物體。上述分支(圖14中的白色部分)就是一個置於CNN特徵圖上層的全卷積神經網絡。模型的輸入和輸出以下:

  • 輸入:CNN特徵圖
  • 輸出:指示像素是否屬於物體的二值矩陣

可是Mask R-CNN的做者作了少許調整使得整個網絡輸出指望的結果。

RoiAlign - Realigning RoIPool to be More Accurate

img

圖15 採用RoIAlign取代RoIPool對圖像進行遍歷,從而使得RoIPool選擇區域的特徵圖與原始圖像對應更加精確,主要緣由是像素級的分割比bounding box須要更加精確的對齊。(源於:[1703.06870] Mask R-CNN)

直接採用Faster R-CNN的架構執行Mask R-CNN可能致使RoIPool選擇區域的特徵圖與原始圖像區域存在少許的偏離。因爲圖像分割須要像素級的標記,所以這樣天然會致使精度降低。

Mask R-CNN採用RoIAlign的方法對RoIPool進行調整使其更精確對齊。

img

圖16 如何將region of interest的原始圖像和特徵圖精確對齊?

假設有一幅128*128大小的圖像,對應的特徵圖大小爲25*25,若是要將原始圖像左上角15*15大小的像素映射到特徵圖中(如圖16所示),如何從特徵圖中選擇像素呢?顯然原始圖像中每一個像素對應特徵圖中的25*128個像素,要選擇原始圖像中的15個像素,須要選擇15*25/128=2.93個像素。

在RoIPool中,咱們會四捨五入選擇3個像素,從而會致使微小的偏移。在RoIAlign中,咱們要避免這樣的近似。取而代之的是採用bilinear interpolation獲取精確的對應值,即選擇像素2.93,從而可以避免RoIPool致使的偏移。

生成這些mask以後,Mask R-CNN結合Faster R-CNN中生成的分類和bounding box,生成精確的分割結果。

img

圖17 Mask R-CNN可以分割圖像並對圖像中的物體進行分類。(源於:[1703.06870] Mask R-CNN)

源碼

若是你想本身試驗一下這些算法,這裏是相關的源碼庫:

Faster R-CNN

Mask R-CNN

相關文章
相關標籤/搜索