深度學習之目標檢測的前世今生(Mask R-CNN)

前段時間做了關於mask R-CNN的的文獻閱讀交流,但是由於mask R-CNN的思想是基於下圖的這樣的思想,一步步改進的。

所以就想寫一篇關於目標檢測的這樣的一個發展里程與其基本思想的變化,幫大家整理梳理一下目標檢測的的學習流程和思想框架,從宏觀上更好把握目標檢測這個領域的演算法變換,從而更好的應用與學習。其中有很多思想是在CSDN和其他博客上借鑒了大神的思想,但是因為看的博文比較多,記不太清楚到底借鑒了哪篇大佬的博文,敬請見諒。


基礎知識介紹

普通的深度學習監督演算法主要是用來做分類,在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)競賽以及實際的應用中,還包括目標定位目標檢測等任務。其中目標定位是不僅僅要識別出來是什麼物體(即分類),而且還要預測物體的位置,位置一般用邊框(bounding box)標記,如圖1(2)所示。而目標檢測實質是多目標的定位,即要在圖片中定位多個目標物體,包括分類和定位。比如對圖1(3)進行目標檢測,得到的結果是好幾隻不同動物,他們的位置如圖3中不同顏色的框所示。

目標檢測對於人類來說並不困難,通過對圖片中不同顏色模塊的感知很容易定位並分類出其中目標物體,但對於計算機來說,面對的是RGB像素矩陣,很難從圖像中直接得到狗和貓這樣的抽象概念並定位其位置,再加上有時候多個物體和雜亂的背景混雜在一起,目標檢測更加困難。


傳統的目標檢測演算法

這難不倒科學家們,在傳統視覺領域,目標檢測就是一個非常熱門的研究方向,一些特定目標的檢測,比如人臉檢測和行人檢測已經有非常成熟的技術了。普通的目標檢測也有過很多的嘗試,但是效果總是差強人意。

傳統的目標檢測一般使用滑動窗口的框架,主要包括三個步驟:

  1. 利用不同尺寸的滑動窗口框住圖中的某一部分作為候選區域;
  2. 提取候選區域相關的視覺特徵。比如人臉檢測常用的Harr特徵;行人檢測和普通目標檢測常用的HOG特徵等;
  3. 利用分類器進行識別,比如常用的SVM模型。

R-CNN

R-CNN是Region-based Convolutional Neural Networks的縮寫,中文翻譯是基於區域的卷積神經網路,是一種結合區域提名(Region Proposal)和卷積神經網路(CNN)的目標檢測方法。Ross Girshick在2013年的開山之作《Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation》奠定了這個子領域的基礎,這篇論文後續版本發表在CVPR 2014,期刊版本發表在PAMI 2015。

其實在R-CNN之前已經有很多研究者嘗試用Deep Learning的方法來做目標檢測了,包括OverFeat,但R-CNN是第一個真正可以工業級應用的解決方案,這也和深度學習本身的發展類似,神經網路、卷積網路都不是什麼新概念,但在本世紀突然真正變得可行,而一旦可行之後再迅猛發展也不足為奇了。

R-CNN這個領域目前研究非常活躍,先後出現了R-CNN、SPP-net、Fast R-CNN 、Faster R-CNN、R-FCN、YOLO、SSD等研究。Ross Girshick作為這個領域的開山鼻祖總是神一樣的存在,R-CNN、Fast R-CNN、Faster R-CNN、YOLO都和他有關。這些創新的工作其實很多時候是把一些傳統視覺領域的方法和深度學習結合起來了,比如選擇性搜索(Selective Search)和圖像金字塔(Pyramid)等。

R-CNN:針對區域提取做CNN的object detction。

R-CNN基本步驟:

  1. 輸入測試圖像;
  2. 利用selective search 演算法在圖像中從上到下提取2000個左右的Region Proposal;
  3. 將每個Region Proposal縮放(warp)成227*227的大小並輸入到CNN,將CNN的fc7層的輸出作為特徵;
  4. 將每個Region Proposal提取的CNN特徵輸入到SVM進行分類;
  5. 對於SVM分好類的Region Proposal做邊框回歸,用Bounding box回歸值校正原來的建議窗口,生成預測窗口坐標。

缺陷:

  1. 訓練分為多個階段,步驟繁瑣:微調網路+訓練SVM+訓練邊框回歸器;
  2. 訓練耗時,佔用磁碟空間大;5000張圖像產生幾百G的特徵文件;
  3. 速度慢:使用GPU,VGG16模型處理一張圖像需要47s;
  4. 測試速度慢:每個候選區域需要運行整個前向CNN計算;
  5. SVM和回歸是事後操作,在SVM和回歸過程中CNN特徵沒有被學習更新。

Fast R-CNN

Fast R-CNN:區域提取轉移到Feature Map之後做,這樣不用對所有的區域進行單獨的CNN Forward步驟。同時最終一起回歸bounding box和類別。

