MaskRCNN模型解讀


背景:

  DL訓練框架采用Pytorch,推理框架使用Caffe,模型使用的是基於Facebook新出的MaskRCNN改進版,主要使用ADAS的視覺感知,包括OD,車道線,語義分割等網絡。

整體框架:

在這里插入圖片描述

​ 圖1 Mask R-CNN整體架構

  Mask R-CNN是一個非常靈活的框架,可以增加新的分支完成不同任務,如:目標分類、目標檢測、語義分割、實例分割、人體姿勢識別等多種任務。框架延續Faster-RCNN,在基礎特征網絡后加入了全連接的分割子網,由原來兩個任務變為三個任務,采用和Faster-RCNN相同的兩個階段。

 第一階段有相同的層(RPN),掃描圖像生成提議框(proposals,可能包含目標的區域)

 第二階段除分類和bbox回歸外,又添加了一個全卷積網絡分支,對每個ROI預測對應二值掩碼(binary mask),決定像素是否是目標一部分。(所謂掩碼,就是當像素屬於目標所在位置時標識為1,否則為0)。從而將任務簡化為多階段,解耦多個子任務。

 

 流程如下:

一、輸入一張圖片,進行相應預處理;

二、將其輸入到預訓練好的神經網絡中,獲得對應的feature map;

三、對該feature map中的每個點設定預定好數量的ROI,從而獲得多個候選ROI; 

四、將這些候選ROI送入RPN網絡進行二值分類(前景或背景)和BBOX回歸,過濾掉一些候選的ROI;

五、對這些剩下的ROI進行ROIAlign操作;

六、對這些ROI進行分類(N類別分類),BBOX回歸和MASK生成(在每個ROI里面進行FCN操作)

其中虛框里為FasterRCNN部分,下方紅框為Maskrcnn新修改部分。

新增部分:

1、ResNet+FPN

    替換了VGG網絡,轉而使用特征表達能力更強的殘差網絡,為了挖掘多尺度,還使用了FPN結構;

2、將RoI pooling替換為RoiAlign

    解決misalign問題,就是對feature map的插值,roi pooling出來會與實際物體有微小偏移;

3、添加並列的FCN層(mask層)

 用於語義分割的全卷積網絡

 

架構分解:

一、主干網

 采用了深度殘差網絡,太深的網絡會訓練效果會退化,Resnet使用了跨層連接,使訓練更容易

 網絡輸出f(x)+x,網絡特別深時殘差會趨近於0,從而實現了恆等變換。

采用了兩種卷積:跳過三個卷積的identity block和跳過三個卷積並在shortcut上存在卷積的conv block,第三個卷積層與shortcut上在卷積都沒激活,而是先相加再激活。

 采用1x1的卷積實現降維從而加帶卷積運算。

 Resnet101分為5個階段,,這些輸出后會接FPN。

二、FPN

   為了實現更好的特征整合,最后一層語義強,但位置信息和分辨率較低,容易檢測不到小物體,FPN功能就是融合底層到高層的feature map,從而充分利用了提取到的各階段的特征。

  

 采用了top-down的結構和橫向連接,以此融合具有高分辨率的淺層layer和具有豐富語義信息的深層layer,從而實現了從單尺度的輸入圖像上,快速構建在所有尺度上都具有強語義信息的特征金字塔,同時並不產生明顯的開銷。

 FPN是一個窗口大小固定的滑動窗口檢測器,在不同的層滑動可以增加其對尺度變化的魯棒性。

FPN特征融合圖

殘差模塊輸出層{C2,C3,C4,C5},對應融合特征層為{P2,P3,P4,P5},對應層間尺寸是相同的。

高層做2倍上采樣(最鄰近上采樣,可以參考反卷積),然后與對應的前一層特征結合,前一層要經過1x1卷積,改變通道數,再做像素間加法。

最后采用3x3卷積去處理已經融合好的特征圖,是為了消除上采樣的混疊效應。

  使用P2-P5來預測物體bbox,而P2-P6是用於訓練RPN的,即P6只用於RPN中。

