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

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

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

必要条件

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

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

  • NVIDIA cuDNN ライブラリ。

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

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

GPU 環境の検証

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

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

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

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

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

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

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

net = getDenoisingNetwork;

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

このネットワークには、畳み込み層、バッチ正規化層、回帰出力層など、59 個の層が含まれています。深層学習ネットワーク アーキテクチャを対話的に可視化して表示するには、関数 analyzeNetwork を使用します。

analyzeNetwork(net);

関数 denoisenet_predict

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

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

type denoisenet_predict
function I = denoisenet_predict(in)
%#codegen
% Copyright 2018-2019 The MathWorks, Inc.

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 メソッドは、事前学習済みのノイズ除去イメージを使用して、入力イメージ内のノイズの推定を返します。

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

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_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.

関連するトピック