Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

サードパーティの必要条件

必須

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA® 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

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

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-2021 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 (GPU Coder) を使用して 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: View report

生成された MEX の実行

DnCNN [1] は入力範囲が [0,1] の入力イメージについて学習されています。noisyI に対して関数im2single (Image Processing Toolbox)を呼び出して、値を [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.

関連するトピック