Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

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

Computer Vision Toolbox™ を使用して Mask R-CNN に学習させる方法を示す例については、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

学習データの可視化

イメージ上にインスタンス マスクを表示するには、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

データの前処理

データのフォーマットとサイズ変更

データストアを使用してデータを読み取ります。データストアは、{RGB イメージ, 境界ボックス, ラベル, マスク} の形式で 1 行 4 列の cell 配列としてデータを返さなければなりません。イメージ、境界ボックス、およびマスクのサイズは、ネットワークの入力サイズと一致していなければなりません。データのサイズを変更する必要がある場合は、imresize を使用して RGB イメージとマスクのサイズを変更し、関数 bboxresize で境界ボックスのサイズを変更できます。

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

データのミニバッチの形成

Mask R-CNN ネットワークの学習には、カスタム学習ループが必要です。カスタム学習ループで観測値のミニバッチ処理を管理するには、データストアから minibatchqueue (Deep Learning Toolbox) オブジェクトを作成します。minibatchqueue オブジェクトは、深層学習アプリケーションでの自動微分を可能にする dlarray (Deep Learning Toolbox) オブジェクトにデータをキャストします。サポートされている GPU がある場合、minibatchqueue オブジェクトはデータを GPU にも移動します。

関数 next (Deep Learning Toolbox) は、minibatchqueue からデータの次のミニバッチを生成します。

Mask R-CNN ネットワーク アーキテクチャ

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

Mask R-CNN モデルは、fasterRCNNLayers を使用して作成できる 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 ネットワークの学習

カスタム学習ループでモデルに学習させます。それぞれの反復で次を行います。

  • 関数 next (Deep Learning Toolbox) を使用して、現在のミニバッチ データを読み取ります。

  • 関数 dlfeval (Deep Learning Toolbox) と、学習データのバッチの勾配と全体的な損失を計算するカスタム補助関数を使用して、モデル勾配を評価します。

  • adamupdate (Deep Learning Toolbox)sgdmupdate (Deep Learning Toolbox) などの関数を使用して、ネットワークの学習可能なパラメーターを更新します。

Computer Vision Toolbox を使用して Mask R-CNN に学習させる方法を示す例については、Mask R-CNN を使用したマルチクラス インスタンス セグメンテーションを参照してください。

参照

[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.

参考

アプリ

関数

オブジェクト

関連するトピック

外部の Web サイト