2017-ICCV-Mask R-CNN

本週組會講Mask R-CNN,藉此機會把目標檢測R-CNN系列的論文都整理了一遍,除了paper外,主要參考網上的一些博客,如有侵權,請告知,在此十分感謝。

文中如有錯誤,請積極指出,一起學習,共同進步。

相關論文鏈接:

R-CNNSPP NetFast R-CNNFaster R-CNNMask R-CNN

YOLOSSD

FCNFPNMNCFCIS

關於YOLO可參考本人另一篇博客2016-CVPR-YOLO

github代碼:

pytorch-faster-rcnn

tensorflow-mask-rcnn

Introduction

Ross Girshick大神:
從DPM,R-CNN,fast R-CNN,faster R-CNN,到mask R-CNN,壟斷object detection近10年。

Kaiming He大神:
ResNet系列基本搞定了Image classification。

現在兩人聯手,開始攻克Instance Segmentation。

Mask R-CNN在不加任何 trick 的情況下超過各種數據增強加持下的 COCO 2016 分割挑戰的冠軍 FCIS。

Mask R-CNN ICCV 2017 best paper

Scene understanding

這裏寫圖片描述

Image classification:圖像分類,識別出圖中的物體類別

Object detection:目標檢測,既要識別出圖中的物體,又要知道物體的位置,即圖像分類+定位

Semantic segmentation:語義分割,除了識別物體類別與位置外,還要標註每個目標的邊界,但不區分同類物體,將物體進行像素級別的分割提取

Instance segmentation:實例分割,除了識別物體類別與位置外,還要標註每個目標的邊界,且區分同類物體,將物體進行像素級別的分割提取

Mask R-CNN: Motivation and goals

Mask R-CNN的三個目標:

  1. 視覺場景理解的多任務模型的狀態: 同時滿足目標檢測、分類及實例分割的要求
  2. 高度模塊化,訓練簡單,相對於Faster R-CNN僅增加一個小的overhead,可以跑到5FPS
  3. 可以方便的擴展到其他任務,比如人體姿態估計等

R-CNN

這裏寫圖片描述

步驟:

  1. 訓練(或下載)一個分類模型(比如AlexNet)
  2. 對模型進行fine-tuning:
    1. 將分類數1000改爲21(有一個類別是背景)
    2. 去掉最後一個全連接層
  3. 特徵提取:
    1. 利用selective search算法在圖像中從上到下提取約2k個候選區域
    2. 將每個候選區域wrap成224224 的大小以適合CNN的輸入,做一次前向傳播,將CNN的fc7層的輸出作爲特徵,保存到硬盤
  4. 訓練一個SVM分類器來判斷這個候選框裏物體的類別,每個類別對應一個SVM,判斷是否屬於這個類別,是就是positive,反之就是nagative
  5. 使用SVM分好類的候選區域做邊框迴歸,用bounding box 迴歸值校正

該方法在VOC 2011 test數據集上取得了71.8%的檢測精度。

Selective search:

這個策略藉助了層次聚類的思想,應用到區域的合併上面。

  1. 假設現在圖像上有n個預分割的區域(Efficient Gragh-Based Image Segment),表示爲R=R1,R2,,Rn
  2. 計算每個region與它相鄰region的相似度,這樣會得到一個nn 的相似度矩陣(同一個區域之間和不相鄰區域之間的相似度可設爲NaN),從矩陣中找出最大相似度值對應的兩個區域,將這兩個區域合二爲一,這時圖像上還剩下n-1個區域
  3. 重複上述過程(只需計算新的區域與它相鄰區域的新相似度,其他的不用重複計算),重複一次,區域的總數目就少1,直到最後所有的區域都合併成爲了同一個區域

img

缺點:

  1. 訓練和測試過程分爲多個階段,步驟繁瑣:微調網絡,得到候選區域,CNN提取特徵,SVM分類,SVM邊界框迴歸
  2. 訓練耗時,佔用磁盤空間大,5000張圖像產生幾百G的特徵文件
  3. 測試過程中,每一個候選區域都要提取一遍特徵,這些區域有一定重疊度,各個區域的特徵提取獨立計算,效率不高,使測試一幅圖像非常慢
  4. SVM和迴歸是事後操作,在SVM和迴歸過程中CNN特徵沒有被學習更新

因此,把R-CNN的缺點改掉,就成了Fast R-CNN。

Fast R-CNN

這裏寫圖片描述
Fast R-CNN在R-CNN的基礎上採納了SPP Net方法,對R-CNN作了改進。使用VGG-19網絡架構比R-CNN在訓練和測試時分別快了9倍和213倍。

步驟:

  1. 輸入測試圖像
  2. 利用selective search算法在圖像上從上到下提取約2k個候選區域
  3. 將整張圖片輸入CNN,進行特徵提取,得到feature map
  4. 把候選區域映射到CNN的最後一層卷積feature map上
  5. 通過RoI pooling層使每個候選區域生成固定尺寸的feature map
  6. 利用Softmax loss(探測分類概率)和Smooth L1 Loss(探測邊框迴歸)對分類概率和邊框迴歸(Bounding box regression)聯合訓練

相比R-CNN,兩處改進:

  1. CNN最後一層卷積層後加了一個RoI pooling層,可以看做單層SPP Net的網絡層,可以把不同大小的輸入映射到一個固定尺寸的特徵向量。
  2. 在R-CNN中是先用SVM分類器,再做bbox regression,而在Fast R-CNN中,損失函數使用了multi-task loss,將bbox regression直接加入到CNN網絡中訓練,並且實驗證明這兩個任務能夠共享卷積特徵,相互促進。

Faster R-CNN

這裏寫圖片描述
步驟:

  1. 輸入測試圖像
  2. 將整張圖片輸入CNN,進行特徵提取
  3. RPN生成候選區域,每張圖片生成300個候選區域
  4. 把候選區域映射到CNN的最後一層卷積feature map上
  5. 通過RoI pooling層使每個RoI生成固定尺寸的feature map
  6. 利用Softmax loss(探測分類概率)和Smooth L1 Loss(探測邊框迴歸)對分類概率和邊框迴歸(Bounding box regression)聯合訓練

相比Fast R-CNN,兩處改進:

  1. 使用RPN(Region Proposal Network)代替原來的Selective Search方法產生候選區域,使得檢測速度大幅提高
  2. 產生候選區域的CNN和目標檢測的CNN共享,候選區域的質量也有本質的提高

Mask R-CNN

這裏寫圖片描述

Mask R-CNN實際上就是Faster R-CNN + Mask branch,RoIAlign的結果。

相比Faster R-CNN,兩處改進:

  1. 把Faster R-CNN裏的RoIPool layer改爲RoIAlign layer
  2. 最後多了一個mask branch

RPN

這裏寫圖片描述
RPN是一個全卷積網絡,由於沒有全連接層,所以可以輸入任意分辨率的圖像,經過網絡後就得到一個feature map,然後利用這個feature map得到物體的位置和類別。

那麼,怎麼利用這個feature map得到物體的位置和類別呢?

在conv5-3的卷積feature map上用一個nn(n=3) 的滑動窗口(sliding window)生成一個256維(ZFNet)或512維(VGGNet)長度的全連接特徵,然後在這個特徵後產生兩個分支的全連接層:

  1. Reg-layer,用於預測proposal的中心錨點對應的proposal的座標x,y和寬高w,h
  2. cls-layer,用於判定該proposal是前景還是背景

Anchor:

  1. 把得到的feature map上的每一個點映射回原圖,得到原圖上這些點的座標
  2. 在這些點周圍取一些提前設定好的區域用來訓練RPN,這些區域就叫做Anchor boxes

anchor(錨點),位於nn 的滑動窗口的中心處,對於一個滑動窗口,可以同時預測k個候選區域,即k個anchor boxes,每個anchor box可以用一個scale,一個aspect_ratio和滑動窗口中的anchor唯一確定。論文中定義k=9,即3種scales(比如1282,2562,5122 )和3種aspect_ratio(比如1:1,1:2,2:1 )確定出當前滑動窗口處對應的9個anchor boxes,2k 個cls-layer的輸出和4k 個reg-layer的輸出。對於一幅WH 的feature map,對應WHk 個anchor boxes。所有的anchors都具有尺度不變性。

IoU:

在計算Loss值之前,作者設置了anchors的標定規則:

  1. 如果anchor對應的anchor box與ground truth的IoU最大,標記爲正樣本
  2. 如果anchor對應的anchor box與ground truth的IoU>0.7,標記爲正樣本
  3. 如果anchor對應的anchor box與ground truth的IoU<0.3,標記爲負樣本
  4. 剩下的既不是正樣本也不是負樣本,不用於最終訓練
  5. 訓練RPN的Loss是由classification loss(即softmax loss)和regression loss(即L1 loss)按一定比重組成的

Loss functions:

計算softmax loss需要的是anchors對應的groudtruth標定結果和預測結果,計算regression loss需要三組信息:

  1. 預測框proposal region:即RPN網絡預測出的proposal的中心位置座標x,y和寬高w,h
  2. Anchor box:1個anchor對應9個不同的scale和aspect_ratio的anchor boxes,每一個box都有一箇中心點位置座標xa,ya 和寬高wa,ha
  3. Ground truth:標定的框也對應一箇中心點位置座標x,y 和寬高w,h

因此,計算regression loss和總loss算法如下:

tx=(xxa)/wa,ty=(yya)/hatw=log(w/wa),th=log(h/ha)tx=(xxa)/wa,ty=(yya)/hatw=log(w/wa),th=log(h/ha)L({pi},{ti})=1NclsiLcls(pi,pi)+λ1NregipiLreg(ti,ti)

RPN訓練設置:
  1. 在訓練RPN時,一個mini-batch是由一幅圖像中任意選取的256個proposal組成的,其中正負樣本的比例爲1:1
  2. 如果正樣本不足128,則多用一些負樣本以滿足256個proposal可以用於訓練,反之亦然
  3. 訓練RPN時,與VGG共有的層參數可以直接拷貝經ImageNet訓練得到的模型中的參數;剩下沒有的層參數用標準差=0.01的高斯分佈初始化

缺點:

RPN關鍵在於選取了一些anchor進行pixel-wise的學習,但問題就是對小物體的檢測效果很差,假設輸入爲512512 ,經過網絡後得到的feature map是3232 ,那麼每一個feature map上的一個點都要負責周圍至少是1616 的一個區域的特徵表達,那對於在原圖上很小的物體它的特徵就難以得到充分的表示,因此檢測效果比較差。

RoIPool(Fast R-CNN)

在Fast R-CNN和Faster R-CNN中用到的RoI pooling層,其實是借鑑了SPP Net中的思想,所以在介紹RoIPool前,先了解一下SPP Net。

SPP Net:(Spatial Pyramid Pooling,空間金字塔池化)

  1. 結合空間金字塔方法實現CNNs的多尺度輸入:

    R-CNN提取候選框後需要進行crop和wrap來修正尺寸,這樣會造成數據的丟失或幾何的失真。SPP Net將金字塔思想加入到CNN,在卷積層和全連接層之間加入SPP layer,SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。

    img

    如果原圖輸入是224224 ,對於conv5出來後的輸出,是1313256 ,即256個filter,每個filter對應一張1313 的activation map。如果像上圖那樣將activate map pooling成44,22,11 三張子圖,做max pooling後,出來的特徵就是固定長度的(16+4+1)256 那麼多維度了。如果原圖的輸入不是224224 ,出來的特徵依然是(16+4+1)256 ;可以理解成將原來固定大小爲33 窗口的pool5改成了自適應窗口大小,窗口的大小和activation map成比例,保證了經過pooling後出來的feature的長度是一致的。

  2. 只對原圖提取一次卷積特徵:

    在R-CNN中,每個候選框resize後都要獨立經過CNN,這樣很低效。SPP Net只對原圖進行一次卷積得到整張圖的feature map,然後找到每個候選框在feature map上的映射patch,將此patch作爲每個候選框的卷積特徵輸入到SPP layer和之後的層,這樣節省了大量時間,比R-CNN快了100倍左右。

RoI Pool:

Fast R-CNN中使用RoIPool將不同大小的候選區域的特徵轉化爲固定大小的特徵圖像,其做法是:假設候選區域RoI大小爲hw ,要輸出的大小爲HW ,那麼就將RoI分成(h/H)(w/W) ,然後對每一個格子使用max-pooling得到目標大小的特徵圖像。

RoI pooling layer實際上是SPP Net的一個精簡版,SPP Net對每個proposal使用了不同大小的金字塔映射,而RoI pooling layer只需要下采樣到一個77 的特徵圖。對於VGG-16的網絡conv5_3有512個特徵圖,這樣所有region proposal對應了一個77512 維度的特徵向量作爲全連接層的輸入

RoI Pooling就是實現從原圖區域映射到conv5區域最後pooling到固定大小的功能。

RoIAlign(Mask R-CNN)

對於每個RoI使用一個FCN來預測mm mask。mm 是一個小的特徵圖尺寸,如何將這個小的特徵圖很好的映射到原始圖像上?Faster R-CNN不是爲網絡輸入和輸出之間的像素到像素對齊而設計的,應用到目標上的核心操作的是粗略的空間量化特徵提取,RoIPool不適用於圖像分割任務,爲了修正錯位,Mask R-CNN提出了一個簡單的,量化無關的層,稱爲RoIAlign,可以保留精確的空間位置。

RoIAlign:

RoIPool是從每個RoI提取小特徵圖(例如,77 )的標準操作,RoIPool首先將浮點數值的RoI量化成離散顆粒的特徵圖,然後將量化的RoI分成幾個空間的小塊(spatial bins),最後彙總每個塊覆蓋的區域的特徵值(通常使用最大池化)。例如,對在連續座標系上的x 計算[x/16] ,其中16 是feature map的stride,[.] 表示四捨五入。同樣地,當對RoI分塊時(例如77 )時也執行同樣的計算。這樣的計算讓RoI與提取的特徵錯位。雖然這可能不會影響分類,因爲分類對小幅度的變換具有一定的魯棒性,但它對預測像素級精確的掩碼有很大的負面影響。

爲了解決RoIPool量化引入的問題,提出RoIAlign層,將提取的特徵和輸入準確對齊。改進:避免對RoI的邊界或bins進行量化(避免四捨五入,取x/16 )。使用雙線性插值精確計算每個位置的精確值,並將結果彙總(使用最大池化或平均池化)。

雙線性插值:

雙線性插值

如圖,已知Q12,Q22,Q11,Q21,但是要插值的點爲P點,這就要用雙線性插值了,首先在x軸方向上,對R1和R2兩個點進行插值,這個很簡單,然後根據R1和R2對P點進行插值,這就是所謂的雙線性插值。

Class prediction & box regression

這裏寫圖片描述

Segmentation

這裏寫圖片描述

解耦掩碼和分類至關重要:

定義Lmask 方式使得網絡生成每個類別的mask不會受到類別競爭影響,解耦了mask和類別預測。這與通常FCN應用於像素級Softmax和多重交叉熵損失的語義分段的做法不同。在這種情況下,掩碼將在不同類別之間競爭。而在mask R-CNN中,使用了其他方法沒有的像素級的Sigmoid和二進制損失。

  1. 全卷積:因爲要保存空間信息,所以沒有用全連接層把feature map變成向量,而是用全卷積輸出m*m的mask。
  2. 掩碼分支對於每個RoI的輸出維度是K(mm) ,表示k個分辨率爲mm 的二值掩碼,每個類別1個,k是類別數目。爲每個類獨立地預測二進制掩碼,這樣不會跨類別競爭,並且依賴於網絡的RoI分類分支來預測類別
  3. 爲每個像素應用 sigmiod,將Lmask 定義爲平均二進制交叉熵損失。對於真實類別爲k的RoI,僅在第k個掩碼上計算Lmask (其他掩碼輸出不計入損失)

Experiments

Dataset & metrics

這裏寫圖片描述

Related methods: MNC

這裏寫圖片描述

MNC:

Multi Network Cascade 多任務網絡級聯,COCO 2015分割挑戰的冠軍

一個複雜的多級級聯模型,從候選框中預測候選分割,然後進行分類。

Related methods: FCIS

這裏寫圖片描述

FCIS:

fully convolutional instance segmentation 全卷積實例分割,COCO 2016分割挑戰的冠軍

用全卷積得到一組位置敏感的輸出通道候選。這些通道同時處理目標分類,目標檢測和掩碼,這使系統速度變得更快。但FCIS在重疊實例上出現系統錯誤,併產生虛假邊緣。

以下實驗部分請參考論文。

Segmentation results

Detection results

Ablation experiments

Human pose estimation

Wrap up

這裏寫圖片描述

Mask R-CNN head architectures

這裏寫圖片描述

網絡架構:

爲了證明這個方法的普適性,論文中構造了多種不同的Mask R-CNN。

  1. 用於整個圖像上的特徵提取的下層卷積網絡(ResNet,FPN)
  2. 用於檢測框識別(分類和迴歸)和掩碼預測的上層網絡

對於上層網絡,擴展了ResNet和FPN中提出的Faster R-CNN上層網絡,分別添加了一個掩碼分支。圖中數字表示分辨率和通道數,箭頭表示卷積、反捲積或全連接層,其中卷積減小維度,反捲積增加維度,所有卷積都是33 ,除了輸出層是11 的,反捲積是22 ,stride爲2,隱藏層使用ReLU。res5表示ResNet的第五階段,圖中修改了第一個卷積操作,使用77 ,步長爲1的RoI代替1414 ,步長爲2的RoI。下圖中的”×4 ”表示堆疊的4個連續的卷積。

ResNet-C4的上層網絡包括ResNet的第五階段(即9層的“res5”),對於FPN,下層網絡已經包含了res5,因此可以使上層網絡包含更少的卷積核而變的更高效。

Feature Pyramid Network

這裏寫圖片描述
FPN:

Feature Pyramid Network 特徵金字塔網絡

FPN使用具有橫旁路連接的自頂向下架構,以從單尺度輸入構建網絡中的特徵金字塔。使用FPN的Faster R-CNN根據其尺度提取不同級別的金字塔的RoI特徵,不過其他部分和平常的ResNet類似。使用ResNet-FPN進行特徵提取的Mask R-CNN可以在精度和速度方面獲得極大的提升。

參考博客(如有侵權請告知)

基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN

目標檢測方法簡介:RPN(Region Proposal Network) and SSD(Single Shot MultiBox Detector)

CNN目標檢測(一):Faster RCNN詳解

深度卷積神經網絡在目標檢測中的進展

faster-rcnn原理及相應概念解釋

目標檢測分割–Mask R-CNN

Mask R-CNN論文翻譯

三十分鐘理解:線性插值,雙線性插值Bilinear Interpolation算法

文中插圖來源:

maskrcnn_slides.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章