Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

インスタンス セグメンテーションの Mask R-CNN 入門

インスタンス セグメンテーションは、オブジェクトの検出されたインスタンスごとにセグメンテーション マップを生成する拡張タイプのオブジェクト検出です。インスタンス セグメンテーションは、オブジェクトのクラスに関係なく、個々のオブジェクトを個別のエンティティとして扱います。対照的に、セマンティック セグメンテーションは、同じクラスのすべてのオブジェクトを単一のエンティティに属するものと見なします。

Mask R-CNN は、検出されたオブジェクト[1]に対してピクセルレベルのセグメンテーションを実行する一般的な深層学習インスタンス セグメンテーション手法です。Mask R-CNN アルゴリズムは、複数のクラスと重複するオブジェクトに対応できます。

maskrcnn オブジェクトを使用して、事前学習済みの Mask R-CNN ネットワークを作成できます。ネットワークは MS-COCO データ セットについて学習済みで、80 個の異なるクラスのオブジェクトを検出できます。maskrcnn オブジェクトと共に関数 segmentObjects を使用して、インスタンス セグメンテーションを実行します。

追加のクラスを検出するようにネットワークを変更する場合、またはネットワークの他のパラメーターを調整する場合は、続けて転移学習を実行できます。Mask R-CNN の転移学習は通常、次の手順に従います。

  1. maskrcnn オブジェクトを使用して、転移学習用の Mask R-CNN モデルを構成します。

  2. 学習データを準備します。

  3. 関数 trainMaskRCNN を使用して、モデルに学習させます。

  4. 関数 evaluateInstanceSegmentation を使用して Mask R-CNN モデルを評価します。

Mask R-CNN に学習させる方法を示す例については、Mask R-CNN を使用したインスタンス セグメンテーションの実行を参照してください。

Mask R-CNN モデルの設計

転移学習用に Mask R-CNN ネットワークを構成するには、maskrcnn オブジェクトの作成時にクラス名とアンカー ボックスを指定します。オプションで、ネットワーク入力サイズや ROI プーリング サイズなどの追加のネットワーク プロパティを指定できます。

Mask R-CNN ネットワークは、2 つの段階で構成されています。最初の段階は、アンカー ボックスに基づいてオブジェクト提案の境界ボックスを予測する領域提案ネットワーク (RPN) です。2 つ目の段階は、これらの提案を調整し、分類し、ピクセル レベルのセグメンテーションを計算する R-CNN 検出器です。

RPN as part of a Feature Extractor, followed by object classification, yields bounding boxes and semantic segmentation masks for an input image

Mask R-CNN モデルは Faster R-CNN モデルに基づいています。Mask R-CNN は、Faster R-CNN の ROI 最大プーリング層を、より正確なサブピクセル レベルの ROI プーリングを提供する roiAlignLayer に置き換えます。Mask R-CNN ネットワークは、ピクセル レベルのオブジェクト セグメンテーション用のマスク分岐も追加します。Faster R-CNN ネットワークの詳細については、R-CNN、Fast R-CNN および Faster R-CNN 入門を参照してください。

この図は、左側に変更された Faster R-CNN ネットワーク、右側にマスク分岐を示しています。

Faster R-CNN network connected to a mask branch using an ROI align layer

Mask R-CNN の学習データの準備

データの読み込み

Mask R-CNN に学習させるには、次のデータが必要です。

データ説明
RGB イメージ

ネットワーク入力として機能する RGB イメージ。H x W x 3 の数値配列として指定します。

たとえば、このサンプルの RGB イメージは、個人を特定できる情報を削除するために編集された CamVid データ セット[2]から変更されたイメージです。

RGB image of a street scene with vehicles and pedestrians

グラウンド トゥルース境界ボックス

RGB イメージ内のオブジェクトの境界ボックス。NumObjects 行 4 列の行列として指定します。行の形式は [x y w h] です。

たとえば、変数 bboxes は、サンプルの RGB イメージ内の 6 つのオブジェクトの境界ボックスを示します。

bboxes =

   394   442    36   101
   436   457    32    88
   619   293   209   281
   460   441   210   234
   862   375   190   314
   816   271   235   305

インスタンス ラベル

各インスタンスのラベル。NumObjects 行 1 列の string ベクトル、または NumObjects 行 1 列の文字ベクトルの cell 配列として指定します。

たとえば、変数 labels は、サンプルの RGB イメージ内の 6 つのオブジェクトのラベルを示します。

labels =

  6×1 cell array

    {'Person' }
    {'Person' }
    {'Vehicle'}
    {'Vehicle'}
    {'Vehicle'}
    {'Vehicle'}

