目標檢測是人工智能的一個重要應用,就是在圖片中要將里面的物體識別出來,并標出物體的位置,一般需要經過兩個步驟:
1、分類,識別物體是什么
2、定位,找出物體在哪里
除了對單個物體進行檢測,還要能支持對多個物體進行檢測,如下圖所示:
這個問題并不是那么容易解決,由于物體的尺寸變化范圍很大、擺放角度多變、姿態不定,而且物體有很多種類別,可以在圖片中出現多種物體、出現在任意位置。因此,目標檢測是一個比較復雜的問題。
最直接的方法便是構建一個深度神經網絡,將圖像和標注位置作為樣本輸入,然后經過CNN網絡,再通過一個分類頭(Classification head)的全連接層識別是什么物體,通過一個回歸頭(Regression head)的全連接層回歸計算位置,如下圖所示:
但“回歸”不好做,計算量太大、收斂時間太長,應該想辦法轉為“分類”,這時容易想到套框的思路,即取不同大小的“框”,讓框出現在不同的位置,計算出這個框的得分,然后取得分最高的那個框作為預測結果,如下圖所示:
根據上面比較出來的得分高低,選擇了右下角的黑框作為目標位置的預測。
但問題是:框要取多大才合適?太小,物體識別不完整;太大,識別結果多了很多其它信息。那怎么辦?那就各種大小的框都取來計算吧。
如下圖所示(要識別一只熊),用各種大小的框在圖片中進行反復截取,輸入到CNN中識別計算得分,最終確定出目標類別和位置。
這種方法效率很低,實在太耗時了。那有沒有高效的目標檢測方法呢?
一、R-CNN 橫空出世
R-CNN(Region CNN,區域卷積神經網絡)可以說是利用深度學習進行目標檢測的開山之作,作者Ross Girshick多次在PASCAL VOC的目標檢測競賽中折桂,2010年更是帶領團隊獲得了終身成就獎,如今就職于Facebook的人工智能實驗室(FAIR)。
R-CNN算法的流程如下
1、輸入圖像
2、每張圖像生成1K~2K個候選區域
3、對每個候選區域,使用深度網絡提取特征(AlextNet、VGG等CNN都可以)
4、將特征送入每一類的SVM 分類器,判別是否屬于該類
5、使用回歸器精細修正候選框位置
下面展開進行介紹
1、生成候選區域
使用Selective Search(選擇性搜索)方法對一張圖像生成約2000-3000個候選區域,基本思路如下:
(1)使用一種過分割手段,將圖像分割成小區域
(2)查看現有小區域,合并可能性最高的兩個區域,重復直到整張圖像合并成一個區域位置。優先合并以下區域:
- 顏色(顏色直方圖)相近的
- 紋理(梯度直方圖)相近的
- 合并后總面積小的
- 合并后,總面積在其BBOX中所占比例大的
在合并時須保證合并操作的尺度較為均勻,避免一個大區域陸續“吃掉”其它小區域,保證合并后形狀規則。
(3)輸出所有曾經存在過的區域,即所謂候選區域
2、特征提取
使用深度網絡提取特征之前,首先把候選區域歸一化成同一尺寸227×227。
使用CNN模型進行訓練,例如AlexNet,一般會略作簡化,如下圖:
image
3、類別判斷
對每一類目標,使用一個線性SVM二類分類器進行判別。輸入為深度網絡(如上圖的AlexNet)輸出的4096維特征,輸出是否屬于此類。
4、位置精修
目標檢測的衡量標準是重疊面積:許多看似準確的檢測結果,往往因為候選框不夠準確,重疊面積很小,故需要一個位置精修步驟,對于每一個類,訓練一個線性回歸模型去判定這個框是否框得完美,如下圖:
R-CNN將深度學習引入檢測領域后,一舉將PASCAL VOC上的檢測率從35.1%提升到53.7%。
二、Fast R-CNN大幅提速
繼2014年的R-CNN推出之后,Ross Girshick在2015年推出Fast R-CNN,構思精巧,流程更為緊湊,大幅提升了目標檢測的速度。
Fast R-CNN和R-CNN相比,訓練時間從84小時減少到9.5小時,測試時間從47秒減少到0.32秒,并且在PASCAL VOC 2007上測試的準確率相差無幾,約在66%-67%之間。
Fast R-CNN主要解決R-CNN的以下問題:
1、訓練、測試時速度慢
R-CNN的一張圖像內候選框之間存在大量重疊,提取特征操作冗余。而Fast R-CNN將整張圖像歸一化后直接送入深度網絡,緊接著送入從這幅圖像上提取出的候選區域。這些候選區域的前幾層特征不需要再重復計算。
2、訓練所需空間大
R-CNN中獨立的分類器和回歸器需要大量特征作為訓練樣本。Fast R-CNN把類別判斷和位置精調統一用深度網絡實現,不再需要額外存儲。
下面進行詳細介紹
1、在特征提取階段,通過CNN(如AlexNet)中的conv、pooling、relu等操作都不需要固定大小尺寸的輸入,因此,在原始圖片上執行這些操作后,輸入圖片尺寸不同將會導致得到的feature map(特征圖)尺寸也不同,這樣就不能直接接到一個全連接層進行分類。
在Fast R-CNN中,作者提出了一個叫做ROI Pooling的網絡層,這個網絡層可以把不同大小的輸入映射到一個固定尺度的特征向量。ROI Pooling層將每個候選區域均勻分成M×N塊,對每塊進行max pooling。將特征圖上大小不一的候選區域轉變為大小統一的數據,送入下一層。這樣雖然輸入的圖片尺寸不同,得到的feature map(特征圖)尺寸也不同,但是可以加入這個神奇的ROI Pooling層,對每個region都提取一個固定維度的特征表示,就可再通過正常的softmax進行類型識別。
2、在分類回歸階段,在R-CNN中,先生成候選框,然后再通過CNN提取特征,之后再用SVM分類,最后再做回歸得到具體位置(bbox regression)。而在Fast R-CNN中,作者巧妙的把最后的bbox regression也放進了神經網絡內部,與區域分類合并成為了一個multi-task模型,如下圖所示:
實驗表明,這兩個任務能夠共享卷積特征,并且相互促進。
Fast R-CNN很重要的一個貢獻是成功地讓人們看到了Region Proposal+CNN(候選區域+卷積神經網絡)這一框架實時檢測的希望,原來多類檢測真的可以在保證準確率的同時提升處理速度。
三、Faster R-CNN更快更強
繼2014年推出R-CNN,2015年推出Fast R-CNN之后,目標檢測界的領軍人物Ross Girshick團隊在2015年又推出一力作:Faster R-CNN,使簡單網絡目標檢測速度達到17fps,在PASCAL VOC上準確率為59.9%,復雜網絡達到5fps,準確率78.8%。
在Fast R-CNN還存在著瓶頸問題:Selective Search(選擇性搜索)。要找出所有的候選框,這個也非常耗時。那我們有沒有一個更加高效的方法來求出這些候選框呢?
在Faster R-CNN中加入一個提取邊緣的神經網絡,也就說找候選框的工作也交給神經網絡來做了。這樣,目標檢測的四個基本步驟(候選區域生成,特征提取,分類,位置精修)終于被統一到一個深度網絡框架之內。如下圖所示:
Faster R-CNN可以簡單地看成是“區域生成網絡+Fast R-CNN”的模型,用區域生成網絡(Region Proposal Network,簡稱RPN)來代替Fast R-CNN中的Selective Search(選擇性搜索)方法。
如下圖
RPN如下圖:
RPN的工作步驟如下:
- 在feature map(特征圖)上滑動窗口
- 建一個神經網絡用于物體分類+框位置的回歸
- 滑動窗口的位置提供了物體的大體位置信息
- 框的回歸提供了框更精確的位置
Faster R-CNN設計了提取候選區域的網絡RPN,代替了費時的Selective Search(選擇性搜索),使得檢測速度大幅提升,下表對比了R-CNN、Fast R-CNN、Faster R-CNN的檢測速度:
總結
R-CNN、Fast R-CNN、Faster R-CNN一路走來,基于深度學習目標檢測的流程變得越來越精簡、精度越來越高、速度也越來越快。基于region proposal(候選區域)的R-CNN系列目標檢測方法是目標檢測技術領域中的最主要分支之一。
為了更加精確地識別目標,實現在像素級場景中識別不同目標,利用“圖像分割”技術定位每個目標的精確像素,如下圖所示(精確分割出人、汽車、紅綠燈等):
Mask R-CNN便是這種“圖像分割”的重要模型。
Mask R-CNN的思路很簡潔,既然Faster R-CNN目標檢測的效果非常好,每個候選區域能輸出種類標簽和定位信息,那么就在Faster R-CNN的基礎上再添加一個分支從而增加一個輸出,即物體掩膜(object mask),也即由原來的兩個任務(分類+回歸)變為了三個任務(分類+回歸+分割)。如下圖所示,Mask R-CNN由兩條分支組成:
Mask R-CNN的這兩個分支是并行的,因此訓練簡單,僅比Faster R-CNN多了一點計算開銷。
如下圖所示,Mask R-CNN在Faster R-CNN中添加了一個全卷積網絡的分支(圖中白色部分),用于輸出二進制mask,以說明給定像素是否是目標的一部分。所謂二進制mask,就是當像素屬于目標的所有位置上時標識為1,其它位置標識為 0
從上圖可以看出,二進制mask是基于特征圖輸出的,而原始圖像經過一系列的卷積、池化之后,尺寸大小已發生了多次變化,如果直接使用特征圖輸出的二進制mask來分割圖像,那肯定是不準的。這時就需要進行了修正,也即使用RoIAlign替換RoIPooling
如上圖所示,原始圖像尺寸大小是128x128,經過卷積網絡之后的特征圖變為尺寸大小變為 25x25。這時,如果想要圈出與原始圖像中左上方15x15像素對應的區域,那么如何在特征圖中選擇相對應的像素呢?
從上面兩張圖可以看出,原始圖像中的每個像素對應于特征圖的25/128像素,因此,要從原始圖像中選擇15x15像素,則只需在特征圖中選擇2.93x2.93像素(15x25/128=2.93),在RoIAlign中會使用雙線性插值法準確得到2.93像素的內容,這樣就能很大程度上,避免了錯位問題。
修改后的網絡結構如下圖所示(黑色部分為原來的Faster R-CNN,紅色部分為Mask R-CNN修改的部分)
從上圖可以看出損失函數變為
損失函數為分類誤差+檢測誤差+分割誤差,分類誤差和檢測(回歸)誤差是Faster R-CNN中的,分割誤差為Mask R-CNN中新加的。
對于每個MxM大小的ROI區域,mask分支有KxMxM維的輸出(K是指類別數量)。對于每一個像素,都是用sigmod函數求二值交叉熵,也即對每個像素都進行邏輯回歸,得到平均的二值交叉熵誤差Lmask。通過引入預測K個輸出的機制,允許每個類都生成獨立的mask,以避免類間競爭,這樣就能解耦mask和種類預測。
對于每一個ROI區域,如果檢測得到屬于哪一個分類,就只使用該類的交叉熵誤差進行計算,也即對于一個ROI區域中KxMxM的輸出,真正有用的只是某個類別的MxM的輸出。如下圖所示:
例如目前有3個分類:貓、狗、人,檢測得到當前ROI屬于“人”這一類,那么所使用的Lmask為“人”這一分支的mask。
Mask R-CNN將這些二進制mask與來自Faster R-CNN的分類和邊界框組合,便產生了驚人的圖像精確分割,如下圖所示:
Mask R-CNN是一個小巧、靈活的通用對象實例分割框架,它不僅可以對圖像中的目標進行檢測,還可以對每一個目標輸出一個高質量的分割結果。另外,Mask R-CNN還易于泛化到其他任務,比如人物關鍵點檢測,如下圖所示:
從R-CNN、Fast R-CNN、Faster R-CNN到Mask R-CNN,每次進步不一定是跨越式的發展,這些進步實際上是直觀的且漸進的改進之路,但是它們的總和卻帶來了非常顯著的效果。
最后,總結一下目標檢測算法模型的發展歷程,如下圖所示: