基於深度學習的目標檢測算法綜述(從R-CNN到Mask R-CNN)


自從2012年的ILSVRC競賽中基於CNN的方法一鳴驚人之后,CNN已成為圖像分類、檢測和分割的神器。其中在圖像檢測的任務中,R-CNN系列是一套經典的方法,從最初的R-CNN到后來的Fast R-CNN, Faster R-CNN 和今年的Mask R-CNN, 我們可以看到CNN在圖像檢測中是如何一點一點提高的。和本文來一道回顧R-CNN家族的發展史,了解這些方法的演變和這個演變過程中的那些富有創意的想法。

R-CNN 系列的四篇文章如下:

  1. R-CNN: https://arxiv.org/abs/1311.2524

  2. Fast R-CNN: https://arxiv.org/abs/1504.08083

  3. Faster R-CNN: https://arxiv.org/abs/1506.01497

  4. Mask R-CNN: https://arxiv.org/abs/1703.06870

圖像的檢測任務是從一個復雜場景的圖像中找到不同的物體,並且給出各個物體的邊界框。圖像檢測的三個著名的數據集是PASCAL VOC,ImageNet和微軟COCO. PASCAL VOC包含20個物體的類別,而ImageNet包含一千多種物體類別,COCO有80中物體類別和150萬個物體實例。

PASCAL VOC目標檢測

COCO目標檢測和實例分割

1, R-CNN

R-CNN的思路是很直觀的三步曲:1,得到若干候選區域;2, 對每個候選區域分別用CNN分類;3,對每個候選區域分別進行邊框預測。

在R-CNN出現之前,目標檢測的流行思路是先從圖像中得到一些候選區域,再從候選區域中提取一些特征,然后利用一個分類器對這些特征進行分類。分類的結果和候選區域的邊界框就可以作為目標檢測的輸出。一種得到候選區域的方法是Selective Search, 該方法可以得到不同尺度的候選區域,每個候選區域是一個聯通的區域。如下圖中,左邊得到的是較小的候選區域,右邊是較大的候選區域,在該尺度下包含了整個人的區域。

Selective Search得到不同尺度的候選區域

R-CNN的想法是,既然CNN在圖像分類任務中的表現很好,可以自動學習特征,何不用它來對每個候選區域進行特征提取呢?於是R-CNN在Selective Search得到的候選區域的基礎上,將每個候選區域縮放到一個固定的大小,並且作為AlexNet(ImageNet 2012圖像分類競賽的冠軍)的輸入,依次對這些區域進行特征提取,然后再使用支持向量機對各個區域的特征分別進行分類。R-CNN的過程如下:

R-CNN示意圖

這樣就能得到一個檢測的結果了。但是Slelective Search得到的候選區域並不一定和目標物體的真實邊界相吻合,因此R-CNN提出對物體的邊界框做進一步的調整,使用一個線性回歸器來預測一個候選區域中物體的真實邊界。該回歸器的輸入就是候選區域的特征,而輸出是邊界框的坐標。

R-CNN的效果很不錯,比VOC 2012的最好的結果提高了30%的准確度。但是問題就是太慢,主要有三方面原因:1,候選區域的生成是一個耗時的過程;2,對候選區域特征提取需要在單張圖像上使用AlexNet 2000多次; 3, 特征提取、圖像分類、邊框回歸是三個獨立的步驟,要分別進行訓練,測試過程中的效率也較低。

 

2, Fast R-CNN

為了解決R-CNN中效率低的問題,Fast R-CNN想,一張圖像上要使用AlexNet 2000多次來分別得到各個區域的特征,但很多區域都是重合的,可否避免這些重復計算,只在一張圖像上使用一次AlexNet,然后再得到不同區域的特征呢?

