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
は、予測を実行する前に、入力イメージに対して以下の前処理手順を実行します。
COCO データ セット平均を使用してイメージをゼロ センタリングします。
縦横比 (レター ボックス) を維持したまま、イメージのサイズをネットワークの入力サイズに変更します。
[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 ネットワークに学習させるには、次のコードで変数 doTraining
を true
に設定します。関数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.
参考
maskrcnn
| trainMaskRCNN
| segmentObjects
| transform
| insertObjectMask
関連するトピック
- インスタンス セグメンテーションの Mask R-CNN 入門
- MATLAB による深層学習 (Deep Learning Toolbox)
- 深層学習用のデータストア (Deep Learning Toolbox)