本週組會講Mask R-CNN,藉此機會把目標檢測R-CNN系列的論文都整理了一遍,除了paper外,主要參考網上的一些博客,如有侵權,請告知,在此十分感謝。
文中如有錯誤,請積極指出,一起學習,共同進步。
相關論文鏈接:
R-CNN
關於YOLO可參考本人另一篇博客2016-CVPR-YOLO
github代碼:
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的三個目標:
- 視覺場景理解的多任務模型的狀態: 同時滿足目標檢測、分類及實例分割的要求
- 高度模塊化,訓練簡單,相對於Faster R-CNN僅增加一個小的overhead,可以跑到5FPS
- 可以方便的擴展到其他任務,比如人體姿態估計等
R-CNN
步驟:
- 訓練(或下載)一個分類模型(比如AlexNet)
- 對模型進行fine-tuning:
- 將分類數1000改爲21(有一個類別是背景)
- 去掉最後一個全連接層
- 特徵提取:
- 利用selective search算法在圖像中從上到下提取約2k個候選區域
- 將每個候選區域wrap成
224∗224 的大小以適合CNN的輸入,做一次前向傳播,將CNN的fc7層的輸出作爲特徵,保存到硬盤
- 訓練一個SVM分類器來判斷這個候選框裏物體的類別,每個類別對應一個SVM,判斷是否屬於這個類別,是就是positive,反之就是nagative
- 使用SVM分好類的候選區域做邊框迴歸,用bounding box 迴歸值校正
該方法在VOC 2011 test數據集上取得了71.8%的檢測精度。
Selective search:
這個策略藉助了層次聚類的思想,應用到區域的合併上面。
- 假設現在圖像上有n個預分割的區域(Efficient Gragh-Based Image Segment),表示爲
R=R1,R2,…,Rn - 計算每個region與它相鄰region的相似度,這樣會得到一個
n∗n 的相似度矩陣(同一個區域之間和不相鄰區域之間的相似度可設爲NaN),從矩陣中找出最大相似度值對應的兩個區域,將這兩個區域合二爲一,這時圖像上還剩下n-1個區域 - 重複上述過程(只需計算新的區域與它相鄰區域的新相似度,其他的不用重複計算),重複一次,區域的總數目就少1,直到最後所有的區域都合併成爲了同一個區域
缺點:
- 訓練和測試過程分爲多個階段,步驟繁瑣:微調網絡,得到候選區域,CNN提取特徵,SVM分類,SVM邊界框迴歸
- 訓練耗時,佔用磁盤空間大,5000張圖像產生幾百G的特徵文件
- 測試過程中,每一個候選區域都要提取一遍特徵,這些區域有一定重疊度,各個區域的特徵提取獨立計算,效率不高,使測試一幅圖像非常慢
- 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倍。
步驟:
- 輸入測試圖像
- 利用selective search算法在圖像上從上到下提取約2k個候選區域
- 將整張圖片輸入CNN,進行特徵提取,得到feature map
- 把候選區域映射到CNN的最後一層卷積feature map上
- 通過RoI pooling層使每個候選區域生成固定尺寸的feature map
- 利用Softmax loss(探測分類概率)和Smooth L1 Loss(探測邊框迴歸)對分類概率和邊框迴歸(Bounding box regression)聯合訓練
相比R-CNN,兩處改進:
- CNN最後一層卷積層後加了一個RoI pooling層,可以看做單層SPP Net的網絡層,可以把不同大小的輸入映射到一個固定尺寸的特徵向量。
- 在R-CNN中是先用SVM分類器,再做bbox regression,而在Fast R-CNN中,損失函數使用了multi-task loss,將bbox regression直接加入到CNN網絡中訓練,並且實驗證明這兩個任務能夠共享卷積特徵,相互促進。
Faster R-CNN
步驟:
- 輸入測試圖像
- 將整張圖片輸入CNN,進行特徵提取
- 用RPN生成候選區域,每張圖片生成300個候選區域
- 把候選區域映射到CNN的最後一層卷積feature map上
- 通過RoI pooling層使每個RoI生成固定尺寸的feature map
- 利用Softmax loss(探測分類概率)和Smooth L1 Loss(探測邊框迴歸)對分類概率和邊框迴歸(Bounding box regression)聯合訓練
相比Fast R-CNN,兩處改進:
- 使用RPN(Region Proposal Network)代替原來的Selective Search方法產生候選區域,使得檢測速度大幅提高
- 產生候選區域的CNN和目標檢測的CNN共享,候選區域的質量也有本質的提高
Mask R-CNN
Mask R-CNN實際上就是Faster R-CNN + Mask branch,RoIAlign的結果。
相比Faster R-CNN,兩處改進:
- 把Faster R-CNN裏的RoIPool layer改爲RoIAlign layer
- 最後多了一個mask branch
RPN
RPN是一個全卷積網絡,由於沒有全連接層,所以可以輸入任意分辨率的圖像,經過網絡後就得到一個feature map,然後利用這個feature map得到物體的位置和類別。
那麼,怎麼利用這個feature map得到物體的位置和類別呢?
在conv5-3的卷積feature map上用一個
- Reg-layer,用於預測proposal的中心錨點對應的proposal的座標x,y和寬高w,h
- cls-layer,用於判定該proposal是前景還是背景
Anchor:
- 把得到的feature map上的每一個點映射回原圖,得到原圖上這些點的座標
- 在這些點周圍取一些提前設定好的區域用來訓練RPN,這些區域就叫做Anchor boxes
anchor(錨點),位於
IoU:
在計算Loss值之前,作者設置了anchors的標定規則:
- 如果anchor對應的anchor box與ground truth的IoU最大,標記爲正樣本
- 如果anchor對應的anchor box與ground truth的IoU>0.7,標記爲正樣本
- 如果anchor對應的anchor box與ground truth的IoU<0.3,標記爲負樣本
- 剩下的既不是正樣本也不是負樣本,不用於最終訓練
- 訓練RPN的Loss是由classification loss(即softmax loss)和regression loss(即L1 loss)按一定比重組成的
Loss functions:
計算softmax loss需要的是anchors對應的groudtruth標定結果和預測結果,計算regression loss需要三組信息:
- 預測框proposal region:即RPN網絡預測出的proposal的中心位置座標x,y和寬高w,h
- Anchor box:1個anchor對應9個不同的scale和aspect_ratio的anchor boxes,每一個box都有一箇中心點位置座標
xa,ya 和寬高wa,ha - Ground truth:標定的框也對應一箇中心點位置座標
x∗,y∗ 和寬高w∗,h∗
因此,計算regression loss和總loss算法如下:
RPN訓練設置:
- 在訓練RPN時,一個mini-batch是由一幅圖像中任意選取的256個proposal組成的,其中正負樣本的比例爲1:1
- 如果正樣本不足128,則多用一些負樣本以滿足256個proposal可以用於訓練,反之亦然
- 訓練RPN時,與VGG共有的層參數可以直接拷貝經ImageNet訓練得到的模型中的參數;剩下沒有的層參數用標準差=0.01的高斯分佈初始化
缺點:
RPN關鍵在於選取了一些anchor進行pixel-wise的學習,但問題就是對小物體的檢測效果很差,假設輸入爲
RoIPool(Fast R-CNN)
在Fast R-CNN和Faster R-CNN中用到的RoI pooling層,其實是借鑑了SPP Net中的思想,所以在介紹RoIPool前,先了解一下SPP Net。
SPP Net:(Spatial Pyramid Pooling,空間金字塔池化)
結合空間金字塔方法實現CNNs的多尺度輸入:
R-CNN提取候選框後需要進行crop和wrap來修正尺寸,這樣會造成數據的丟失或幾何的失真。SPP Net將金字塔思想加入到CNN,在卷積層和全連接層之間加入SPP layer,SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。
如果原圖輸入是
224∗224 ,對於conv5出來後的輸出,是13∗13∗256 ,即256個filter,每個filter對應一張13∗13 的activation map。如果像上圖那樣將activate map pooling成4∗4,2∗2,1∗1 三張子圖,做max pooling後,出來的特徵就是固定長度的(16+4+1)∗256 那麼多維度了。如果原圖的輸入不是224∗224 ,出來的特徵依然是(16+4+1)∗256 ;可以理解成將原來固定大小爲3∗3 窗口的pool5改成了自適應窗口大小,窗口的大小和activation map成比例,保證了經過pooling後出來的feature的長度是一致的。只對原圖提取一次卷積特徵:
在R-CNN中,每個候選框resize後都要獨立經過CNN,這樣很低效。SPP Net只對原圖進行一次卷積得到整張圖的feature map,然後找到每個候選框在feature map上的映射patch,將此patch作爲每個候選框的卷積特徵輸入到SPP layer和之後的層,這樣節省了大量時間,比R-CNN快了100倍左右。
RoI Pool:
Fast R-CNN中使用RoIPool將不同大小的候選區域的特徵轉化爲固定大小的特徵圖像,其做法是:假設候選區域RoI大小爲
RoI pooling layer實際上是SPP Net的一個精簡版,SPP Net對每個proposal使用了不同大小的金字塔映射,而RoI pooling layer只需要下采樣到一個
RoI Pooling就是實現從原圖區域映射到conv5區域最後pooling到固定大小的功能。
RoIAlign(Mask R-CNN)
對於每個RoI使用一個FCN來預測
RoIAlign:
RoIPool是從每個RoI提取小特徵圖(例如,
爲了解決RoIPool量化引入的問題,提出RoIAlign層,將提取的特徵和輸入準確對齊。改進:避免對RoI的邊界或bins進行量化(避免四捨五入,取
雙線性插值:
如圖,已知Q12,Q22,Q11,Q21,但是要插值的點爲P點,這就要用雙線性插值了,首先在x軸方向上,對R1和R2兩個點進行插值,這個很簡單,然後根據R1和R2對P點進行插值,這就是所謂的雙線性插值。
Class prediction & box regression
Segmentation
解耦掩碼和分類至關重要:
定義
- 全卷積:因爲要保存空間信息,所以沒有用全連接層把feature map變成向量,而是用全卷積輸出m*m的mask。
- 掩碼分支對於每個RoI的輸出維度是
K∗(m∗m) ,表示k個分辨率爲m∗m 的二值掩碼,每個類別1個,k是類別數目。爲每個類獨立地預測二進制掩碼,這樣不會跨類別競爭,並且依賴於網絡的RoI分類分支來預測類別 - 爲每個像素應用 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。
- 用於整個圖像上的特徵提取的下層卷積網絡(ResNet,FPN)
- 用於檢測框識別(分類和迴歸)和掩碼預測的上層網絡
對於上層網絡,擴展了ResNet和FPN中提出的Faster R-CNN上層網絡,分別添加了一個掩碼分支。圖中數字表示分辨率和通道數,箭頭表示卷積、反捲積或全連接層,其中卷積減小維度,反捲積增加維度,所有卷積都是
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)
三十分鐘理解:線性插值,雙線性插值Bilinear Interpolation算法
文中插圖來源: