主要内容

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

这个例子展示了如何从MATLAB®代码生成CUDA®MEX,并使用去噪卷积神经网络(DnCNN[1])去噪灰度图像。可以利用去噪网络对有噪声的图像进行噪声估计,然后去除噪声,得到去噪后的图像。

第三方的先决条件

要求

本例生成CUDA MEX,并具有以下第三方需求。

  • CUDA®支持NVIDIA®GPU和兼容的驱动程序。

可选

对于非mex构建,如静态、动态库或可执行程序,此示例具有以下附加要求。

验证GPU环境

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

envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

加载噪声图像

将有噪声的灰度图像加载到工作空间中并显示该图像。

(噪音)“noisy_cameraman.png”);图imshow (noisyI);标题(“嘈杂的图像”);

获得预先训练的去噪网络

调用getDenoisingNetwork辅助函数得到预训练的图像去噪深度神经网络。

net = getDenoisingNetwork;

getDenoisingNetwork函数返回一个预先训练的DnCNN[1],您可以使用它来检测具有未知水平的加性高斯白噪声(AWGN)。该网络是一个前馈去噪卷积网络,实现了残差学习技术来预测残差图像。换句话说,DnCNN[1]计算噪声图像和潜在的干净图像之间的差异。

该网络包含59层,包括卷积层、批处理归一化层和回归输出层。要显示深度学习网络体系结构的交互式可视化,请使用analyzeNetwork函数。

analyzeNetwork(净);

denoisenet_predict函数

denoisenet_predict入口点函数接受有噪声的图像输入,并使用预先训练的去噪网络返回去噪后的图像。

函数加载返回的网络对象getDenoisingNetwork转化为一个持久变量mynet并在后续的预测调用中重用持久对象。

类型denoisenet_predict
The MathWorks, Inc. persistent mynet;如果isempty(mynet) mynet =编码器。loadDeepLearningNetwork(“getDenoisingNetwork”、“DnCNN”);激活方法从最后一层提取输出。使用% 'OutputAs' 'channels'名称-值对参数是为了在一个输入维度大于或等于网络的imageInputLayer.InputSize %的图像上调用% activation。Res = mynet。激活(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;

在这里,激活方法的层数值索引为59,以从网络的最后一层提取激活。的“OutputAs”“渠道”名称-值对参数在大于imageInputLayer。InputSize网络的。

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

一旦估计出噪声,从原始图像中减去噪声,得到去噪后的图像。

运行MEX代码生成

生成CUDA代码denoisenet_predict.m入口点函数,为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig(GPU编码器)函数来创建CuDNN的深度学习配置对象,并将其分配给DeepLearningConfig属性的图形处理器代码配置对象。运行codegen指定输入大小为[256,256]的命令。此值对应于您打算去噪的噪声图像的大小。

cfg = code .gpu config (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfgdenoisenet_predictarg游戏{(256256年,“单”)}报告
代码生成成功:要查看报告,打开('codegen/mex/denoisenet_predict/html/report.mldatx')。

运行生成的MEX

DnCNN[1]在输入范围为[0,1]的输入图像上进行训练。调用im2single(图像处理工具箱)函数noisyI将值从[0,255]调整到[0,1]。

调用denoisenet_predict_predict在缩放的输入图像上。

降噪edi =降噪enet_predict_mex(im2single(noisyI));

视图去噪图像

图imshowpair (noisyI denoisedI,“蒙太奇”);标题(“噪声图像(左)和去噪图像(右)”);

参考文献

[1]张凯,左伟,陈赟,张磊,张东,孟。超越高斯去噪:深度CNN图像去噪的残差学习。IEEE图像处理汇刊。第26卷第7期,2017年2月,第3142-3155页。

相关的话题