Main Content

Mask R-CNN を使用したインスタンス セグメンテーションの実行

この例では、マルチクラスの Mask R-CNN (Region-based Convolutional Neural Network) を使用して、人と自動車の個々のインスタンスをセグメント化する方法を説明します。

インスタンス セグメンテーションは、オブジェクトを検出して位置を推定すると同時に、検出された各インスタンスのセグメンテーション マップを生成するコンピューター ビジョン技術です。

この例では、最初に、2 つのクラスを検出する事前学習済みの Mask R-CNN を使用してインスタンスのセグメンテーションを実行する方法を示します。オプションで、データ セットをダウンロードし、転移学習を使用してマルチクラス Mask R-CNN に学習させることもできます。

事前学習済みのネットワークの読み込み

事前学習済みのネットワークとデータの目的の場所として dataFolder を指定します。

dataFolder = fullfile(tempdir,"coco");

事前学習済みの Mask R-CNN をダウンロードします。ネットワークはmaskrcnnオブジェクトとして保存されます。

trainedMaskRCNN_url = "https://www.mathworks.com/supportfiles/vision/data/maskrcnn_object_person_car_v2.mat";
downloadTrainedMaskRCNN(trainedMaskRCNN_url,dataFolder);
load(fullfile(dataFolder,"maskrcnn_object_person_car_v2.mat"));

イメージ内の人物のセグメント化

ターゲット クラスのオブジェクトを含むテスト イメージを読み取ります。

imTest = imread("visionteam.jpg");

関数segmentObjectsを使用して、オブジェクトとそのマスクをセグメント化します。関数 segmentObjects は、予測を実行する前に、入力イメージに対して以下の前処理手順を実行します。

  1. COCO データ セット平均を使用してイメージをゼロ センタリングします。

  2. 縦横比 (レター ボックス) を維持したまま、イメージのサイズをネットワークの入力サイズに変更します。

[masks,labels,scores,boxes] = segmentObjects(net,imTest,Threshold=0.98);

関数insertObjectMaskを使用し、検出されたマスクをイメージに重ね合わせて、予測を可視化します。

overlayedImage = insertObjectMask(imTest,masks);
imshow(overlayedImage)

オブジェクトの境界ボックスとラベルを表示します。

showShape("rectangle",gather(boxes),Label=labels,LineColor="r")

学習データの読み込み

COCO の学習イメージと注釈データを保存するディレクトリを作成します。

imageFolder = fullfile(dataFolder,"images");
captionsFolder = fullfile(dataFolder,"annotations");
if ~exist(imageFolder,"dir")
    mkdir(imageFolder)
    mkdir(captionsFolder)
end

COCO 2014 学習イメージ データ セット [2] は、82,783 個のイメージで構成されています。注釈データには、各イメージごとに最低 5 つの対応するキャプションが格納されています。https://cocodataset.org/#download で「2014 Train images」と「2014 Train/Val annotations」のリンクをクリックし、COCO 2014 の学習イメージとキャプションをそれぞれダウンロードします。imageFolder で指定されたフォルダーにイメージ ファイルを解凍します。captionsFolder で指定されたフォルダーに注釈ファイルを解凍します。

annotationFile = fullfile(captionsFolder,"instances_train2014.json");
str = fileread(annotationFile);

学習用データの準備

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

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

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

  • インスタンス ラベル。NumObjects 行 1 列の string ベクトルとして指定します。

  • インスタンス マスク。各マスクは、イメージ内の 1 つのインスタンスのセグメンテーションです。COCO データ セットは、NumObjects 行 2 列の cell 配列の形式の多角形座標を使用してオブジェクト インスタンスを指定します。配列の各行には、イメージ内の 1 つのインスタンスの境界に沿った多角形の (x,y) 座標が含まれています。ただし、この例の Mask R-CNN には、サイズ H x W x NumObjects の logical 配列として指定されたバイナリ マスクが必要です。

学習データ パラメーターの初期化

trainClassNames = ["person","car"];
numClasses = length(trainClassNames);
imageSizeTrain = [800 800 3];

COCO 注釈データの MAT ファイルとして形式を整える

MATLAB 用の COCO API を使用すると、注釈データにアクセスできます。https://github.com/cocodataset/cocoapi で [Code] ボタンをクリックして [Download ZIP] を選択し、MATLAB 用の COCO API をダウンロードします。cocoapi-master ディレクトリとその内容を dataFolder で指定されたフォルダーに解凍します。オペレーティング システムで必要な場合は、MatlabAPI サブディレクトリ内の gason.m ファイルの指示に従って、gason パーサーをコンパイルします。

MATLAB 用 COCO API のディレクトリの場所を指定し、そのディレクトリをパスに追加します。

cocoAPIDir = fullfile(dataFolder,"cocoapi-master","MatlabAPI");
addpath(cocoAPIDir);

MAT ファイルを保存するフォルダーを指定します。

