如何使用Mask RCNN模型進行影像實體分割?

AI前線發表於2019-03-04

如何使用Mask RCNN模型進行影像實體分割?

作者 | 武維
編輯 | Emily Chen
目標檢測與實體分割

目標檢測是計算機視覺和模式識別的重要研究方向,主要是確定影像中是否有感興趣的目標存在,並對其進行探測和精確定位。傳統的目標檢測流程採用滑動視窗進行區域選擇,然後採用 SIFT、HOG 等方法進行特徵提取,最後採用 SVM、Adaboost 進行類別判斷。但是傳統的目標檢測方法面臨的主要問題有:特徵提取魯棒性差,不能反應光照變化、背景多樣等情況;區域選擇沒有針對性,時間複雜度高,視窗冗餘。基於深度學習的目標檢測模型有 Faster RCNN,Yolo 和 Yolo2,SSD 等,對圖片中的物體進行目標檢測的應用示例如下所示:

如何使用Mask RCNN模型進行影像實體分割?

從上圖中可以看出,目標檢測主要指檢測一張影像中有什麼目標,並使用方框表示出來;而實體分割要標出每個畫素所屬的類別。下圖的實體分割,不僅把每個物體的方框標註出來,並且把每個方框中畫素所屬的類別也標記出來。下圖中每個方框中包含的資訊有目標所屬類別,置信概率以及方框中每個畫素的類別。

更多幹貨內容請關注微信公眾號“AI 前線”,(ID:ai-front)

如何使用Mask RCNN模型進行影像實體分割?

Kaiming He 等於 2017 年提出 Mask RCNN 網路結構,該網路結構主要用於目標檢測和實體分割,並且贏得了 COCO 2016 挑戰賽的冠軍。該文章的主要思想是把 Faster RCNN 目標檢測框架進行擴充套件,新增一個 Mask 分支用於檢測目標框中每個畫素的類別,網路架構如下所示:

如何使用Mask RCNN模型進行影像實體分割?

本文章主要講解,應用 MaskRCNN 模型實現 Color Splash(色彩大師)的效果以及 Mask RCNN 模型的技術要點包括訓練資料,主幹網路,Region Proposal 生成,ROIAlign,基於 FCN 網路的 mask 特徵,以及 Mask 的 Loss 函式計算。

Mask RCNN 應用示例

本節主要介紹應用 Mask RCNN 模型實現 Color Splash(色彩大師)的效果,識別彩色圖片中的氣球部分,保留該部分為彩色;但把圖片中的其它部分轉換為灰度色,原始圖片如下所示:

如何使用Mask RCNN模型進行影像實體分割?

轉換後圖片如下所示:

如何使用Mask RCNN模型進行影像實體分割?

該應用的主要思想為:準備標註過氣球的訓練資料;執行 Mask RCNN 的訓練;訓練完畢後,對測試圖片進行 Inference,找到氣球部分的 mask 掩碼;使用 open cv 的 API,把圖片中非氣球部分的影像轉換為黑白色。

1.訓練資料準備:首先從https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip下載標註過的訓練資料。資料結構如下所示, 其中,***.jpg為原始圖片,via_region_data.json為圖片的標註檔案。

train/

—image1.jpg

—image2.jpg

—***.jpg

—via_region_data.json

val/

—image1.jpg

—image2.jpg

—***.jpg

—via_region_data.json

標註檔案的內容格式如下所示,圖片中的標註區域為多邊形 polygon,all_points_x 和 all_points_y 為分別表示多邊形每個頂點的 x,y 座標值。

# Loadannotations

# { `filename`:`28503151_5b5b7ec140_b.jpg`,

# `regions`: {

# `0`: {

# `region_attributes`: {},

# `shape_attributes`: {

# `all_points_x`: […],

# `all_points_y`: […],

# `name`: `polygon`}},

# … more regions …

# },

# `size`: 100202

# }

2.模型訓練:從 https://github.com/matterport/Mask_RCNN.git 下載 MaskRCNN 程式碼,該程式碼由 matterport 公司開源,模型主要由 keras 和 tensorflow API 實現。本應用的模型訓練主函式程式碼為 Mask_RCNN/samples/balloon/balloon.py, 執行下述程式碼進行模型訓練:python balloon.py train –dataset=/path/to/balloon/dataset本應用中,模型訓練的主要配置引數為:

# 每次迭代GPU上訓練的圖片數量,如果gpu視訊記憶體為12GB,一般可同時訓練2個圖片

IMAGES_PER_GPU = 2

# 目標檢測的類別數量,包含背景色

NUM_CLASSES = 1 + 1 # 背景 + 氣球

# 每個epoch的訓練迭代次數

STEPS_PER_EPOCH = 100

# 目標檢測出來的最小置信度

DETECTION_MIN_CONFIDENCE = 0.9

模型推理及效果展示:

#首先設定推理的圖片數量,如下所示:

class InferenceConfig(config.__class__):

GPU_COUNT = 1

IMAGES_PER_GPU = 1

config = InferenceConfig()

#然後建立Inferencemodel:

model = modellib.MaskRCNN(mode=”inference”,model_dir=MODEL_DIR,config=config)

#載入模型權重

model.load_weights(weights_path, by_name=True)

#執行目標檢測

results = model.detect([image], verbose=1)

#顯示檢測結果

visualize.display_instances(image, r[`rois`], r[`masks`],r[`class_ids`],

dataset.class_names, r[`scores`], ax=ax,

title=”Predictions”)

如何使用Mask RCNN模型進行影像實體分割?

#顯示colorsplash效果

splash =balloon.color_splash(image, r[`masks`])

display_images([splash], cols=1)

如何使用Mask RCNN模型進行影像實體分割?

Mask RCNN 關鍵技術

Mask RCNN 是基於 Faster RCNN 的網路框架,在基礎特徵網路之後又加入了全卷積的 Mask 分割子網,由原來的分類、迴歸檢測任務,變成了分類、迴歸、分割檢測任務。本節主要介紹 Mask RCNN 中的關鍵技術,包括訓練資料,Faster RCNN 網路結構,主幹網路,Region Proposal,ROIAlign,基於 FCN 網路的 mask 特徵,以及 Mask 損失函式。

  • 訓練資料:

Faster RCNN 網路主要用於 bounding box 的位置和類別的預測,所以訓練資料主要包含 bounding box 的類別資訊和位置資訊。如下所示:

(x1,y1,x2,y2)—-balloon

如何使用Mask RCNN模型進行影像實體分割?

而 Mask RCNN 還需要預測 bounding box 中每個畫素所屬的類別,所以還需要相應的 mask 資訊,需要用多邊形標註出來,如下所示:

(x1,x2,x3,……)(y1,y2,y3,……) —-balloon

如何使用Mask RCNN模型進行影像實體分割?

影像中每個畫素的 mask 資訊一般用 0,1 表示,其中 0 表示背景色,1 表示對應畫素的 mask 值。通常用 binary 的二維矩陣表示 [height, width], 該 mask 矩陣可通過 open cv 的 API 生成。下圖為對應 mask 的示例效果圖:

如何使用Mask RCNN模型進行影像實體分割?

  • Faster RCNN 網路結構

2016 年,基於 SPP 和 Fast RCNN 的思想,Shaoqing Ren, Kaiming He, Ross Girshick 提出了新的 Faster RCNN 的網路結構。該網路結構將區域生成網路(Region Proposal Networks, RPN)和 Fast RCNN 整合到一個端到端的網路中,提高了目標檢測的速度及精確度。Faster RCNN 屬於基於候選區域生成的目標檢測網路,網路的巨集觀架構如下圖所示:

如何使用Mask RCNN模型進行影像實體分割?

首先向共享的卷積特徵模組提供輸入圖片。一方面提供 RPN 網路的特徵提取資訊,另一方面繼續向前傳播,生成特徵圖供 ROI Pooling 模型使用。

針對 RPN 網路的的輸入特徵圖,通過滑動視窗方法生成 Anchors 和相應的特性資訊,然後生成區域建議和區域得分,並對區域得分採用非極大值抑制方法得到建議區域,給 ROI 池化層用。對上述兩部得到的特徵圖和區域建議同時輸入 ROI 池化層,提取對應區域的特徵。對建議區域的特徵資訊,輸出分類得分以及迴歸後的 bounding-box。

  • 主幹網路

Mask RCNN 的主幹網路採用了 Resnet50/101+FPN 的網路結構。原始圖片在進入主幹網路網路前,需要先 resize 成固定大小的圖片,比如 1024*1024。如下所示,小於 1024 的高度或寬度用 0 填存。這樣主幹網路的圖片輸入大小為 [1024,1024]。

在 ResNet50/101 的主幹網路中,使用了 ResNet 中 Stage2,Stage3,Stage4,Stage5 的特徵圖,每個特徵圖對應的圖片 Stride 為 [4, 8, 16, 32],其中 stride 會影響圖片大小的縮放比例,計算公式為 feature_size=imageSize/strideSize。這樣 [Stage2,Stage3,Stage4,Stage5] 對應的特徵圖大小為 [256*256,128*128,64*64,32*32]。ResNet 網路結構如下圖所示,其中 conv2_x,conv3_x,conv4_x,conv5_x 分別對應 Stage2,Stage3,Stage4,Stage5。

如何使用Mask RCNN模型進行影像實體分割?

