【從零開始學Mask RCNN】二,Mask RCNN框架整體把握

2021-03-02 GiantPandaCV
1. 前言

這一節將從代碼庫裡面的demo.ipynb筆記本入手,來整體理解一下Mask RCNN的網絡架構。

2. Mask RCNN總覽

下面的Figure1展示了這個工程中Mask RCNN的網絡結構示意圖,來自博主疊加態的貓

Mask RCNN總覽,來自疊加態的貓博主

這個結構圖裡面包含了很多細節,我們先大概理一下,後面在源碼詳解中會更詳細的說明:

首先是BackBone,可以看到原始圖片輸入後首先經過一個以ResNet101為基礎的FPN特徵金字塔網絡進行特徵的提取,並且可以發現這裡的實現和原始的FPN不完全相同,它在up-down的特徵上又做了一次卷積進行了進一步的特徵提取。接下來各個FPN層的特徵單獨進到了RPN處理層,即根據Anchor的數目信息確定候選區域的分類(前景和背景)和粗定位結果。這部分的結果用rpn_class和rpn_bbox來表示:
rpn_class:[batch, num_rois, 2]
rpn_bbox:[batch, num_rois, (dy, dx, log(dh), log(dw))]

獲得了大量的候選區域之後,就可以將其送入Proposal篩選部分了,首先會根據前景得分對候選框排序,然後結合配置文件中指定的保留框數目來確定哪些框需要保留,為後面的NMS(非極大值抑制)做準備。再利用RPN的回歸結果來修正Anchors,需要注意的是這裡的anchors都是歸一化後的這就意味著修正之後還需要做邊界限制以防止越界。最後做一個NMS,刪減太多的話直接補上以達到配置文件要求的候選框數目即可。最終,這部分的輸出為rpn_rois:
rpn_rois:[IMAGES_PER_GPU, num_rois, (y1, x1, y2, x2)]

接下來根據候選框的實際大小(歸一化的候選框需要映射回原圖大小)為候選框選擇合適的RPN特徵層,再利用ROI Align處理得到我們最終需要的大小相等一系列子圖。再對這些子圖進行獨立的分類和回歸,獲得的結果為mrcnn_class和mrcnn_bbox(偏移量):
mrcnn_class: [batch, num_rois, NUM_CLASSES] classifier probabilities
mrcnn_bbox(deltas): [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))]

最後,在分類回歸之後使用回歸結果對候選框進行修正,然後重新進行FPN特徵層選擇和ROI Align特徵提取,最後送入Mask分支,進行Mask生成。

總的來說,最後網絡會輸出以下的張量:

# num_anchors,    每張圖片上生成的錨框數量
# num_rois,       每張圖片上由錨框篩選出的推薦區數量,
# #               由 POST_NMS_ROIS_TRAINING 或 POST_NMS_ROIS_INFERENCE 規定
# num_detections, 每張圖片上最終檢測輸出框,
# #               由 DETECTION_MAX_INSTANCES 規定

# detections,     [batch, num_detections, (y1, x1, y2, x2, class_id, score)]
# mrcnn_class,    [batch, num_rois, NUM_CLASSES] classifier probabilities
# mrcnn_bbox,     [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))]
# mrcnn_mask,     [batch, num_detections, MASK_POOL_SIZE, MASK_POOL_SIZE, NUM_CLASSES]
# rpn_rois,       [batch, num_rois, (y1, x1, y2, x2, class_id, score)]
# rpn_class,      [batch, num_anchors, 2]
# rpn_bbox        [batch, num_anchors, 4]

3. 代碼理解3.1 基礎設置

首先導入需要用到的包,然後設置COCO數據集相關文件所在的根目錄,加載模型的路徑以及執行檢測的圖片路徑,代碼如下:

import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt

# Root directory of the project
ROOT_DIR = os.path.abspath("../")

# Import Mask RCNN
sys.path.append(ROOT_DIR)  # To find local version of the library
from mrcnn import utils
import mrcnn.model as modellib
from mrcnn import visualize
# 導入COCO數據集的配置
# 當我們導入一個模塊時:import xxx,默認情況下python解析器會搜索當前目錄、已安# 裝的內置模塊和第三方模塊,搜索路徑存放在sys模塊的path中.
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/"))  # To find local version
import coco
# 使用%matplotlib命令可以將matplotlib的圖表直接嵌入到Notebook之中,或者使用指定# 的界面庫顯示圖表,它有一個參數指定matplotlib圖表的顯示方式
%matplotlib inline 

# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

# Local path to trained weights file
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
# Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
    utils.download_trained_weights(COCO_MODEL_PATH)

# Directory of images to run detection on
IMAGE_DIR = os.path.join(ROOT_DIR, "images")

3.2 網絡配置

接下來需要進行配置設定,新定義了一個Class名為InferenceConfig繼承了coco.CocoConfig類,在demo.ipynb中我們直接使用COCO的預訓練模型所以使用它的設置就可以了。又因為我們這裡需要檢測的是單張圖片,所以需要重寫幾個配置參數,具體如下:

# 父類繼承了Config類,目的就是記錄配置,並在其基礎上添加了幾個新的屬性
class InferenceConfig(coco.CocoConfig):
    # Set batch size to 1 since we'll be running inference on
    # one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()

再列印出配置看一下:

Configurations:
BACKBONE_SHAPES                [[256 256]
 [128 128]
 [ 64  64]
 [ 32  32]
 [ 16  16]]
BACKBONE_STRIDES               [4, 8, 16, 32, 64]
BATCH_SIZE                     1
BBOX_STD_DEV                   [ 0.1  0.1  0.2  0.2]
DETECTION_MAX_INSTANCES        100
DETECTION_MIN_CONFIDENCE       0.5
DETECTION_NMS_THRESHOLD        0.3
GPU_COUNT                      1
IMAGES_PER_GPU                 1
IMAGE_MAX_DIM                  1024
IMAGE_MIN_DIM                  800
IMAGE_PADDING                  True
IMAGE_SHAPE                    [1024 1024    3]
LEARNING_MOMENTUM              0.9
LEARNING_RATE                  0.002
MASK_POOL_SIZE                 14
MASK_SHAPE                     [28, 28]
MAX_GT_INSTANCES               100
MEAN_PIXEL                     [ 123.7  116.8  103.9]
MINI_MASK_SHAPE                (56, 56)
NAME                           coco
NUM_CLASSES                    81
POOL_SIZE                      7
POST_NMS_ROIS_INFERENCE        1000
POST_NMS_ROIS_TRAINING         2000
ROI_POSITIVE_RATIO             0.33
RPN_ANCHOR_RATIOS              [0.5, 1, 2]
RPN_ANCHOR_SCALES              (32, 64, 128, 256, 512)
RPN_ANCHOR_STRIDE              2
RPN_BBOX_STD_DEV               [ 0.1  0.1  0.2  0.2]
RPN_TRAIN_ANCHORS_PER_IMAGE    256
STEPS_PER_EPOCH                1000
TRAIN_ROIS_PER_IMAGE           128
USE_MINI_MASK                  True
USE_RPN_ROIS                   True
VALIDATION_STEPS               50
WEIGHT_DECAY                   0.0001

3.3 模型初始化

接下來初始化模型,然後載入預訓練參數文件,代碼如下:

# 創建前向推理的模型對象
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

# 加載在MS-COCO數據集上訓練的模型權重
model.load_weights(COCO_MODEL_PATH, by_name=True)

注意,這裡模型設置為了inference 模式。然後下面定義了以下COCO的每個類別的目標的名字,太長了這裡就不貼了,可以自己查看代碼。

3.4 檢測單張圖片

接下來就是加載單張圖片,調用模型的detect方法,即可輸出結果,最後使用輔助方法可視化結果,代碼如下:

# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

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

# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            class_names, r['scores'])

獲得的結果圖展示:

示意圖的實例分割結果4. 小結

這一節講了一些這個項目中Mask RCNN的整體架構,再通過demo.ipynb展示了如何加載一個COCO數據集上預訓練的模型預測一張示意圖片並將結果可視化出來。下一節,我們將從網絡結構看起,逐漸深入到項目的細節中。

5. 參考https://www.cnblogs.com/hellcat/p/9789879.html

歡迎關注GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ω•́ )✧