Fast R-CNN基本步驟:

  1. 輸入測試圖像;
  2. 利用selective search 演算法在圖像中從上到下提取2000個左右的建議窗口(Region Proposal);
  3. 將整張圖片輸入CNN,進行特徵提取;
  4. 把建議窗口映射到CNN的最後一層卷積feature map上;
  5. 通過RoI pooling層使每個建議窗口生成固定尺寸的feature map;
  6. 利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯合訓練。

與R-CNN對比的不同:

  1. 最後一層卷積層後加了一個ROI pooling layer;
  2. 損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網路中訓練。

改進:

  1. 測試時速度慢:R-CNN把一張圖像分解成大量的建議框,每個建議框拉伸形成的圖像都會單獨通過CNN提取特徵.實際上這些建議框之間大量重疊,特徵值之間完全可以共享,造成了運算能力的浪費。FAST-RCNN將整張圖像歸一化後直接送入CNN,在最後的卷積層輸出的feature map上,加入建議框信息,使得在此之前的CNN運算得以共享。
  2. 訓練時速度慢:R-CNN在訓練時,是在採用SVM分類之前,把通過CNN提取的特徵存儲在硬碟上.這種方法造成了訓練性能低下,因為在硬碟上大量的讀寫數據會造成訓練速度緩慢。FAST-RCNN在訓練時,只需要將一張圖像送入網路,每張圖像一次性地提取CNN特徵和建議區域,訓練數據在GPU內存里直接進Loss層,這樣候選區域的前幾層特徵不需要再重複計算且不再需要把大量數據存儲在硬碟上。
  3. 訓練所需空間大:R-CNN中獨立的SVM分類器和回歸器需要大量特徵作為訓練樣本,需要大量的硬碟空間.FAST-RCNN把類別判斷和位置回歸統一用深度網路實現,不再需要額外存儲。

Faster -RCNN

Faster -RCNN基本步驟:

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

相比Faster-RCNN,主要兩處不同:

(1)使用RPN(Region Proposal Network)代替原來的Selective Search方法產生建議窗口;

(2)產生建議窗口的CNN和目標檢測的CNN共享

改進:

Faster-RCNN創造性地採用卷積網路自行產生建議框,並且和目標檢測網路共享卷積網路,使得建議框數目從原有的約2000個減少為300個,且建議框的質量也有本質的提高。


三種目標檢測神經網路對比說明

RCNN

  1. 在圖像中確定約1000-2000個候選框 (使用選擇性搜索);
  2. 每個候選框內圖像塊縮放至相同大小,並輸入到CNN內進行特徵提取 ;
  3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 ;
  4. 對於屬於某一特徵的候選框,用回歸器進一步調整其位置。

Fast RCNN

  1. 在圖像中確定約1000-2000個候選框 (使用選擇性搜索);
  2. 對整張圖片輸進CNN,得到feature map;
  3. 找到每個候選框在feature map上的映射patch,將此patch作為每個候選框 的卷積特徵輸入到SPP layer和之後的層;
  4. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 ;
  5. 對於屬於某一特徵的候選框,用回歸器進一步調整其位置。

Faster RCNN

  1. 對整張圖片輸進CNN,得到feature map;
  2. 卷積特徵輸入到RPN,得到候選框的特徵信息;
  3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 ;
  4. 對於屬於某一特徵的候選框,用回歸器進一步調整其位置。

之前在知乎上看到一位大佬對這個的總結,我覺得很有趣,在放在裡面,大家看看有沒有對這些演算法的理解更清晰了些。

RCNN:用SS去選框,CNN提特徵,SVM分類。BB盒回歸。

Fast:RCNN上面的stage互不相關,就統一起來(實際上只統一了後面三個步驟),最大的改進在"在訓練過程中,SGD的mini-batch選取是有「層次的」,同一張圖片上的ROI在BP的時候會使用相同的原始圖像。舉個例子,當N=2,R=128的時候,相當於只BP了2張圖像(但實際上是128個ROI)。

Faster:SS太慢,丫的,也用CNN給你整進去,這樣就更快了。

以上就是現在三種目標檢測領域三種演算法的對比和說明,而在2017年2月何凱明等人又提出來了Mask R-CNN,是目前最好的目標檢測演算法,再一次基於Faster R-CNN進行改進,大大減少了計算時間,所以下面我會著重介紹一下Mask R-CNN。


Mask R-CNN

Mask R-CNN 進行實例分割,就是要在每一個像素上都表示出來目標所屬的具體類別。

完成類別檢測,圖像分割和特徵點定位。

解決的問題:在時間上對Faster R-CNN進行了優化,並且提高準確度,最關鍵的是在像素級別進行特徵點定位達到了將各個對象的邊緣確定的效果。

Mask RCNN分成三個部分,第一個是主幹網路用來進行特徵提取,第二個是頭結構用來做邊界框識別(分類和回歸),第三個就是mask預測用來對每一個ROI進行區分。主幹網路使用的是50層的深度殘差網路ResNet50和Feature Pyramid Network(FPN) 。Mask-RCNN 大體框架還是Faster-RCNN的框架,可以說在基礎特徵網路之後又加入了全連接的分割子網,由原來的兩個任務(分類+回歸)變為了三個任務(分類+回歸+分割)。Mask R-CNN是Faster

