下面會介紹基於ResNet50的Mask RCNN網絡,其中會涉及到RPN、FPN、ROIAlign以及分類、回歸使用的損失函數等
介紹時所采用的MaskRCNN源碼(python版本)來源於GitHub:https://github.com/matterport/Mask_RCNN
下面的介紹都是基於這部分源碼進行的(少數地方會和原始論文中有差別,不過不影響整個網絡的理解)
一) 、整體框架結構
通過對代碼的理解,重新繪制出一張MASKRCNN的整體架構圖
二) 、分解各個節點
1) ResNet50網絡簡單介紹
ResNet50網絡主要用來提取圖片的特征。
MASKRCNN網絡雖然對於輸入圖片的大小沒有要求,但是在代碼中存在IMAGE_MIN_DIM和IMAGE_MAX_DIM兩個參數的定義,會將圖片統一成設定的大小。設定的規則這里主要介紹兩種常用的方式:
①‘squre’:先將圖片較短邊按照IMAGE_MIN_DIM進行等比例縮放,再將圖片以零像素填充到IMAGE_MAX_DIM大小
②‘crop’:同樣,先將圖片較短邊按照IMAGE_MIN_DIM進行等比例縮放,再從圖片中隨機剪裁一個IMAGE_MIN_DIM大小的子圖片作為輸入圖片
這里,基於‘squre’這種方式介紹,即將參數IMAGE_MAX_DIM設定為1024,因此,網絡的輸入圖片大小就是1024*1024
ResNet50網絡比較簡單,主要包括卷積、BN、RELU三步提取特征的操作,其中:
①C1:256*256*64表示特征圖的大小為256*256,特征圖的個數是64個
②C2:256*256*256表示特征圖的大小為256*256,共有256個特征圖
③C3:128*128*512表示特征圖的大小為128*128,共有512個特征圖
④C4:64*64*1024表示特征圖的大小為64*64,共有1024個特征圖
⑤C5:32*32*2048表示特征圖的大小為32*32,共有2048個特征圖
C1和C2的特征圖大小是一樣的,所以,FPN的建立也是基於從C2到C5這四個特征層上。
2) FPN網絡的建立
通過ResNet50網絡,得到圖片不同階段的特征圖,利用C2,C3,C4,C5建立特征圖金字塔結構
①將C5經過256個1*1的卷積核操作得到:32*32*256,記為P5
②將P5進行步長為2的上采樣得到64*64*256,再與C4經過的256個1*1卷積核操作得到的結果相加,得到64*64*256,記為P4
③將P4進行步長為2的上采樣得到128*128*256,再與C3經過的256個1*1卷積核操作得到的結果相加,得到128*128*256,記為P3
④將P3進行步長為2的上采樣得到256*256*256,再與C2經過的256個1*1卷積核操作得到的結果相加,得到256*256*256,記為P2
⑤將P5進行步長為2的最大池化操作得到:16*16*256,記為P6
結合從P2到P6特征圖的大小,如果原圖大小1024*1024,那各個特征圖對應到原圖的步長依次為[P2,P3,P4,P5,P6]=>[4,8,16,32,64]
3) Anchor錨框生成規則
基於上一步得到的特征圖[P2,P3,P4,P5,P6],介紹下MASKRCNN網絡中Anchor錨框的生成,根據源碼中介紹的規則,與之前的Faster-RCNN中的生成規則有一點差別。
①遍歷P2到P6這五個特征層,以每個特征圖上的每個像素點都生成Anchor錨框
②以P2層為例,P2層的特征圖大小為256*256,相對於原圖的步長為4,這樣P2上的每個像素點都可以生成一個基於坐標數組[0,0,3,3]即4*4面積為16大小的Anchor錨框,當然,可以設置一個比例SCALE,將這個基礎的錨框放大或者縮小,比如,這里設置P2層對應的縮放比例為16,那邊生成的錨框大小就是長和寬都擴大16倍,從4*4變成64*64,面積從16變成4096,當然在保證面積不變的前提下,長寬比可以變換為32*128、64*64或128*32,這樣以長、寬比率RATIO=[0.5,1,2]完成了三種變換,這樣一個像素點都可以生成3個Anchor錨框。在Faster-RCNN中可以將SCALE也可以設置為多個值,而在MASKRCNN中則是每一特征層只對應着一個SCALE即對應着上述所設置的16。
③以P2層每個像素點位中心,對應到原圖上,則可生成256*256*3(長寬三種變換)=196608個錨框
④以P3層每個像素點為中心,對應到原圖上,則可生成128*128*3=49152個錨框
⑤以P4層每個像素點為中心,對應到原圖上,則可生成64*64*3=12288個錨框
⑥以P5層每個像素點為中心,對應到原圖上,則生成32*32*3=3072個錨框
⑦以P6層每個像素點為中心,對應到原圖上,則生成16*16*3=768個錨框
從P2到P6層一共可以在原圖上生成261888個Anchor錨框
4) 生成RPN網絡數據集
在上一步已經生成了26188個Anchor錨框,需要借助這些Anchors建立RPN網絡訓練時的正類和負類,
假設需要的正樣本與負樣本共計256個Anchor,即RPN_TRAIN_ANCHORS_PER_IMAGE這個參數所指定。源碼中這步操作由以下幾方面構成:
①先找到所有真實框中那些同時框住了多個物體的框,並排除掉
②計算每個Anchors與該圖片上標注的真實框ground truth之間的IOU
如果anchor box與ground truth的IoU值最大,標記為正樣本,label=1
如果anchor box與ground truth的IoU>0.7,標記為正樣本,label=1
如果anchor box與ground truth的IoU<0.3,標記為負樣本,label=-1
剩下的既不是正樣本也不是負樣本,不用於最終訓練,label=0
同時,保證正樣本為128個,負樣本為128個
除了對anchor box進行標記外,另一件事情就是計算anchor box與ground truth之間的偏移量
令:
ground truth:標定的框也對應一個中心點位置坐標x*,y*和寬高w*,h*
anchor box:中心點位置坐標x_a,y_a和寬高w_a,h_a
所以,偏移量:
△x=(x*-x_a)/w_a △y=(y*-y_a)/h_a
△w=log(w*/w_a) △h=log(h*/h_a)
什么是IoU:
這樣,經過這一步,共找到128個Anchor作為正樣本和128個Anchor作為負樣本, 同時,保存了這256個Anchor與真實框ground truth之間的偏移量
5) RPN網絡的分類與回歸
①前向傳播計算分類得分(概率)和坐標點偏移量
RPN網絡在分類和回歸的時候,分別將每一層的每一個Anchor分為背景和前景兩類,以及回歸四個位移量,比如P2層,特征圖大小為256*256,即像素點有256*256個,每個像素點有三種長寬比例變換,一共有256*256*3個Anchor,如果是分類則需要分別計算每個Anchor為前景的得分(概率)或為背景的得分(概率),其數組可定義為[256*256*3,2],相應的如果是偏移量的回歸則數組對應着形式為[256*256*3,4]
將從P2到P6的所有層進行同樣的分類和回歸操作,一共得到[261888,2]的分類信息和[261888,4]的回歸信息。
②計算RPN網絡損失值反向傳播更新權重
在‘生成RPN網絡數據集’這一步,在261888個Anchors中獲得了256個正負樣本且與真實框的偏移量。
分類:
從前向傳播計算得到的所有Anchors得分數組中即上面所述的[261888,2]數組中找到這256個正樣本和負樣本所對應的得分,利用得分與正負樣本的標簽計算交叉熵損失值。
RPN分類使用的是基於Softmax函數的交叉熵損失函數,Softmax函數只要是將前向傳播計算的得分歸一化到0~1之間的概率值,同時,經過Softmax函數后,也可以保證各個分類的概率不會出現負數
Softmax函數公式:
其中,表示類別j經過網絡前向傳播計算出來的得分,
表示類別j經過Softmax函數后換算得到的概率
基於Softmax的交叉熵公式:
其中,表示的是真實標簽,
表示概率,下面用
代替來表示概率
,看下L的求導結果:
因此假設一個5分類任務,一張圖像經過Softmax層后得到的概率向量p是[0.1,0.2,0.25,0.4,0.05],真實標簽y是[0,0,1,0,0],那么損失回傳時該層得到的梯度就是p-y=[0.1,0.2,-0.75,0.4,0.05]。這個梯度就指導網絡在下一次forward的時候更新該層的權重參數
回歸:
從前向傳播計算得到的所有Anchors偏移量數組中即上面所述的[261888,4]數組中找到這128個正樣本所在索引對應的偏移量,利用此前向傳播計算得到的偏移量與正樣本與真實框之間計算的偏移量計算損失值,使用的是SmoothL1Loss
SmoothL1函數:
對應的損失函數:
其中,,
,
分別表示由前向傳播計算的預測框的坐標值,Anchor錨框對應的坐標值,真實框對應的坐標值
SmoothL1函數的求導:
將預測框與真實框偏移量之間的差值帶入上述公式后可得到損失函數求導后的結果,用此更新權重實現反向傳播
6) 根據RPN調整生成ROI
這一部分對應着總網絡圖中的ProposalLayer層,取出一定量的Anchors作為ROI,這個量由源碼中參數POST_NMS_ROIS_TRAINING確定,假設這個參數在訓練的時候設置為2000,則我們這里需要從261888個Anchors中取出2000個作為ROI
首先,按照Anchors經過RPN網絡前向傳播計算得出的前景(或稱為正樣本)的得分從高到低排序,取出前2000個得分最高的Anchors,相對應的將2000個Anchors經RPN網絡前向傳播計算出的偏移量累加到Anchor box上得到較為准確的box坐標。
其中,紅色的A框是生成的anchor box,而藍色的G’框就是經過RPN網絡訓練后得到的較精確的預測框,綠色的G是ground truth box
最后在返回前,對2000個框再進行一次非最大值抑制NMS操作
用下圖一個案例來對NMS算法進行簡單介紹
如上圖所示,一共有6個識別為人的框,每一個框有一個置信率。
現在需要消除多余的:
- 按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7
- 取最大0.95的框為一個物體框
- 剩余5個框中,去掉與0.95框重疊率IoU大於0.6(可以另行設置),則保留0.9, 0.8, 0.7三個框
- 重復上面的步驟,直到沒有框了,0.9為一個框
- 選出來的為: 0.95, 0.9
進行非最大值抑制的目的主要是需要剔除掉重復的框,如果經過非最大值抑制操作后得到的ROI沒有事先代碼中設定的2000個,則用0填充。
7) 生成RCNN網絡數據集
這一部分對應着總網絡圖中的DetectionTargetLayer層
在經過ProposalLayer層之后得到了2000個經過微調后的ROI,而在DetectionTargetLayer需要對2000個ROI做以下幾步:
①首先剔除掉2000個ROI中不符合條件的ROI,主要是在ProposalLayer層最后返回的時候如果不足2000個會用0填充湊足,將這些用0填充的全部排除掉,避免參與不必要的計算
②DetectionTargetLayer中會用到圖片中的真實框信息,所以,在使用之前同樣將所有真實框中那些同時框住了多個物體的框,並排除掉
③計算每個ROI與真實框之間的IOU值
如果ROI與ground truth的IoU>0.5,標記為正樣本
如果ROI與ground truth的IoU<0.5,標記為負樣本
假定正樣本個數只保留到100個,而負樣本一般保持是正樣本數的3倍,正負樣本總數則就可以達到400個,這個400可有配置文件中TRAIN_ROIS_PER_IMAGE參數確定
④對於每個正樣本,進一步計算與其相交最大即最接近的真實框ground truth box,將這個真實框所對應的類別即class_id賦予這個正樣本,這樣RCNN網絡就可以區分具體哪個類別
⑤同樣,計算每個正樣本ROI與最接近的真實框ground truth box之間的偏移量,這RPN中的計算公式一樣
⑥RCNN網絡還需要保存與每個正樣本ROI最接近的真實框ground truth box的mask掩碼信息,並且知道每個mask大小為參數MASK_SHAPE所指定,一般為28*28,同時知道其所屬於的類別即class_id,進行保存
最后DetectionTargetLayer層返回400個正、負樣本,400個位移偏移量(其中300個由0填充),400個掩碼mask信息(其中300個由0填充)
8) ROI 對齊操作
通過DetectionTargetLayer層,在原圖上找到400個ROI,因為這些ROI可能是有各個特征層產生的Anchor,所以,現在需要將這些ROI映射回特征圖上
第一步,我們需要知道每個ROI如何和特征層對應上,論文中提到的方法是利用下面的公式:
對於公式而言:w,h分別表示ROI寬度和高度;k是這個RoI應屬於的特征層level;是w,h=224,224時映射的level,一般取為4,即對應着P4,至於為什么使用224,一般解釋為是因為這是ImageNet的標准圖片大小,比如現在有一個ROI是112*112,則利用公式可以計算得到k=3,即P3層
第二步,開始討論對齊的方式
當完成每個ROI能找到其對應的特征層后,就同樣可以算出其對應的步長,步長只要用於解釋ROI Align的原理,論文中提到的ROI Align,這個方法的思路:
①使用每個ROI的長、寬除以步長,得到ROI映射到特征圖上的圖片大小,比如ROI為113*113,對應P3層,步長為8,則在特征圖上的感興趣區域則為14.13*14.13
②如果要將特征圖上的感興趣區域對齊到7*7,則需要將14.13*14.13這個區域分成49份,每一份的大小為:2.02*2.02
③再將每個2.02*2.02的小區域,平分四份,每一份取其中心點位置,而中心點位置的像素,采用雙線性插值法進行計算,這樣,就會得到四個點的像素值,取四個像素值中最大值作為這個小區域(即:2.02*2.02大小的區域)的像素值,如此類推,同樣是49個小區域得到49個像素值,組成7*7大小的feature map
以上介紹的是論文中的ROI Align方法,但是在這篇博文開頭提供的代碼鏈接中的源碼並不是這樣處理的。對於ROI映射到特征圖上的方法是一樣的,但當每個ROI找到對應的特征層厚,直接利用Crop and Resize操作,生成7*7大小的feature map
Mask掩碼分支則是對齊成14*14大小的feature map
9) RCNN網絡的類別分類、回歸、mask掩碼分類
①RCNN網絡的類別分類和回歸與RPN網絡中的分類和回歸是一樣的,損失函數也都是基於Softmax交叉熵和SmoothL1Loss,只是RPN網絡中只分前景(正類)、背景(負類),而RCNN網絡中的分類是要具體到某個類別(多類別分類)
②mask掩碼分類
在ROI 對齊操作中mask分支對齊成14*14大小的feature map,並且在‘生成RCNN網絡數據集’操作中知道每個正樣本mask掩碼區域對應的class_id
i) 前向傳播:將14*14大小feature map通過反卷積變換為[28*28*num_class],即每個類別對應一個mask區域,稱之為預測mask
ii) 與‘生成RCNN網絡數據集’操作中的返回的mask也是28*28,並且知道每個mask區域的真實類別class_id,稱之為真實mask
iii) 通過當前得到的真實mask中的類別class_id,遍歷所有的預測mask,找到class_id類別所對應的預測mask(前向傳播中介紹過每個類別都有一個預測mask),比較真實mask與預測mask每個像素點信息,用的是binary_cross_entropy二分類交叉熵損失函數
iv) binary_cross_entropy是二分類的交叉熵,實際是多分類softmax_cross_entropy的一種特殊情況,當多分類中,類別只有兩類時,即0或者1,因為28*28大小的mask中只有0和1,即是像素和不是像素
這個是針對概率之間的損失函數,你會發現只有(預測概率)和
(真實標簽)是相等時,loss才為0,否則loss就是為一個正數。而且,概率相差越大,loss就越大,根據Loss值更改權重實現反向傳播
作為一枚技術小白,寫這篇筆記的時候參考了很多博客論文,在這里表示感謝,同時,未經同意,請勿轉載....