セマンティック セグメンテーション ネットワークのコード生成
この例では、深層学習を使用するイメージ セグメンテーション用途のコード生成を説明します。codegen
コマンドを使用し、イメージ セグメンテーション用の深層学習ネットワーク SegNet [1] の DAG ネットワーク オブジェクトについて予測を実行する MEX 関数を生成します。
サードパーティの必要条件
必須
この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。
CUDA® 対応 NVIDIA® GPU および互換性のあるドライバー。
オプション
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA ツールキット。
NVIDIA cuDNN ライブラリ。
コンパイラおよびライブラリの環境変数。詳細は、サードパーティ ハードウェア (GPU Coder)と前提条件となる製品の設定 (GPU Coder)を参照してください。
GPU 環境の検証
関数coder.checkGpuInstall
(GPU Coder)を使用して、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。
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 でセマンティック セグメンテーション ネットワークに学習させる方法の詳細については、深層学習を使用したセマンティック セグメンテーション (Computer Vision Toolbox)を参照してください。
エントリポイント関数 segnet_predict
エントリポイント関数 segnet_predict.m
は、イメージ入力を受け取り、SegNet.mat
ファイルに保存されている深層学習ネットワークを使用して、イメージについて予測を実行します。この関数は、ネットワーク オブジェクトを SegNet.mat
ファイルから永続変数 mynet に読み込み、以降の予測呼び出しではその永続変数を再利用します。
type('segnet_predict.m')
function out = segnet_predict(in) %#codegen % Copyright 2018-2021 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();
この DAG ネットワークには、畳み込み層、バッチ正規化層、プーリング層、逆プーリング層、ピクセル分類出力層など、91 個の層が含まれています。関数analyzeNetwork
を使用して、深層学習ネットワーク アーキテクチャを対話的に可視化して表示します。
analyzeNetwork(net);
MEX コード生成の実行
エントリポイント関数 segnet_predict.m
用の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig
(GPU Coder) を使用して 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: View report
生成された 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.