ディープ ネットワーク デザイナーでの簡単なセマンティック セグメンテーション ネットワークの作成
この例では、ディープ ネットワーク デザイナーを使用し、簡単なセマンティック セグメンテーション ネットワークを作成する方法を説明します。
セマンティック セグメンテーションは、イメージの各ピクセルをクラス ラベル ("花"、"人物"、"道路"、"空"、"海洋"、"自動車" など) に関連付けるプロセスを表します。セマンティック セグメンテーションの応用例としては、自動運転のための道路セグメンテーションや医療診断のための癌細胞セグメンテーションなどがあります。詳細については、深層学習を使用したセマンティック セグメンテーション入門を参照してください。
学習データの読み込み
セマンティック セグメンテーション ネットワークに学習させるには、イメージ コレクションと、対応するピクセル ラベル付きイメージ コレクションが必要です。ピクセル ラベル付きイメージは、すべてのピクセル値がそのピクセルのカテゴリカル ラベルを表すイメージです。この例では、説明のために 32 x 32 の三角形のイメージを含む単純なデータ セットを使用します。イメージ ラベラーを使用して、対話形式でピクセルにラベル付けし、ラベル データをコンピューター ビジョン用にエクスポートできます。セマンティック セグメンテーション アプリケーション用の学習データ作成の詳細については、セマンティック セグメンテーションのピクセルのラベル付けを参照してください。
学習データを読み込みます。
dataFolder = fullfile(toolboxdir("vision"),"visiondata","triangleImages");
学習用データの準備
imageDir = fullfile(dataFolder,"trainingImages"); labelDir = fullfile(dataFolder,"trainingLabels");
イメージを格納する ImageDatastore を作成します。
imds = imageDatastore(imageDir);
グラウンド トゥルース ピクセル ラベルを格納する PixelLabelDatastore を作成します。このデータ セットには、"triangle" と "background" の 2 つのクラスがあります。
classNames = ["triangle","background"]; labelIDs = [255 0]; pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);
関数 combine を使用して、イメージ データストアとピクセル ラベル データストアを CombinedDatastore オブジェクトに統合します。統合されたデータストアは、基になるデータストアでのイメージ ペア間のパリティを維持します。
cds = combine(imds,pxds);
ネットワーク アーキテクチャの構築
ディープ ネットワーク デザイナー (Deep Learning Toolbox)を開きます。
deepNetworkDesigner
ディープ ネットワーク デザイナー内で、深層ニューラル ネットワークを構築できます。[空のネットワーク] で一時停止し、[新規] をクリックします。
[層のライブラリ] から [デザイナー] ペインに層をドラッグして、セマンティック セグメンテーション ネットワークを作成します。
次の順序で層を結合します。
imageInputLayer(InputSizeを32,32,1に設定)convolution2dLayer(FilterSizeを3,3、NumFiltersを64、Paddingを1,1,1,1に設定)reluLayermaxPooling2dLayer(PoolSizeを2,2、Strideを2,2、Paddingを0,0,0,0に設定)convolution2dLayer(FilterSizeを3,3、NumFiltersを64、Paddingを1,1,1,1に設定)reluLayertransposedConv2dLayer(FilterSizeを4,4、NumFiltersを64、Strideを2,2、and Croppingを1,1,1,1に設定)convolution2dLayer(FilterSizeを1,1、NumFiltersを2、Paddingを0,0,0,0に設定)softmaxLayer

このネットワークをコマンド ラインで作成し、deepNetworkDesigner(layers) を使用してネットワークをディープ ネットワーク デザイナーにインポートすることもできます。
layers = [
imageInputLayer([32 32 1])
convolution2dLayer([3,3],64,Padding=[1,1,1,1])
reluLayer
maxPooling2dLayer([2,2],Stride=[2,2])
convolution2dLayer([3,3],64,Padding=[1,1,1,1])
reluLayer
transposedConv2dLayer([4,4],64,Stride=[2,2],Cropping=[1,1,1,1])
convolution2dLayer([1,1],2)
softmaxLayer];
このネットワークは、ダウンサンプリングとアップサンプリングの設計に基づくシンプルなセマンティック セグメンテーション ネットワークです。セマンティック セグメンテーション ネットワークの構築の詳細については、セマンティック セグメンテーション ネットワークの作成を参照してください。
ネットワークの学習の準備が整っていることを確認するには、[解析] をクリックします。深層学習ネットワーク アナライザーによってエラーや警告が報告されていないため、ネットワークの学習の準備は整っています。ネットワークをエクスポートするには、[エクスポート] をクリックします。アプリはネットワークを変数 net_1 に保存します。
学習オプションの指定
学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャー (Deep Learning Toolbox)アプリを使用できます。
SGDM オプティマイザーを使用して学習させます。
初期学習率として 0.001 を使用します。
学習を 100 エポック行います。
ミニバッチ サイズとして 64 を使用します。
学習の進行状況をプロットで表示し、精度を監視します。
詳細出力を無効にします。
options = trainingOptions("sgdm", ... MaxEpochs=100, ... InitialLearnRate=0.001, ... MiniBatchSize=64, ... Plots="training-progress", ... Metrics="accuracy", ... Verbose=false);
ネットワークの学習
関数 trainnet を使用してニューラル ネットワークに学習させます。セマンティック セグメンテーション タスクには、クロスエントロピー損失を使用します。既定では、関数 trainnet は利用可能な GPU がある場合にそれを使用します。GPU での学習には、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数 trainnet は CPU を使用します。実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。
net = trainnet(cds,net_1,"crossentropy",options);
イメージ内の三角形のセグメント化
テスト データと学習済みネットワークを使用して予測を行います。
semanticseg を使用してテスト イメージをセグメント化します。関数 labeloverlay を使用して、ラベルをイメージの上に重ねて表示します。
imgTest = imread("triangleTest.jpg");
testSeg = semanticseg(imgTest,net);
testImageSeg = labeloverlay(imgTest,testSeg);結果を表示します。
figure imshow(testImageSeg)

ネットワークは、テスト イメージの三角形に正常にラベルを付けます。
この例で学習を行ったセマンティック セグメンテーション ネットワークは非常にシンプルです。より複雑なセマンティック セグメンテーション ネットワークに学習させる方法を示す例については、深層学習を使用したセマンティック セグメンテーションを参照してください。