メインコンテンツ

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

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

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

サードパーティの前提条件

この例では、CUDA MEX を生成します。CUDA® 対応 NVIDIA® GPU および互換性のあるドライバーが必要です。

GPU 環境の検証

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

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

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

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

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

Figure contains an axes object. The hidden axes object with title Noisy Image contains an object of type image.

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

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

net = getDenoisingNetwork;

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

ネットワークには 58 個の層が含まれます。深層学習ネットワーク アーキテクチャを対話的に可視化して表示するには、関数 analyzeNetwork (Deep Learning Toolbox) を使用します。

analyzeNetwork(net);

関数 denoisenet_predict

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

この関数は、getDenoisingNetwork によって返された dlnetwork オブジェクトを永続変数 dlnet に読み込み、それ以降の予測の呼び出しではこの永続オブジェクトを再利用します。predict メソッドは、事前学習済みのノイズ除去イメージを使用して、入力イメージ内のノイズの推定を返します。次に、元のイメージからノイズを減算し、ノイズ除去後のイメージを取得します。

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

persistent dlnet;


if isempty(dlnet)   
    dlnet = coder.loadDeepLearningNetwork('getDenoisingNetwork', 'DnCNN');
end

% Use the network to predict the noise in the input image
dlIn = dlarray(in, 'SSC');
res = extractdata(predict(dlnet, dlIn));


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

I = in - res;
  

MEX コード生成の実行

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

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('none');
codegen -config cfg denoisenet_predict -args {ones(256,256,'single')} -report
Code generation successful: View report

生成された MEX の実行

ノイズ除去ネットワークは、入力範囲が [0,1] の入力イメージで学習させています。noisyI に対してim2single (Image Processing Toolbox)関数を使用して、値を [0,255] から [0,1] に再スケーリングします。再スケーリング後、denoisenet_predict_predict を使用して、ノイズ除去後のイメージ denoisedI を取得します。

denoisedI = denoisenet_predict_mex(im2single(noisyI));

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

ノイズを含む元のイメージとノイズ除去後のイメージを並べて表示します。

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

Figure contains an axes object. The hidden axes object with title Noisy Image (left) and Denoised Image (right) contains an object of type image.

参考文献

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

参考

関数

オブジェクト

トピック