インスタンス マスク

オブジェクトのインスタンス マスク。マスク データには次の 2 つの形式があります。

  • バイナリ マスク。サイズ H x W x NumObjects の logical 配列として指定します。各マスクは、イメージ内の 1 つのインスタンスのセグメンテーションです。

  • 多角形座標。NumObjects 行 2 列の cell 配列として指定します。配列の各行には、イメージ内の 1 つのインスタンスの境界に沿った多角形の (x,y) 座標が含まれています。

    Mask R-CNN ネットワークには、多角形座標ではなく、バイナリ マスクが必要です。多角形座標をバイナリ マスクに変換するには、関数 poly2mask を使用します。関数 poly2mask は、多角形の内側にあるピクセルを 1 に設定し、多角形の外側にあるピクセルを 0 に設定します。このコードは、変数 masks_polygon の多角形座標を、サイズ h x w x numObjects のバイナリ マスクに変換する方法を示しています。

    denseMasks = false([h,w,numObjects]);
    for i = 1:numObjects
        denseMasks(:,:,i) = poly2mask(masks_polygon{i}(:,1),masks_polygon{i}(:,2),h,w);
    end

たとえば、このモンタージュは、サンプルの RGB イメージ内の 6 つのオブジェクトのバイナリ マスクを示しています。

Six binary masks showing the segmentation of two pedestrians and four vehicles

データを読み取るデータストアの作成

データストアを使用してデータを読み取ります。データストアは、{RGB イメージ, 境界ボックス, ラベル, マスク} の形式で 1 行 4 列の cell 配列としてデータを返さなければなりません。以下の手順を使用して、この形式でデータストアを作成できます。

  1. RGB イメージ データを返す imageDatastore を作成する

  2. 境界ボックス データとインスタンス ラベルを 2 列の cell 配列として返す boxLabelDatastore を作成する

  3. imageDatastore を作成し、マスク データをバイナリ行列として返すカスタム読み取り関数を指定する

  4. 関数 combine を使用して、3 つのデータストアを結合する

イメージ、境界ボックス、およびマスクのサイズは、ネットワークの入力サイズと一致していなければなりません。データのサイズを変更する必要がある場合は、imresize を使用して RGB イメージとマスクのサイズを変更し、関数 bboxresize で境界ボックスのサイズを変更できます。

詳細については、深層学習用のデータストア (Deep Learning Toolbox)を参照してください。

学習データの可視化

イメージ上にインスタンス マスクを表示するには、insertObjectMask を使用します。カラーマップを指定して、各インスタンスを異なる色で表示できます。このサンプル コードは、lines カラーマップを使用して、変数 im の RGB イメージ上に変数 masks のインスタンス マスクを表示する方法を示しています。

imOverlay = insertObjectMask(im,masks,Color=lines(numObjects));
imshow(imOverlay);

Each pedestrian and vehicle has a unique falsecolor hue over the RGB image

イメージ上にラベル付きの境界ボックスを表示するには、関数 showShape を使用します。このサンプル コードは、変数 bboxes に境界ボックスのサイズと位置データ、変数 labels にラベル データを使用して、ラベル付きの四角の形状を表示する方法を示しています。

imshow(imOverlay)
showShape("rectangle",bboxes,Label=labels,Color="red");

Red rectangles labeled 'Pedestrian' and 'Vehicle' surround instances of each object

Mask R-CNN モデルの学習

構成済みの maskrcnn オブジェクトと学習データを関数 trainMaskRCNN に渡して、ネットワークに学習させます。関数は、学習済みの maskrcnn オブジェクトを返します。

インスタンス セグメンテーションの実行と結果の評価

学習済みの maskrcnn オブジェクトを関数 segmentObjects に渡して、インスタンス セグメンテーションを実行します。関数はオブジェクト マスクを返し、オプションでラベル、検出スコア、および境界ボックスを返します。

関数 evaluateInstanceSegmentation を使用して、インスタンス セグメンテーションの結果の品質を評価します。この関数は、混同行列や平均適合率などのメトリクスを計算します。instanceSegmentationMetrics オブジェクトにメトリクスが保存されます。

参照

[1] He, Kaiming, Georgia Gkioxari, Piotr Dollár, and Ross Girshick. "Mask R-CNN." ArXiv:1703.06870 [Cs], January 24, 2018. https://arxiv.org/pdf/1703.06870.

[2] Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla. "Semantic Object Classes in Video: A High-Definition Ground Truth Database." Pattern Recognition Letters 30, no. 2 (January 2009): 88–97. https://doi.org/10.1016/j.patrec.2008.04.005.

参考

アプリ

関数

関連する例

詳細