基於 [Stage2,Stage3,Stage4,Stage5] 的特徵圖,構建 FPN(feature pyramid networks,特徵金字塔網路)結構。在目標檢測裡面,低層的特徵圖資訊量比較少,但是特徵圖比較大,所以目標位置準確,所以容易識別一些小物體;高層特徵圖資訊量比較豐富,但是目標位置比較粗略,特別是 stride 比較大(比如 32),影像中的小物體甚至會小於 stride 的大小,造成小物體的檢測效能急劇下降。為了提高檢測精度,Mask RCNN 中採用瞭如下的 FPN 的網路結構,一個自底向上的線路,一個自頂向下的線路以及對應層的連結。其中 1*1 的卷積核用於減少了 feature map 的個數;2up 為圖片上取樣,生成和上層 stage 相同大小的 feature map;最後相加對應元素,生成新的特徵圖。

如何使用Mask RCNN模型進行影像實體分割?

Mask RCNN 中自底向上的網路結構,為上述介紹的 ResNet50/101,對應的特徵圖為 [Stage2,Stage3,Stage4,Stage5],自頂向下的網路結構,把上取樣的結果和上層 Stage 的特徵圖進行元素相加操作,生成新的特徵圖 [P2, P3, P4, P5, P6], 如下所示:

P5 對應 C5

P4 對應 C4+ UpSampling2D(P5)

P3 對應 C4+ UpSampling2D(P4)

P2 對應 C4+ UpSampling2D(P3)

P6 對應 MaxPooling2D(strides=2) (P5)

這樣最後生成的 FPN 特徵圖集合為 [P2,P3,P4,P5,P6],每個特徵圖對應的 Stride 為 [4, 8, 16, 32,64],對應的特徵圖大小為 [256*256,128*128,64*64,32*32,16*16],對應的 anchor 大小為 [32, 64, 128, 256, 512],這樣底層的特徵圖用於去檢測較小的目標,高層的特徵圖用於去檢測較大的目標。

  • Region Proposal

在卷積特徵圖上,用 3*3 的視窗執行卷積操作。對特徵圖中的每個中心點,選取 k 個不同 scale、aspect ratio 的 anchor。按照 scale 和 aspect ratio 對映回原圖,生成候選的 region proposals。特徵圖中的每個點會生成對應視窗區域的特徵編碼(源論文中是對應 256 維的低維特徵編碼)。接著對該低維的特徵編碼做卷積操作,輸出 2*k 分類特徵和 4*k 迴歸特徵,分別對應每個點每個 anchor 屬於目標的概率以及它所對應的物體的座標資訊。如下圖所示:

如何使用Mask RCNN模型進行影像實體分割?

例如特徵圖中每個點對應的 anchor 大小為 128*128畫素,256*256畫素,512*512 畫素,每個 anchor 的長寬比為1:1,1:2,2:1,這樣特徵圖中的每個點會對應 9 個 anchor,假設特徵圖大小為60*40,這樣特徵圖大概會生成60*40*9個 anchor,大約 2 萬個。同時特徵圖上的每個點會對應 60*40*9 region proposal box 的迴歸特徵和分類特徵。對 60*40*9 個分類特徵,按照分數排序,然後選取前 N 個迴歸框特徵,比如前 5000 個。然後把迴歸框的值 (dy, dx, log(dh), log(dw)) 解碼為 bounding box 的真實座標 (y1, x1, y2, x2) 值。兩類座標的對應方式如論文中公式所示:

如何使用Mask RCNN模型進行影像實體分割?

其中:(x_a,y_a)為對應 anchor 的中心點座標,(w_a,h_a)為 anchor 的高度和寬寬。(x,y)為對應原圖中預測出來的 ROI 的中心點座標,(w,h)為對應原圖中預測出來的 ROI 的高度和寬寬。(t_x,t_y)為對應特徵圖中心點座標的迴歸值,(t_w,t_h)為對應特徵圖中的高度和寬度的迴歸值。接著通過非極大值一致演算法 NMS 選擇一定數量的 ROI region,比如說 2000 個。然後計算 ROI region 和 gt_boxes 的重疊覆蓋情況,選擇一個數量的 TRAIN_ROIS_PER_IMAGE,比如說 200 個進行訓練。可以採用如下規則:

  • 假如某 ROI 與任一目標區域的 IoU 最大,則該 anchor 判定為有目標。

  • 假如某 ROI 與任一目標區域的 IoU>0.5,則判定為有目標;

  • 假如某 ROI 與任一目標區域的 IoU<0.5,則判定為背景。

其中 IoU,就是預測 box 和真實 box 的覆蓋率,其值等於兩個 box 的交集除以兩個 box 的並集。其它的 ROI 不參與訓練。還可設定 ROI_POSITIVE_RATIO=0.33,比如說 33% 的 ROI 為正樣本,其它為負樣本。

  • ROI Pooling/Align

