主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

去噪深度神经网络的代码生成

此示例说明如何从 MATLAB® 代码生成纯 CUDA® MEX,以及如何使用去噪卷积神经网络 (DnCNN [1]) 对灰度图像进行去噪。预训练的去噪网络会估计含噪图像中的噪声,然后将其去除,从而得到更清晰的去噪图像。

第三方前提条件

此示例生成 CUDA MEX,需要支持 CUDA® 的 NVIDIA® GPU 和兼容的驱动。

验证 GPU 环境

使用 coder.checkGpuInstall (GPU Coder) 函数验证运行此示例所需的编译器和库是否已正确设置。

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 函数。

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 (GPU Coder) 函数创建深度学习配置对象并将目标库设置为 none。将该深度学习配置对象分配给 cfgDeepLearningConfig 属性。运行 codegen 命令,指定输入大小为 256×256。该值对应于要去噪的含噪图像的大小。

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.

另请参阅

主题