R-CNN 上的擴展——在其已有的用於邊界框識別分支上添加了一個並行的用於預測目標掩碼的分支。Mask R-CNN的訓練很簡單,只是在R-CNN的基礎增加了少量的計算量,大約為5fps

其中黑色部分為原來的 Faster-RCNN,紅色部分為在 Faster網路上的修改:

  1. 將Roi Pooling 層替換成了 RoiAlign;
  2. 添加並列的 FCN層(mask 層);

先來概述一下Mask-RCNN 的幾個特點(來自於 Paper 的 Abstract):

1)在邊框識別的基礎上添加分支網路,用於語義Mask 識別;

2)訓練簡單,相對於Faster 僅增加一個小的 Overhead,可以跑到 5FPS;

3)可以方便的擴展到其他任務,比如人的姿態估計等;

4)不藉助Trick,在每個任務上,效果優於目前所有的 single-model entries,包括 COCO 2016 的Winners。

演算法細節:

1. LOSS fuction

多任務損失函數對於每一個ROI,L=L_cls+L_box+L_mask.網路使用的損失函數為分類誤差+檢測誤差+分割誤差。分類誤差和bounding box回歸誤差是faster R-CNN中的。分割誤差為mask rcnn中新加的,對於每一個m*m大小的ROI區域,mask分支有一個K*m^2維的輸出,K是指所有的類別,例如PASCAL VOC一共20個類別,加上背景,一共21個類別,K=21 。對於每一個像素,都是用sigmod函數求二值交叉熵(即對每個像素都進行邏輯回歸),得到平均的二值交叉熵誤差Lmask。對於每一個ROI,如果檢測得到ROI屬於哪一個分類,就只使用哪一個分支的交叉熵誤差作為誤差值進行計算。也就是一個ROI區域中K*m^2的輸出,真正有用的只是某個類別的m^2的輸出。(舉例說明:分類有3類(貓,狗,人),檢測得到當前ROI屬於「人」這一類,那麼所使用的Lmask為「人」這一分支的mask。)這樣的定義使得我們的網路不需要去區分每一個像素屬於哪一類,只需要去區別在這個類當中的不同分別小類。

2. Mask Representation

Mask覆蓋輸入目標的空間位置,所以不能像類標和bbox一樣通過全連接層坍塌到很短的向量。提取空間結構很自然的想到利用卷積的pixel to pixel 對應的特性。

具體的對每一個ROI預測一個mm大小的mask用FCN。這能保證mask 分支的每一層都明確的保持mm目標的空間布局,不會坍塌成缺少空間維度的向量。與前人工作使用全連接層預測mask相比,本文的FCN需要更少的參數,得到更好的效果。pixel to pixel 的任務需要ROI特徵與原始輸入圖像有很好對齊來保持每個像素的空間對應。這就是提出RoIAlign層的動機。

3. RoIAlign

ROIpool是對ROI提取小的特徵映射標準的操作符。量化導致了ROI和特徵層的不對齊。這對分類任務沒什麼影響,但是對pixel to pixel的任務就有很大的負面影響。

為了解決這個問題,本文提出了RoIAlign層,移除ROIPool粗糙的量化,正確的對齊特徵和輸入。提出的改變非常簡單:避免任何ROI邊界或者bins的量化,即用x/16代替[x/16]。用雙向性插值法輸入特徵在每個ROI

bin的四個採樣點的精確值。

4. Network Architecture

將整個網路分成兩部分,1)卷積主幹結構用來提取整幅圖像的特徵。2)網路頭用來對ROI進行bbox識別和mask預測。

分別考察50層和101層Resnet和ResNeXt網路作為卷積主幹結構。還探索另一種有效的主幹結構,叫作FPN。

演算法結果-實例分割:

演算法結果-對比分析:

(a)說明網路越深越好(並不是所有都對),FPN和ResneXt對結果有提升。

(b)說明對分類和mask去耦合效果好。

(c)和(d)說明對齊效果好。

(e)mask分支說明用FCN效果比MLP好。

演算法結果-物體檢測

演算法結果-人體姿勢估計


結論

Mask R-CNN是一個小巧、靈活的通用對象實例分割框架(object instance segmentation)。它不僅可對圖像中的目標進行檢測,還可以對每一個目標給出一個高質量的分割結果。它在Faster R-CNN基礎之上進行擴展,並行地在bounding box recognition分支上添加一個用於預測目標掩模(object mask)的新分支。該網路還很容易擴展到其他任務中,比如估計人的姿勢,也就是關鍵點識別(person keypoint detection)。該框架COCO的一些列挑戰任務重都取得了最好的結果,包括實例分割(instance segmentation)、候選框目標檢測(bounding-box object detection)和人關鍵點檢測(person keypoint detection)。

推薦閱讀:

目標檢測:SPPNet 論文閱讀
yolov3 強勢發布
【目標檢測簡史】Mask-RCNN
綜述:3D目標檢測於RGB-D(Object detection in RGB-D images)

TAG:深度學習DeepLearning | 目標檢測 | 目標識別 |