Main Content

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

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

第三方前提条件

必需

此示例生成 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 函数返回预训练的 DnCNN [1],您可以使用它来检测未知级别的加性高斯白噪声 (AWGN)。该网络是前馈去噪卷积网络,它实现一种残差学习方法来预测残差图像。换句话说,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;
  

此处调用了 activations 方法(层数值索引为 59)来从网络的最终层提取激活值。'OutputAs' 'channels' 名称-值对组参量用于计算大于网络的 imageInputLayer.InputSize 的图像上的激活值。

activations 方法使用预训练的去噪图像返回输入图像中的噪声估计值。

估计出噪声后,从原始图像减去噪声以获得去噪图像。

运行 MEX 代码生成

要为 denoisenet_predict.m 入口函数生成 CUDA 代码,请为 MEX 目标创建一个 GPU 代码配置对象,并将目标语言设置为 C++。使用 coder.DeepLearningConfig (GPU Coder) 函数创建一个 CuDNN 深度学习配置对象,并将其赋给 GPU 代码配置对象的 DeepLearningConfig 属性。运行 codegen 命令以指定输入大小为 [256,256]。该值对应于要去噪的含噪图像的大小。

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

针对输入范围为 [0,1] 的输入图像训练 DnCNN [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.

相关主题