ドキュメンテーション

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

ノイズ除去深層ニューラル ネットワークのコード生成

この例では、ノイズ除去畳み込みニューラル ネットワーク (DnCNN [1]) を使用して、MATLAB® コードから CUDA® MEX を生成し、グレースケール イメージのノイズを除去する方法を説明します。ノイズ除去ネットワークを使用することで、ノイズを含むイメージ内のノイズを推定し、それらのノイズを除去してノイズのないイメージを取得できます。

必要条件

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

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

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

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、Third-party Products を参照してください。環境変数の設定は、Environment Variables を参照してください。

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

  • Deep Learning Toolbox™ (SeriesNetwork または DAGNetwork オブジェクトを使用するため)。

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

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

GPU 環境の検証

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

coder.checkGpuInstall('gpu','codegen','cudnn','quiet');

ノイズを含むイメージの読み込み

ノイズを含むグレースケール イメージをワークスペースに読み込んでそのイメージを表示します。

noisyI = imread('noisy_cameraman.png');
figure
imshow(noisyI);
title('Noisy Image');

事前学習済みのノイズ除去ネットワークの取得

関数 getDenoisingNetwork を呼び出して、事前学習済みのイメージ ノイズ除去深層ニューラル ネットワークを取得します。

net = getDenoisingNetwork;

関数 getDenoisingNetwork は、不明なレベルの加法性ホワイト ガウス ノイズ (AWGN) を検出するために使用できる事前学習済みの DnCNN [1] を返します。このネットワークは、残差イメージを予測するための残差学習手法を実装したフィードフォーワード ノイズ除去畳み込みネットワークです。つまり、DnCNN [1] は、ノイズを含むイメージとノイズに隠れているクリーン イメージの間の差を計算します。

このネットワークには、畳み込み層、バッチ正規化層、回帰出力層など、59 個の層が含まれています。

net.Layers
ans = 

  59x1 Layer array with layers:

     1   'InputLayer'             Image Input           50x50x1 images
     2   'Conv1'                  Convolution           64 3x3x1 convolutions with stride [1  1] and padding [1  1  1  1]
     3   'ReLU1'                  ReLU                  ReLU
     4   'Conv2'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
     5   'BNorm2'                 Batch Normalization   Batch normalization with 64 channels
     6   'ReLU2'                  ReLU                  ReLU
     7   'Conv3'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
     8   'BNorm3'                 Batch Normalization   Batch normalization with 64 channels
     9   'ReLU3'                  ReLU                  ReLU
    10   'Conv4'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'BNorm4'                 Batch Normalization   Batch normalization with 64 channels
    12   'ReLU4'                  ReLU                  ReLU
    13   'Conv5'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    14   'BNorm5'                 Batch Normalization   Batch normalization with 64 channels
    15   'ReLU5'                  ReLU                  ReLU
    16   'Conv6'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    17   'BNorm6'                 Batch Normalization   Batch normalization with 64 channels
    18   'ReLU6'                  ReLU                  ReLU
    19   'Conv7'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    20   'BNorm7'                 Batch Normalization   Batch normalization with 64 channels
    21   'ReLU7'                  ReLU                  ReLU
    22   'Conv8'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    23   'BNorm8'                 Batch Normalization   Batch normalization with 64 channels
    24   'ReLU8'                  ReLU                  ReLU
    25   'Conv9'                  Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    26   'BNorm9'                 Batch Normalization   Batch normalization with 64 channels
    27   'ReLU9'                  ReLU                  ReLU
    28   'Conv10'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    29   'BNorm10'                Batch Normalization   Batch normalization with 64 channels
    30   'ReLU10'                 ReLU                  ReLU
    31   'Conv11'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    32   'BNorm11'                Batch Normalization   Batch normalization with 64 channels
    33   'ReLU11'                 ReLU                  ReLU
    34   'Conv12'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    35   'BNorm12'                Batch Normalization   Batch normalization with 64 channels
    36   'ReLU12'                 ReLU                  ReLU
    37   'Conv13'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    38   'BNorm13'                Batch Normalization   Batch normalization with 64 channels
    39   'ReLU13'                 ReLU                  ReLU
    40   'Conv14'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    41   'BNorm14'                Batch Normalization   Batch normalization with 64 channels
    42   'ReLU14'                 ReLU                  ReLU
    43   'Conv15'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    44   'BNorm15'                Batch Normalization   Batch normalization with 64 channels
    45   'ReLU15'                 ReLU                  ReLU
    46   'Conv16'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    47   'BNorm16'                Batch Normalization   Batch normalization with 64 channels
    48   'ReLU16'                 ReLU                  ReLU
    49   'Conv17'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    50   'BNorm17'                Batch Normalization   Batch normalization with 64 channels
    51   'ReLU17'                 ReLU                  ReLU
    52   'Conv18'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    53   'BNorm18'                Batch Normalization   Batch normalization with 64 channels
    54   'ReLU18'                 ReLU                  ReLU
    55   'Conv19'                 Convolution           64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    56   'BNorm19'                Batch Normalization   Batch normalization with 64 channels
    57   'ReLU19'                 ReLU                  ReLU
    58   'Conv20'                 Convolution           1 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
    59   'FinalRegressionLayer'   Regression Output     mean-squared-error with response 'Response'

関数 'denoisenet_predict' について

関数 denoisenet_predict は、ノイズを含むイメージ入力を受け取り、事前学習済みのノイズ除去ネットワークを使用してノイズ除去後のイメージを返します。

この関数は、getDenoisingNetwork によって返されたネットワーク オブジェクトを永続変数 mynet に読み込みます。それ以降、この関数を呼び出すと、予測のためにこの永続オブジェクトが再利用されます。

type denoisenet_predict
% Copyright 2018 The MathWorks, Inc.

function I = denoisenet_predict(in)
%#codegen

% A persistent object mynet is used to load the SeriesNetwork 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('getDenoisingNetwork', 'DnCNN');
end

% The activations methods extracts the output from the last layer. The
% 'OutputAs' 'channels' name-value pair argument is used inorder to call
% activations on an image whose input dimensions are greater than or equal
% to the network's imageInputLayer.InputSize.

res = mynet.activations(in, 59,'OutputAs','channels');


% Once the noise is estimated, we subtract the noise from the original
% image to obtain a denoised image.

I = in - res;
  

ここで、ネットワークの最後の層から活性化を抽出するために、層の数値インデックスを 59 に指定して activations メソッドが呼び出されています。名前と値のペアの引数 'OutputAs''channels' を使用して、ネットワークの imageInputLayer.InputSize を上回るイメージの活性化を計算します。

activations メソッドは、事前学習済みのノイズ除去イメージを使用して、入力イメージ内のノイズの推定を返します。

ノイズが推定されたら、元のイメージからノイズを減算し、ノイズ除去後のイメージを取得します。

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

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

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

生成された MEX の実行

DnCNN [1] は入力範囲が [0,1] の入力イメージについて学習されています。noisyI に対して im2single を呼び出して、値を [0,255] から [0,1] に再スケーリングします。

再スケーリングした入力イメージに対して denoisenet_predict を呼び出します。

denoisedI = denoisenet_predict_mex(im2single(noisyI));

ノイズ除去後のイメージの表示

figure
imshowpair(noisyI,denoisedI,'montage');
title('Noisy Image (left) and Denoised Image (right)');

参照

[1] Zhang, K., W. Zuo, Y. Chen, D. Meng, and L. Zhang. "Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising." IEEE Transactions on Image Processing. Vol. 26, Number 7, Feb. 2017, pp. 3142-3155.

関連するトピック