有對文章相關的問題,或者想要加入交流群,歡迎添加BBuf微信:

為了方便讀者獲取資料以及我們公眾號的作者發布一些Github工程的更新,我們成立了一個QQ群,二維碼如下,感興趣可以加入。

公眾號QQ交流群

相關焦點

  • MaskRCNN源碼解讀
    沒有多餘的問文件,源碼都放在mrcnn中,readme裡面有詳細的介紹,為了了解maskrcnn的運行流程,最好的辦法就是將代碼邊運行邊調試。從samples下面的coco文件開始運行:首先要看的就是模型的搭建,也就是maskrcnn的基礎網絡結構。1--模型搭建
  • mask rcnn訓練自己的數據集
    3D視覺工坊的第67篇文章前言最近迷上了mask rcnn,也是由於自己工作需要吧,特意研究了其原始碼,並基於自己的數據進行訓練~本博客參考:https://blog.csdn.net/disiwei1012/article/details/79928679#commentsedit實驗目的
  • 愷明大神 Mask R-CNN 超實用教程
    對象檢測器,如yolo、faster r-cnn和ssd,生成四組(x,y)坐標,表示圖像中對象的邊界框。從獲取對象的邊界框開始挺好的,但是邊界框本身並不能告訴我們(1)哪些像素屬於前景對象,(2)哪些像素屬於背景。是否可以為圖像中的每個對象生成一個MASK,從而允許我們從背景分割前景對象?
  • 愷明大神 Mask R-CNN 超實用教程
    對象檢測器,如yolo、faster r-cnn和ssd,生成四組(x,y)坐標,表示圖像中對象的邊界框。從獲取對象的邊界框開始挺好的,但是邊界框本身並不能告訴我們(1)哪些像素屬於前景對象,(2)哪些像素屬於背景。這就引出了一個問題:是否可以為圖像中的每個對象生成一個MASK,從而允許我們從背景分割前景對象?
  • 輕鬆掌握 MMDetection 中常用算法(二):Faster R-CNN|Mask R-CNN
    2/ Faster R-CNN 代碼詳解為方便算法與代碼的解讀,Faster R-CNN 模型整體流程如下所示: ,其中由於 mask 任務要求更加精細的結果,所以 RoI 特徵區域提取算子輸出特徵圖比 bbox 分支大,一般設置為 14bbox 分支是全連接結構,而 mask 分支是全卷積結構,輸出 shape 為 (batch* num_post,80,28,28),其中 80 表示類別,即輸出的每個通道代表一個類別的 mask由於 mask 分支目的是對前景物體進行分割,故該分支的輸入僅僅包括 Bbox
  • 【前沿】何愷明大神ICCV2017最佳論文Mask R-CNN的Keras/TensorFlow/Pytorch 代碼實現
    摘要我們提出了一個概念上簡單、靈活和通用的用於目標實例分割(object instance segmentation)的框架。此外,Mask R-CNN 可以很容易泛化到其它任務,比如,讓我們可以在同一個框架中估計人類的姿態。我們在 COCO 難題套件的所有 3 種任務(track)上都得到了最佳結果,其中包括實例分割、邊界框目標檢測和人物關鍵點檢測(person keypoint detection)。
  • 如何使用Mask RCNN模型進行圖像實體分割?
    該文章的主要思想是把 Faster RCNN 目標檢測框架進行擴展,添加一個 Mask 分支用於檢測目標框中每個像素的類別,網絡架構如下所示:'rois'], r['masks'],r['class_ids'],                            dataset.class_names, r['scores'], ax=ax,                           title="Predictions")
  • 從零開始 Mask RCNN 實戰:基於 Win10 + Anaconda 的 Mask RCNN 環境搭建
    同時下載 Mask RCNN 的預訓練模型 「mask_rcnn_coco.h5」,放置於本地 Mask_RCNN 開源庫的根目錄下。「mask_rcnn_coco.h5」 下載地址:https://github.com/matterport/Mask_RCNN/releases在裡面的 Mask R-CNN 2.0 下找到 「mask_rcnn_coco.h5」 並下載。3.
  • 何愷明團隊:從特徵金字塔網絡、Mask R-CNN到學習分割一切
    特徵金字塔網絡(Feature Pyramid Networks)讓我們以現在著名的Feature Pyramid Networks(FPN)[1]開始,這是在CVPR 2017發表的論文,作者Tsung-Yi Lin,何愷明等人。FPN的論文真的很棒。構建一個每個人都可以在各種任務、子主題和應用領域中建立的基準模型並不容易。
  • 何愷明等最新論文:實例分割全新方法TensorMask,效果比肩 Mask R-CNN
    框架,為探索密集實例分割方法提供基礎。為了形式化地說明這一點,我們將密集實例分割視為一個 4D 張量 (4D tensors) 的預測任務,並提出了一個名為 TensorMask 的通用框架,該框架顯式地捕獲這種幾何圖形,並支持對 4D tensors 使用新的操作符。
  • Mask R-CNN with OpenCV(上)
    本教程中使用的Mask R-CNN是在COCO dataset上訓練的,其具有L=90個類別,因此Mask R-CNN的mask module的體積大小是100*90*15*15。我們看下圖來想像一下Mask R-CNN的過程:
  • 輕鬆學 Pytorch:行人檢測 Mask-RCNN 模型訓練與使用
    = os.path.join(self.root_dir, "PedMasks", self.masks[idx])        img = Image.open(img_path).convert("RGB")        mask = Image.open(mask_path)        # convert the PIL Image into a numpy
  • 輕鬆學Pytorch –Mask-RCNN圖像實例分割
    Pytorch中使用Mask-RCNN實現實例分割,是基於torchvision的預訓練模型庫,首先需要下載預訓練模型,並檢查是否可以支持GPU推理,相關的代碼如下:model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)model.eval
  • 一文詳解Mask R-CNN算法:實現RoI對準的Two-Stage目標檢測算法
    Mask R-CNN的整體流程圖可以參考文章開頭那個框架圖。它在Faster R-CNN 的基礎上,延伸出了一個Mask分支。~既然多分類效果不好,那我們就嘗試二分類。如下圖所示:二分類的話,我們只考慮一種類別,比如,如果ground truth中標記了這個 bounding box中是個人的話,那我們就只針對人的mask進行分割,而對這個 bounding box 中其他可能存在的物體一律忽視。
  • CVPR 2020 | 美團提出CenterMask,實例分割新網絡!速度/精度更均衡
    Mask Scoring R-CNN[6]通過引入對mask進行打分的模塊來改善分割後mask的質量。上述two-stage的方法可以取得SOTA的效果,但是方法較為複雜且耗時,因此人們也開始積極探索更簡單快速的one-stage實例分割算法。現有的one-stage實例分割算法可以大致分為兩類:基於全局圖像的方法和基於局部圖像的方法。
  • 何愷明團隊計算機視覺最新進展:從特徵金字塔網絡、Mask R-CNN到學習分割一切
    特徵金字塔網絡(Feature Pyramid Networks)讓我們以現在著名的Feature Pyramid Networks(FPN)[1]開始,這是在CVPR 2017發表的論文,master/configs/12_2017_baselines• Keras - https://github.com/matterport/Mask_RCNN/• PyTorch - https://github.com/soeaver/Pytorch_Mask_RCNN/• MXNet - https://github.com/TuSimple/mx-maskrcnn
  • Faster R-CNN
    Mask r-cnn[C]//Computer Vision (ICCV), 2017 IEEE International Conference on. IEEE, 2017: 2980-2988.
  • 輕鬆學Pytorch – 行人檢測Mask-RCNN模型訓練與使用
    = os.path.join(self.root_dir, "PedMasks", self.masks[idx])        img = Image.open(img_path).convert("RGB")        mask = Image.open(mask_path)        # convert the PIL Image into a numpy
  • Facebook 最新論文:Mask R-CNN實例分割通用框架,檢測,分割和特徵...
    近日, FAIR部門的研究人員在這一領域又有了新的突破——他們提出一種目標實例分割(object instance segmentation)框架Mask R-CNN,該框架較傳統方法操作更簡單、更靈活。研究人員把實驗成果《Mask R-CNN》發布在了arXiv上,並表示之後會開源相關代碼。以下為AI科技評論據論文內容進行的部分編譯。