去噪深度神经网络的代码生成
此文为转载,原文请看下面地址↓↓↓
去噪深度神经网络的代码生成
此示例使用:
GPU Coder
GPU Coder Interface for Deep Learning Libraries
Image Processing Toolbox
Deep Learning Toolbox
View MATLAB Command
此示例说明如何从 MATLAB® 代码生成 CUDA® MEX,以及如何使用去噪卷积神经网络 (DnCNN [1]) 对灰度图像进行去噪。您可以使用去噪网络估计含噪图像中的噪声,然后将其去除以获得去噪图像。
第三方前提条件
必需
此示例生成 CUDA MEX,并具有以下第三方要求。
CUDA® 支持 NVIDIA® GPU 和兼容驱动程序。
可选
对于非 MEX 编译,如静态、动态库或可执行文件,此示例有以下附加要求。
NVIDIA 工具包。
NVIDIA cuDNN 库。
编译器和库的环境变量。有关详细信息,请参阅Third-Party Hardware (GPU Coder)和Setting Up the Prerequisite Products (GPU Coder)。
验证 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-2019 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: To view the report, open(‘codegen/mex/denoisenet_predict/html/report.mldatx’).
运行生成的 MEX
针对输入范围为 [0,1] 的输入图像训练 DnCNN [1]。对 noisyI 调用 im2single 函数以将值从 [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.
原文地址
Beyond a Gaussian Denoiser:Residual Learning of Deep CNN for Image Denoising