三、RPN  

  RPN是用於區域選擇的子網絡,在FasterRCNN中,是在13x13x256的特征圖上應用9咱不同尺度的anchor。而MaskRCNN,把特征圖設置成多尺度的,然后固定每種特征圖對應的anchor尺寸,即{P2,P3,P4,P5,P6}分別對應的anchor尺度為{32^2,64^2, 128^2, 256^2, 512^2 },當然目標不可能都是正方形,所以采用了三個比例:{1:2, 1:1, 2:1},所以金字塔結構中共有15種anchors。

RPN結構如下:

各階層共享后面的分類網絡,所以輸出通道數要保持一致。

正負樣本的界定:

 如果某個anchor和一個給定的ground truth有最高的IOU或者和任意一個Ground truth的IOU都大於0.7,則是正樣本。如果一個anchor和任意一個ground truth的IOU都小於0.3,則為負樣本。

四、ROIAlign

  ROI Pooling為了得到固定大小(7X7)的feature map,我們需要做兩次量化操作:

1)圖像坐標 — feature map坐標,

2)feature map坐標 — ROI feature坐標。

做segment是pixel級別的,但是faster rcnn中roi pooling有2次量化操作導致了沒有對齊 .

 例:我們輸入的是一張800x800的圖像,在圖像中有兩個目標(貓和狗),狗的BB大小為665x665,經過VGG16網絡后,我們可以獲得對應的feature map,如果我們對卷積層進行Padding操作,我們的圖片經過卷積層后保持原來的大小,但是由於池化層的存在,我們最終獲得feature map 會比原圖縮小一定的比例,這和Pooling層的個數和大小有關。在該VGG16中,我們使用了5個池化操作,每個池化操作都是2Pooling,因此我們最終獲得feature map的大小為800/32 x 800/32 = 25x25(是整數),但是將狗的BB對應到feature map上面,我們得到的結果是665/32 x 665/32 = 20.78 x 20.78,結果是浮點數,含有小數,但是我們的像素值可沒有小數,那么作者就對其進行了量化操作(即取整操作),即其結果變為20 x 20,在這里引入了第一次的量化誤差;然而我們的feature map中有不同大小的ROI,但是我們后面的網絡卻要求我們有固定的輸入,因此,我們需要將不同大小的ROI轉化為固定的ROI feature,在這里使用的是7x7的ROI feature,那么我們需要將20 x 20的ROI映射成7 x 7的ROI feature,其結果是 20 /7 x 20/7 = 2.86 x 2.86,同樣是浮點數,含有小數點,我們采取同樣的操作對其進行取整吧,在這里引入了第二次量化誤差。其實,這里引入的誤差會導致圖像中的像素和特征中的像素的偏差,即將feature空間的ROI對應到原圖上面會出現很大的偏差。原因如下:比如用我們第二次引入的誤差來分析,本來是2.86,我們將其量化為2,這期間引入了0.86的誤差,看起來是一個很小的誤差呀,但是你要記得這是在feature空間,我們的feature空間和圖像空間是有比例關系的,在這里是1:32,那么對應到原圖上面的差距就是0.86 x 32 = 27.52。這個差距不小吧,這還是僅僅考慮了第二次的量化誤差。這會大大影響整個檢測算法的性能

  為了解決ROI Pooling的上述缺點,作者提出了ROI Align這一改進的方法(如上圖)。ROI Align的思路很簡單:取消量化操作,使用雙線性插值的方法獲得坐標為浮點數的像素點上的圖像數值,從而將整個特征聚集過程轉化為一個連續的操作。如下圖所示:

藍色的虛線框表示卷積后獲得的feature map,黑色實線框表示ROI feature,最后需要輸出的大小是2x2,那么我們就利用雙線性插值來估計這些藍點(虛擬坐標點,又稱雙線性插值的網格點)處所對應的像素值,最后得到相應的輸出。這些藍點是2x2Cell中的隨機采樣的普通點,作者指出,這些采樣點的個數和位置不會對性能產生很大的影響,你也可以用其它的方法獲得。然后在每一個橘紅色的區域里面進行max pooling或者average pooling操作,獲得最終2x2的輸出結果。我們的整個過程中沒有用到量化操作,沒有引入誤差,即原圖中的像素和feature map中的像素是完全對齊的,沒有偏差,這不僅會提高檢測的精度,同時也會有利於實例分割。

在這里插入圖片描述
​ 雙線性插值

  • 遍歷每一個候選區域,保持浮點數邊界不做量化。

  • 將候選區域分割成k x k個單元,每個單元的邊界也不做量化。

  • 在每個單元中計算固定四個坐標位置,用雙線性內插的方法計算出這四個位置的值,然后進行最大池化操作。

這里對上述步驟的第三點作一些說明:這個固定位置是指在每一個矩形單元(bin)中按照固定規則確定的位置。比如,如果采樣點數是1,那么就是這個單元的中心點。如果采樣點數是4,那么就是把這個單元平均分割成四個小方塊以后它們分別的中心點。顯然這些采樣點的坐標通常是浮點數,所以需要使用插值的方法得到它的像素值。在相關實驗中,作者發現將采樣點設為4會獲得最佳性能,甚至直接設為1在性能上也相差無幾。

事實上,ROI Align 在遍歷取樣點的數量上沒有ROIPooling那么多,但卻可以獲得更好的性能,這主要歸功於解決了misalignment的問題。值得一提的是,我在實驗時發現,ROI Align在VOC2007數據集上的提升效果並不如在COCO上明顯。經過分析,造成這種區別的原因是COCO上小目標的數量更多,而小目標受misalignment問題的影響更大(比如,同樣是0.5個像素點的偏差,對於較大的目標而言顯得微不足道,但是對於小目標,誤差的影響就要高很多)。

在這里插入圖片描述
​ ROIAlign技術

如圖所示,為了得到為了得到固定大小(7X7)的feature map,ROIAlign技術並沒有使用量化操作,即我們不想引入量化誤差,比如665 / 32 = 20.78,我們就用20.78,不用什么20來替代它,比如20.78 / 7 = 2.97,我們就用2.97,而不用2來代替它。這就是ROIAlign的初衷。那么我們如何處理這些浮點數呢,我們的解決思路是使用“雙線性插值”算法。雙線性插值是一種比較好的圖像縮放算法,它充分的利用了原圖中虛擬點(比如20.56這個浮點數,像素位置都是整數值,沒有浮點值)四周的四個真實存在的像素值來共同決定目標圖中的一個像素值,即可以將20.56這個虛擬的位置點對應的像素值估計出來。

roi-align總結:

對於每個roi,映射之后坐標保持浮點數,在此基礎上再平均切分成k*k個bin,這個時候也保持浮點數。再把每個bin平均分成4個小的空間(bin中更小的bin),然后計算每個更小的bin的中心點的像素點對應的概率值。這個像素點大概率是一個浮點數,實際上圖像的浮點是沒有像素值的,但這里假設這個浮點數的位置存儲一個概率值,這個值由相鄰最近的整數像素點存儲的概率值經過雙線性插值得到,其實也就是根據這個中心點所在的像素值找到所在的大bin對應的4個整數像素存儲的值,然后乘以多個參數進行插值。這些參數其實就是那4個整數像素點和中心點的位置距離關系構成參數。最后再在每個大bin中對4個中心點進行max或者mean的pooling。

在這里插入圖片描述

其實就是對每個格子再次划分四個格子,進行四次采樣,每次采樣的位置都是四個格子的中心點,由於我知道了它的位置,但是不知道這個中心點位置的具體像素值是多少,所以采用雙線性插值法求這個中心點位置的具體像素(利用它周圍位置的像素點求),然后對着四個位置的像素值取最大值,得到這個大格子的輸出。


免責聲明!

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



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