是把原圖的左上角和右下角的候選區域對映到特徵圖上的兩個對應點,這個可基於影像的縮放比例進行對映。首先把原圖中 ROI 中的 bounding boxing 座標 (y1, x1, y2, x2) 進行歸一化處理,然後在特徵圖中把歸一化的座標對映為特徵圖中的座標,這樣就生成了特徵圖中對應的 ROI 區域座標,如下圖所示:

如何使用Mask RCNN模型進行影像實體分割?

由於 ROI 對映出來的特徵區域大小是不同的,而神經網路要求對類別預測特徵和 box 位置迴歸特徵的大小是固定的。這時候需要用 ROI Pooling 把大小不同的候選區域特徵對映到固定大小的特徵區域。ROI Pooling 的具體實現可以看做是針對 ROI 區域特徵圖的 Pooling,只不過因為不是固定尺寸的輸入,因此每次的 pooling 網格大小需要計算,如下圖所示:

如何使用Mask RCNN模型進行影像實體分割?

RoI Pooling 為從原圖 ROI 區域對映到特徵圖 ROI 區域, 會對 ROISize / stride 的對映值進行取整操作,再經過最大值池化後的特徵與原 ROI 之間的空間不對齊就更加明顯了。ROI Align 從原圖到特徵圖直接的 ROI 對映直接使用雙線性插值,不取整,這樣誤差會小很多,經過池化後再對應回原圖的準確性也更高些。論文中的 ROI Align 基本思想,如下圖所示:

如何使用Mask RCNN模型進行影像實體分割?

上圖中虛線框為 5*5 的特徵圖,實線框框為的對映到特徵圖上的 ROI 區域,要對該 ROI 區域做 2*2 的 Pooling 操作。首先把該 ROI 區域劃分為 2*2 的區域,共 4 個;然後在每個小區域中選擇 4 個取樣點和距離該取樣點最近的 4 個特徵點的畫素值,使用插值的方法得到每個取樣點的畫素值;最後計算每個小區的 MaxPooling,生成 ROI 區域的 2*2 大小的特徵圖。

  • 基於 FCN 網路的 mask 特徵

基於 FCN(Fully Convolutional Networks,全卷積網路),把 ROI 區域對映為一個 m*m *numclass 的特徵層,例如 28*28*80,論文中結構如下:

如何使用Mask RCNN模型進行影像實體分割?

對 ROIAlign 操作生成的 ROI 區域固定大小的特徵圖,經過 4 個卷積操作後,生成14*14大小的特徵圖;然後經過上取樣生成 28*28 大小的特徵圖;最後通過卷積操作生成大小為 28*28,深度為 80 的特徵圖。上述過程為全卷積網路,這樣可以保證 mask 分支的每一層都有 m*m 大小的空間佈局,不會缺少空間維度的向量。並且與全連線層預測 mask 相比,FCN 需要更少的引數,可以得到更好的效果。

  • Mask 損失函式

Mask RCNN 採用了多工的損失函式,每個 ROI 區域的損失函式包含三部分:bounding box 的分類損失值,bounding box 位置迴歸損失值,mask 部分的損失值,其中 bounding box 的分類損失值和位置迴歸損失值同 Faster RCNN 類似。每個 ROI 區域會生成一個 m*m*numclass 的特徵層,特徵層中的每個值為二進位制掩碼,為 0 或者為 1。根據當前 ROI 區域預測的分類,假設為 k,選擇對應的第 k 個 m*m 的特徵層,對每個畫素點應用 sigmoid 函式,然後計算平均二值交叉損失熵,如下圖所示:

如何使用Mask RCNN模型進行影像實體分割?

上圖中首先得到預測分類為 k 的 mask 特徵,然後把原圖中 bounding box 包圍的 mask 區域對映成 m*m 大小的 mask 區域特徵,最後計算該 m*m 區域的平均二值交叉損失熵。

總結

本文首先介紹了目標檢測和實體分割的背景及差異,實體分割要在每一個畫素上都檢測出所屬的類別。然後講解了如何應用 Mask RCNN 模型實現 Color Splash(色彩大師)的效果;並對 Mask RCNN 的關鍵技術進行分析,主要包括訓練資料,Faster RCNN 網路結構,主幹網路(ResNet50/101+FPN),Region Proposal,ROI Align,基於 FCN 網路的 Mask 特徵,以及 Mask 損失函式。使用者可應用 Mask RCNN 模型架構到工業領域中相關目標檢測和實體分割場景,如下所示:

如何使用Mask RCNN模型進行影像實體分割?

參考文獻

[1] https://github.com/matterport/Mask_RCNN

[2] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

[3] Mask R-CNN

[4] ResNet:Deep Residual Learning for Image Recognition

[5] FPN: Feature Pyramid Networks for Object Detection

作者簡介

武維(微信:allawnweiwu):博士,現為 IBM 架構師。主要從事深度學習平臺及應用研究,大資料領域的研發工作。

相關文章