unpackAnnotationDir = fullfile(dataFolder,"annotations_unpacked","matFiles");
if ~exist(unpackAnnotationDir,'dir')
    mkdir(unpackAnnotationDir)
end

サポート ファイルとしてこの例に添付されている補助関数 unpackAnnotations を使用し、COCO の注釈を MAT ファイルに抽出します。各 MAT ファイルは単一の学習イメージに対応し、各学習イメージのファイル名、境界ボックス、インスタンス ラベル、およびインスタンス マスクを含みます。この関数は、関数poly2maskを使用して、多角形座標として指定されたオブジェクト インスタンスをバイナリ マスクに変換します。

unpackAnnotations(trainClassNames,annotationFile,imageFolder,unpackAnnotationDir);

データストアの作成

Mask R-CNN では、RGB 学習イメージ、境界ボックス、インスタンス ラベル、およびインスタンス マスクを含む 1 行 4 列の cell 配列の入力データが必要です。

カスタム読み取り関数 cocoAnnotationMATReader を使用してファイル データストアを作成します。この関数は、アンパックされた注釈 MAT ファイルの内容を読み取り、グレースケール学習イメージを RGB に変換し、データを 1 行 4 列の cell 配列として必要な形式で返します。このカスタム読み取り関数は、サポート ファイルとしてこの例に添付されています。

ds = fileDatastore(unpackAnnotationDir, ...
    ReadFcn=@(x)cocoAnnotationMATReader(x,imageFolder));

変換されたデータストアから返されたデータをプレビューします。

data = preview(ds)
data=1×4 cell array
    {428×640×3 uint8}    {16×4 double}    {16×1 categorical}    {428×640×16 logical}

Mask R-CNN ネットワークの構成

Mask R-CNN は、ResNet-50 ベース ネットワークを使用した Faster R-CNN を基に構築されています。事前学習済みの Mask R-CNN ネットワークで学習を転送するには、maskrcnn オブジェクトを使用して事前学習済みのネットワークを読み込み、クラスと入力サイズの新しいセットに合わせてネットワークをカスタマイズします。既定では、maskrcnn オブジェクトは COCO データ セットを使用した学習に使用されるものと同じアンカー ボックスを使用します。

net = maskrcnn("resnet50-coco",trainClassNames,InputSize=imageSizeTrain)
net = 
  maskrcnn with properties:

      ModelName: 'maskrcnn'
     ClassNames: {'person'  'car'}
      InputSize: [800 800 3]
    AnchorBoxes: [15×2 double]

学習データ セット固有のカスタム アンカー ボックスを使用する場合は、関数estimateAnchorBoxesを使用してアンカー ボックスを推定できます。その後、maskrcnn オブジェクトを作成する時に名前と値の引数 AnchorBoxes を使用してアンカー ボックスを指定します。

ネットワークの学習

SGDM 最適化のオプションを指定し、ネットワークの学習を 10 エポック行います。

名前と値の引数 ExecutionEnvironment"gpu" として指定して、GPU で学習を行います。利用可能なメモリが少なくとも 12 GB ある GPU で学習させることを推奨します。GPU を使用するには、Parallel Computing Toolbox™、および CUDA® 対応の NVIDIA® GPU が必要です。詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.001, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropPeriod=1, ...
    LearnRateDropFactor=0.95, ...
    Plot="none", ...
    Momentum=0.9, ...
    MaxEpochs=10, ...
    MiniBatchSize=2, ...
    BatchNormalizationStatistics="moving", ...
    ResetInputNormalization=false, ...
    ExecutionEnvironment="gpu", ...
    VerboseFrequency=50);

Mask R-CNN ネットワークに学習させるには、次のコードで変数 doTrainingtrue に設定します。関数trainMaskRCNNを使用してネットワークに学習させます。学習データ セットは事前学習済みのネットワークに学習させたデータと類似しているため、名前と値の引数 FreezeSubNetwork を使用して、特徴抽出のバックボーンの重みを凍結できます。

doTraining = true;
if doTraining
    [net,info] = trainMaskRCNN(ds,net,options,FreezeSubNetwork="backbone");
    modelDateTime = string(datetime("now",Format="yyyy-MM-dd-HH-mm-ss"));
    save("trainedMaskRCNN-"+modelDateTime+".mat","net");
end

学習済みネットワークを使用すると、この例の「イメージ内の人物のセグメント化」のセクションで説明されているように、テスト イメージでインスタンス セグメンテーションを実行できます。

参考文献

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

[2] Lin, Tsung-Yi, Michael Maire, Serge Belongie, Lubomir Bourdev, Ross Girshick, James Hays, Pietro Perona, Deva Ramanan, C. Lawrence Zitnick, and Piotr Dollár. “Microsoft COCO: Common Objects in Context," May 1, 2014. https://arxiv.org/abs/1405.0312v3.

参考

| | | |

関連するトピック