去噪深度神经网络的代码生成
此示例说明如何从 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');
获得预训练的去噪网络
调用 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
。将该深度学习配置对象分配给 cfg
的 DeepLearningConfig
属性。运行 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)');
参考资料
[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.