このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

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

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

必要条件

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

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

  • NVIDIA cuDNN ライブラリ。

  • 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')
function out = segnet_predict(in)
%#codegen
% Copyright 2018-2019 The MathWorks, Inc.

persistent mynet;

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

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


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

net = getSegNet();
Downloading pretrained SegNet (107 MB)...

この DAG ネットワークには、畳み込み層、バッチ正規化層、プーリング層、逆プーリング層、ピクセル分類出力層など、91 個の層が含まれています。関数 analyzeNetwork を使用して、深層学習ネットワーク アーキテクチャを対話的に可視化して表示します。

analyzeNetwork(net);

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 の実行

入力イメージを読み込んで表示します。入力イメージに対して segnet_predict_mex を呼び出します。

im = imread('gpucoder_segnet_image.png');
imshow(im);
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.

関連するトピック