ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

セマンティック セグメンテーション ネットワークのコード生成

この例では、深層学習を使用するイメージ セグメンテーション用途のコード生成を説明します。codegen コマンドを使用し、よく知られたイメージ セグメンテーション用の深層学習ネットワーク SegNet [1] の DAG ネットワーク オブジェクトについて予測を実行する MEX 関数を生成します。

必要条件

  • Compute Capability 3.2 以上の CUDA® 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキットおよびドライバー。

  • NVIDIA cuDNN ライブラリ v7 以上。

  • Deep Learning Toolbox™ (DAG ネットワーク オブジェクトを使用するため)。

  • Image Processing Toolbox™ (イメージを読み取って表示するため)。

  • Computer Vision Toolbox™ (この例で使用する関数 labeloverlay 用)。

  • GPU Coder™ (CUDA コードを生成するため)。

  • GPU Coder Interface for Deep Learning Libraries サポート パッケージ。このサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ製品 (GPU Coder)を参照してください。環境変数の設定は、前提条件となる製品の設定 (GPU Coder)を参照してください。

GPU 環境の検証

関数 coder.checkGpuInstall を使用し、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

セグメンテーション ネットワークについて

SegNet [1] は、セマンティック イメージ セグメンテーション用に設計された、よく知られたタイプの畳み込みニューラル ネットワーク (CNN) です。このネットワークは、深層の符号化器と復号化器のあるマルチクラスのピクセル単位セグメンテーション ネットワークで、CamVid [2] データセットについて学習させてあり、推論のために MATLAB® にインポートされています。SegNet [1] は、空、建物、柱、道路、歩道、木、標識、柵、自動車、歩行者、自転車運転者から成る 11 クラスに属するピクセルをセグメント化するように学習されています。

CamVid [2] データセットを使用した MATLAB でのセマンティック セグメンテーション ネットワークの学習の詳細は、深層学習を使用したセマンティック セグメンテーションを参照してください。

関数 'segnet_predict' について

関数 segnet_predict.m は、イメージ入力を受け取り、SegNet.mat ファイルに保存されている深層学習ネットワークを使用して、イメージについて予測を実行します。この関数は、SegNet.mat からネットワーク オブジェクトを永続変数 mynet に読み込みます。それ以降、この関数を呼び出すと、予測のためにこの永続オブジェクトが再利用されます。

type('segnet_predict.m')
% Copyright 2018 The MathWorks, Inc.

function out = segnet_predict(in)
%#codegen

% A persistent object mynet is used to load the DAG network object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused 
% to call predict on inputs, thus avoiding reconstructing and reloading the
% network object.

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('SegNet.mat');
end

% pass in input
out = predict(mynet,in);


事前学習済みの SegNet DAG ネットワーク オブジェクトの取得

net = getSegNet();

この DAG ネットワークには、畳み込み層、バッチ正規化層、プーリング層、逆プーリング層、ピクセル分類出力層など、91 個の層が含まれています。

net.Layers
ans = 

  91x1 Layer array with layers:

     1   'inputImage'        Image Input                  360x480x3 images with 'zerocenter' normalization
     2   'conv1_1'           Convolution                  64 3x3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     3   'bn_conv1_1'        Batch Normalization          Batch normalization with 64 channels
     4   'relu1_1'           ReLU                         ReLU
     5   'conv1_2'           Convolution                  64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
     6   'bn_conv1_2'        Batch Normalization          Batch normalization with 64 channels
     7   'relu1_2'           ReLU                         ReLU
     8   'pool1'             Max Pooling                  2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     9   'conv2_1'           Convolution                  128 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    10   'bn_conv2_1'        Batch Normalization          Batch normalization with 128 channels
    11   'relu2_1'           ReLU                         ReLU
    12   'conv2_2'           Convolution                  128 3x3x128 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'bn_conv2_2'        Batch Normalization          Batch normalization with 128 channels
    14   'relu2_2'           ReLU                         ReLU
    15   'pool2'             Max Pooling                  2x2 max pooling with stride [2  2] and padding [0  0  0  0]
    16   'conv3_1'           Convolution                  256 3x3x128 convolutions with stride [1  1] and padding [1  1  1  1]
    17   'bn_conv3_1'        Batch Normalization          Batch normalization with 256 channels
    18   'relu3_1'           ReLU                         ReLU
    19   'conv3_2'           Convolution                  256 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    20   'bn_conv3_2'        Batch Normalization          Batch normalization with 256 channels
    21   'relu3_2'           ReLU                         ReLU
    22   'conv3_3'           Convolution                  256 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    23   'bn_conv3_3'        Batch Normalization          Batch normalization with 256 channels
    24   'relu3_3'           ReLU                         ReLU
    25   'pool3'             Max Pooling                  2x2 max pooling with stride [2  2] and padding [0  0  0  0]
    26   'conv4_1'           Convolution                  512 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    27   'bn_conv4_1'        Batch Normalization          Batch normalization with 512 channels
    28   'relu4_1'           ReLU                         ReLU
    29   'conv4_2'           Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    30   'bn_conv4_2'        Batch Normalization          Batch normalization with 512 channels
    31   'relu4_2'           ReLU                         ReLU
    32   'conv4_3'           Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    33   'bn_conv4_3'        Batch Normalization          Batch normalization with 512 channels
    34   'relu4_3'           ReLU                         ReLU
    35   'pool4'             Max Pooling                  2x2 max pooling with stride [2  2] and padding [0  0  0  0]
    36   'conv5_1'           Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    37   'bn_conv5_1'        Batch Normalization          Batch normalization with 512 channels
    38   'relu5_1'           ReLU                         ReLU
    39   'conv5_2'           Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    40   'bn_conv5_2'        Batch Normalization          Batch normalization with 512 channels
    41   'relu5_2'           ReLU                         ReLU
    42   'conv5_3'           Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    43   'bn_conv5_3'        Batch Normalization          Batch normalization with 512 channels
    44   'relu5_3'           ReLU                         ReLU
    45   'pool5'             Max Pooling                  2x2 max pooling with stride [2  2] and padding [0  0  0  0]
    46   'decoder5_unpool'   Max Unpooling                Max Unpooling
    47   'decoder5_conv3'    Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    48   'decoder5_bn_3'     Batch Normalization          Batch normalization with 512 channels
    49   'decoder5_relu_3'   ReLU                         ReLU
    50   'decoder5_conv2'    Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    51   'decoder5_bn_2'     Batch Normalization          Batch normalization with 512 channels
    52   'decoder5_relu_2'   ReLU                         ReLU
    53   'decoder5_conv1'    Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    54   'decoder5_bn_1'     Batch Normalization          Batch normalization with 512 channels
    55   'decoder5_relu_1'   ReLU                         ReLU
    56   'decoder4_unpool'   Max Unpooling                Max Unpooling
    57   'decoder4_conv3'    Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    58   'decoder4_bn_3'     Batch Normalization          Batch normalization with 512 channels
    59   'decoder4_relu_3'   ReLU                         ReLU
    60   'decoder4_conv2'    Convolution                  512 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    61   'decoder4_bn_2'     Batch Normalization          Batch normalization with 512 channels
    62   'decoder4_relu_2'   ReLU                         ReLU
    63   'decoder4_conv1'    Convolution                  256 3x3x512 convolutions with stride [1  1] and padding [1  1  1  1]
    64   'decoder4_bn_1'     Batch Normalization          Batch normalization with 256 channels
    65   'decoder4_relu_1'   ReLU                         ReLU
    66   'decoder3_unpool'   Max Unpooling                Max Unpooling
    67   'decoder3_conv3'    Convolution                  256 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    68   'decoder3_bn_3'     Batch Normalization          Batch normalization with 256 channels
    69   'decoder3_relu_3'   ReLU                         ReLU
    70   'decoder3_conv2'    Convolution                  256 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    71   'decoder3_bn_2'     Batch Normalization          Batch normalization with 256 channels
    72   'decoder3_relu_2'   ReLU                         ReLU
    73   'decoder3_conv1'    Convolution                  128 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    74   'decoder3_bn_1'     Batch Normalization          Batch normalization with 128 channels
    75   'decoder3_relu_1'   ReLU                         ReLU
    76   'decoder2_unpool'   Max Unpooling                Max Unpooling
    77   'decoder2_conv2'    Convolution                  128 3x3x128 convolutions with stride [1  1] and padding [1  1  1  1]
    78   'decoder2_bn_2'     Batch Normalization          Batch normalization with 128 channels
    79   'decoder2_relu_2'   ReLU                         ReLU
    80   'decoder2_conv1'    Convolution                  64 3x3x128 convolutions with stride [1  1] and padding [1  1  1  1]
    81   'decoder2_bn_1'     Batch Normalization          Batch normalization with 64 channels
    82   'decoder2_relu_1'   ReLU                         ReLU
    83   'decoder1_unpool'   Max Unpooling                Max Unpooling
    84   'decoder1_conv2'    Convolution                  64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    85   'decoder1_bn_2'     Batch Normalization          Batch normalization with 64 channels
    86   'decoder1_relu_2'   ReLU                         ReLU
    87   'decoder1_conv1'    Convolution                  11 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    88   'decoder1_bn_1'     Batch Normalization          Batch normalization with 11 channels
    89   'decoder1_relu_1'   ReLU                         ReLU
    90   'softmax'           Softmax                      softmax
    91   'labels'            Pixel Classification Layer   Class weighted cross-entropy loss with 'Sky', 'Building', and 9 other classes

関数 'segnet_predict' の MEX コード生成の実行

設計ファイル segnet_predict.m から CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。サイズが [360,480,3] の入力を指定して codegen コマンドを実行します。この値は SegNet の入力層サイズに対応します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg segnet_predict -args {ones(360,480,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/segnet_predict/html/report.mldatx').

生成された MEX の実行

入力イメージを読み込んで表示します。

im = imread('gpucoder_segnet_image.png');
imshow(im);

入力イメージに対して segnet_predict を呼び出します。

predict_scores = segnet_predict_mex(im);

変数 predict_scores は、各クラスのピクセル単位の予測スコアに対応する 11 個のチャネルを持つ 3 次元行列です。ピクセル単位のラベルを取得するために、最大予測スコアを持つチャネルを計算します。

[~,argmax] = max(predict_scores,[],3);

セグメント化されたラベルを入力イメージに重ね合わせ、セグメント化された領域を表示します。

classes = [
    "Sky"
    "Building"
    "Pole"
    "Road"
    "Pavement"
    "Tree"
    "SignSymbol"
    "Fence"
    "Car"
    "Pedestrian"
    "Bicyclist"
    ];

cmap = camvidColorMap();
SegmentedImage = labeloverlay(im,argmax,'ColorMap',cmap);
figure
imshow(SegmentedImage);
pixelLabelColorbar(cmap,classes);

参照

[1] Badrinarayanan, Vijay, Alex Kendall, and Roberto Cipolla. "SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation." arXiv preprint arXiv:1511.00561, 2015.

[2] Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla."Semantic object classes in video: A high-definition ground truth database."Pattern Recognition Letters Vol 30, Issue 2, 2009, pp 88-97.

関連するトピック