インスタンス セグメンテーションの Mask R-CNN 入門
インスタンス セグメンテーションは、オブジェクトの検出されたインスタンスごとにセグメンテーション マップを生成する拡張タイプのオブジェクト検出です。インスタンス セグメンテーションは、オブジェクトのクラスに関係なく、個々のオブジェクトを個別のエンティティとして扱います。対照的に、セマンティック セグメンテーションは、同じクラスのすべてのオブジェクトを単一のエンティティに属するものと見なします。
Mask R-CNN は、検出されたオブジェクト[1]に対してピクセルレベルのセグメンテーションを実行する一般的な深層学習インスタンス セグメンテーション手法です。Mask R-CNN アルゴリズムは、複数のクラスと重複するオブジェクトに対応できます。
maskrcnn
オブジェクトを使用して、事前学習済みの Mask R-CNN ネットワークを作成できます。ネットワークは MS-COCO データ セットについて学習済みで、80 個の異なるクラスのオブジェクトを検出できます。maskrcnn
オブジェクトと共に関数 segmentObjects
を使用して、インスタンス セグメンテーションを実行します。
追加のクラスを検出するようにネットワークを変更する場合、またはネットワークの他のパラメーターを調整する場合は、続けて転移学習を実行できます。Mask R-CNN の転移学習は通常、次の手順に従います。
maskrcnn
オブジェクトを使用して、転移学習用の Mask R-CNN モデルを構成します。学習データを準備します。
関数
trainMaskRCNN
を使用して、モデルに学習させます。関数
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 検出器です。
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 ネットワーク、右側にマスク分岐を示しています。
Mask R-CNN の学習データの準備
データの読み込み
Mask R-CNN に学習させるには、次のデータが必要です。
データ | 説明 |
---|---|
RGB イメージ | ネットワーク入力として機能する RGB イメージ。H x W x 3 の数値配列として指定します。 たとえば、このサンプルの RGB イメージは、個人を特定できる情報を削除するために編集された CamVid データ セット[2]から変更されたイメージです。
|
グラウンド トゥルース境界ボックス | RGB イメージ内のオブジェクトの境界ボックス。NumObjects 行 4 列の行列として指定します。行の形式は [x y w h] です。 たとえば、変数 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 = 6×1 cell array {'Person' } {'Person' } {'Vehicle'} {'Vehicle'} {'Vehicle'} {'Vehicle'} |
インスタンス マスク | オブジェクトのインスタンス マスク。マスク データには次の 2 つの形式があります。
たとえば、このモンタージュは、サンプルの RGB イメージ内の 6 つのオブジェクトのバイナリ マスクを示しています。 |
データを読み取るデータストアの作成
データストアを使用してデータを読み取ります。データストアは、{RGB イメージ, 境界ボックス, ラベル, マスク} の形式で 1 行 4 列の cell 配列としてデータを返さなければなりません。以下の手順を使用して、この形式でデータストアを作成できます。
RGB イメージ データを返す
imageDatastore
を作成する境界ボックス データとインスタンス ラベルを 2 列の cell 配列として返す
boxLabelDatastore
を作成するimageDatastore
を作成し、マスク データをバイナリ行列として返すカスタム読み取り関数を指定する関数
combine
を使用して、3 つのデータストアを結合する
イメージ、境界ボックス、およびマスクのサイズは、ネットワークの入力サイズと一致していなければなりません。データのサイズを変更する必要がある場合は、imresize
を使用して RGB イメージとマスクのサイズを変更し、関数 bboxresize
で境界ボックスのサイズを変更できます。
詳細については、深層学習用のデータストア (Deep Learning Toolbox)を参照してください。
学習データの可視化
イメージ上にインスタンス マスクを表示するには、insertObjectMask
を使用します。カラーマップを指定して、各インスタンスを異なる色で表示できます。このサンプル コードは、lines
カラーマップを使用して、変数 im
の RGB イメージ上に変数 masks
のインスタンス マスクを表示する方法を示しています。
imOverlay = insertObjectMask(im,masks,Color=lines(numObjects)); imshow(imOverlay);
イメージ上にラベル付きの境界ボックスを表示するには、関数 showShape
を使用します。このサンプル コードは、変数 bboxes
に境界ボックスのサイズと位置データ、変数 labels
にラベル データを使用して、ラベル付きの四角の形状を表示する方法を示しています。
imshow(imOverlay) showShape("rectangle",bboxes,Label=labels,Color="red");
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.
参考
アプリ
関数
関連する例
詳細
- Get Started with Instance Segmentation Using Deep Learning
- Get Started with SOLOv2 for Instance Segmentation
- MATLAB による深層学習 (Deep Learning Toolbox)
- 深層学習用のデータストア (Deep Learning Toolbox)