於是Fast R-CNN提出了一個ROI Pooling的方法,先對輸入圖像使用一次CNN前向計算,得到整個圖像的特征圖,再在這個特征圖中分別取提取各個候選區域的特征。由於候選區域的大小不一樣,而對應的特征需要要具有固定的大小,因此該方法對各個候選區域分別使用

Pooling, 其做法是:假設第 i個候選區域ROI的大小為hi * wi, 要使輸出的大小為h*w,那么就將該ROI分成h*w 個格子,每一個格子的大小為(hi/h)*(wi/w), 然后對每一格子使用max-pooling得到大小為w*w的特征圖像。

Fast R-CNN示意圖, 將每個候選區域分成h x w大小的格子做pooling

Fast R-CNN的第二點創意是把之前獨立的三個步驟(特征提取、分類和回歸)放到一個統一的網絡結構中。該網絡結構同時預測一個候選區域的物體類別和該物體的邊界框,使用兩個全連接的輸出層分別進行類別預測和邊框預測(如下圖所示),將這兩個任務進行同時訓練,利用一個聯合代價函數:

公式中的兩項分別是classification loss 和regression loss。

特征提取-分類-回歸聯合網絡

        使用VGG16作為特征提取網絡,Fast R-CNN在測試圖像上的處理時間比R-CNN快了200多倍,並且精度更高。如果不考慮生成候選區域的時間,可以達到實時檢測。生成候選區域的Selective Search算法處理一張圖像大概需要2s的時間,因此成為該方法的一個瓶頸。

為了改進這個缺點,RBG借鑒何愷明的SPP-Net提出了fast R-CNN。Fast R-CNN與R-CNN最大的區別就是fast R-CNN不是對每個候選框單獨進行特征提取,而是對整個圖像進行特征提取,在提取特征之后才進行候選框的划分,這就避免了對重疊候選框的重復計算。另外,fast R-CNN提出了ROI pooling層概念,ROI pooling層可以看作單層的SPP-net。在R-CNN中,對候選框進行卷積操作時,由於卷積操作需要固定大小的輸入圖像,而候選框的大小又是不確定的,所以需要對候選框進行變形操作以滿足需求,這不僅導致多余的操作,而且變形可能導致特征提取效果不夠理想。而SPP-net可以直接對不同尺寸的候選框進行處理,這就保證了很好的分類效果。

但是,fast R-CNN還是不夠快,找出所有的候選框還是需要耗費數秒的時間,不能滿足實時分類的性能要求。於是,RBG與何愷明合作提出了性能更好的faster R-CNN。既然對單幅圖像用selective search方法提取proposal就要數秒的時間,那就設計新的方法提取proposal。這種新的方法就是RPN網絡(Region Proposal Networks)。

3, Faster R-CNN

上面兩種方法都依賴於Selective Search生成候選區域,十分耗時。考慮到CNN如此強大,Faster R-CNN提出使用CNN來得到候選區域。假設有兩個卷積神經網絡,一個是區域生成網絡,得到圖像中的各個候選區域,另一個是候選區域的分類和邊框回歸網路。這兩個網絡的前幾層都要計算卷積,如果讓它們在這幾層共享參數,只是在末尾的幾層分別實現各自的特定的目標任務,那么對一幅圖像只需用這幾個共享的卷積層進行一次前向卷積計算,就能同時得到候選區域和各候選區域的類別及邊框。

Faster R-CNN:在卷積后的特征圖上使用Region Proposal Network

候選區域生成網絡(Region Proposal Network, RPN)如下,先通過對輸入圖像的數層卷積得到一個特征圖像,然后在特征圖像上生成候選區域。它使用一個n*n n=3的滑動窗口,將局部的特征圖像轉換成一個低維特征, 預測k個的區域(cls層,2k個輸出)是否為候選區域和對應的k個邊框(reg層,4k個輸出)。這里的K個區域被稱為錨(anchor), 對應着與滑動窗口具有相同的中心的不同大小和不同長寬比的矩形框。假設卷積后的特征圖像大小為W*H,那么一共有WHk個錨。這種特征提取和候選區域生成的方法具有位移不變性。

對一個滑動窗口中的anchor預測候選區域

使用RPN得到候選區域后,對候選區域的分類和邊框回歸仍然使用Fast R-CNN。這兩個網絡使用共同的卷積層。 由於Fast R-CNN的訓練過程中需要使用固定的候選區域生成方法,不能同時對RPN和Fast R-CNN使用反向傳播算法進行訓練。該文章使用了四個步驟完成訓練過程:1,單獨訓練RPN;2,使用步驟中1得到的區域生成方法單獨訓練Fast R-CNN; 3, 使用步驟2得到的網絡作為初始網絡訓練RPN;4, 再次訓練Fast R-CNN, 微調參數。

Faster R-CNN的精度和Fast R-CNN差不多,但是訓練時間和測試時間都縮短了10倍。

總的來說,R-CNN,fast R-CNN,faster R-CNN這一系列的成果,使得深度學習在目標檢測領域得到廣泛的應用,算法的流程也日趨簡單,精度不斷提高,可以說這一系列基於region proposal的目標檢測方法仍然是目標檢測領域最主要的一個分支。

基於region proposal的算法都是two-stage的,他們的主要缺點就是速度不夠快,盡管每年都有非常新穎的算法提出,但是在速度方面並沒有質的飛躍。而相對而言,one-stage的主要優勢就是網絡簡單,速度夠快,那么有沒有精度能與two-stage算法匹敵的one-stage算法呢?答案是有的,這就是接下來要介紹的YOLO和SSD算法。

 

 YOLO流程圖

 

YOLO(You Only Look Once)是一個可以一次性預測多個Box位置和類別的卷積神經網絡,能夠實現端到端的目標檢測和識別,其最大的優勢就是速度快。YOLO有着極為簡單的模型,它沒有選擇滑窗或者提取proposal的方式進行網絡的訓練,而是直接選用整幅圖訓練模型。這種方式可以更好地區分背景區域和目標區域,而不會出現proposal方法中將背景區域誤判為目標的情況。當然,速度上的提升也導致了精度上的一些犧牲,YOLO簡單粗暴地對圖像進行網格划分,然后再對網格進行處理,這就會導致定位不精確的問題,YOLO的識別精度並比不上當時精度最高的faster R-CNN方法。

Faster R-CNN的定位相比於YOLO要精確得多,那把YOLO和faster R-CNN中關於定位的部分結合起來會怎樣呢?這就有了SSD(Single Shot MultiBox Detector),其結果相比YOLO提高了很多。

4, Mask R-CNN

Faster R-CNN 在物體檢測中已達到非常好的性能,Mask R-CNN在此基礎上更進一步:得到像素級別的檢測結果。 對每一個目標物體,不僅給出其邊界框,並且對邊界框內的各個像素是否屬於該物體進行標記。

Mask R-CNN: 像素級別的目標檢測

Mask R-CNN利用Faster R-CNN中已有的網絡結構,再添加了一個頭部分支,使用FCN對每個區域做二值分割。

Mask R-CNN還提出了兩個小的改進使分割的結果更好。第一,對各個區域分割時,解除不同類之間的耦合。假設有K類物體,一般的分割方法直接預測一個有K個通道的輸出,其中每個通道代表對應的類別。而Mask R-CNN預測K個有2個通道(前景和背景)的輸出,這樣各個類別的預測是獨立的。第二,Faster R-CNN中使用的ROI Pooling將每個ROI映射到一個固定的大小,在pooling時有取整操作,這樣會導致pooling 前后的特征圖沒有連續的對應關系。例如,如果pooling前的大小是112x112,pooling之后的大小是7x7,對於pooling之前的一個像素,其橫坐標位置是 X ,那么pooling后對應的橫坐標是 x/16 , 再取整就得到了其在7x7格子中的位置。由於取整操作會帶來誤差,Faster R-CNN不取整,使用雙線性插值得到 X/16處的真實數值,該方法稱作ROIAlign.


三、Focal Loss:速度上一馬當先


 

YOLO和SSD可以算one-stage算法里的佼佼者,加上R-CNN系列算法,這幾種算法可以說是目標檢測領域非常經典的算法了。這幾種算法在提出之后經過數次改進,都得到了很高的精確度,但是one-stage的算法總是稍遜two-stage算法一籌,於是就有了Focal Loss來找場子。

在Focal Loss這篇論文中中,作者認為one-stage精確度不如two-stage是因為下面的原因:

①  正負樣本比例極度不平衡。由於one-stage detector沒有專門生成候選框的子網絡,無法將候選框的數量減小到一個比較小的數量級(主流方法可以將候選框的數目減小到數千),導致了絕大多數候選框都是背景類,大大分散了放在非背景類上的精力;

②  梯度被簡單負樣本主導。我們將背景類稱為負樣本。盡管單個負樣本造成的loss很小,但是由於它們的數量極其巨大,對loss的總體貢獻還是占優的,而真正應該主導loss的正樣本由於數量較少,無法真正發揮作用。這樣就導致收斂不到一個好的結果。

既然負樣本數量眾多,one-stage detector又不能減小負樣本的數量,那么很自然的,作者就想到減小負樣本所占的權重,使正樣本占據更多的權重,這樣就會使訓練集中在真正有意義的樣本上去,這也就是Focal Loss這個題目的由來。

 

其實在Focal Loss之前,就有人提出了OHEM(online hard example mining)方法。OHEM的核心思想就是增加錯分類樣本的權重,但是OHEM卻忽略了易分類樣本,而我們知道這一部分是所有樣本中的絕大部分。

 

 

與OHEM不同,Focal Loss把注意力放在了易分類樣本上,它的形式如圖所示。Focal Loss是一種可變比例的交叉熵損失,當正確分類可能性提高時比例系數會趨近於0。這樣一來,即使再多的易分類樣本也不會主導梯度下降的過程,於是訓練網絡自然可以自動對易分類樣本降權,從而快速地集中處理難分類樣本。

 

 

可以看出,Focal Loss打敗了所有state-of-the-art的算法,而且竟然在速度上也是一馬當先,可以說相當有說服力。但是作者為了證明Focal Loss的有效性,並沒有設計更新穎的網絡,這與其他算法提高精確度的做法是不一樣的——他們要么改造原有算法的網絡結構,要么另辟蹊徑。另外,Focal Loss函數的形式並不是不可變的,只要可以達到對易分類樣本降權的目的,可以在形式上有所變化。

總之,Class imbalance是阻礙one-stage方法提高准確率的主要障礙,過多的easy negative examples會在訓練過程中占據主導地位,使訓練結果惡化,所以要用Focal Loss對easy negative examples進行降權,而把更多的注意力集中在hard examples上。 

 

上述幾種方法的代碼:

R-CNN

  • Caffe版本:rbgirshick/rcnn

Fast R-CNN

  • Caffe版本: rbgirshick/fast-rcnn

Faster R-CNN

  • Caffe版本: https://github.com/rbgirshick/py-faster-rcnn

  • PyTorch版本: https://github.com/longcw/faster_rcnn_pytorch

  • MatLab版本: https://github.com/ShaoqingRen/faster_rcnn

Mask R-CNN

  • PyTorch版本: https://github.com/felixgwu/mask_rcnn_pytorch

  • TensorFlow版本: https://github.com/CharlesShang/FastMaskRCNN

注:R-CNN, Fast R-CNN和Faster R-CNN已在之前的文章總結過,這里添上Mask R-CNN。更多目標檢測的方法在《深度卷積神經網絡在目標檢測中的進展》這篇文章中。另外,《A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN》這篇文章也做了詳細的介紹。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM