В этом примере показано, как сгенерировать CUDA ® MEX из кода MATLAB ® и денуизировать изображения в полутоновом цвете с помощью деноизирующей сверточной нейронной сети (DnCNN [1]). Можно использовать деноцирующую сеть, чтобы оценить шум в шумном изображении, а затем удалить его, чтобы получить деноизмененное изображение.
Необходимый
Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.
Графический процессор NVIDIA с поддержкой CUDA ® и совместимый драйвер.
Дополнительный
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментальных средств NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Используйте coder.checkGpuInstall функция для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
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 Функция helper для получения предварительно обученного изображения, обличающего глубокую нейронную сеть.
net = getDenoisingNetwork;
The getDenoisingNetwork функция возвращает предварительно обученный DnCNN [1], который можно использовать, чтобы обнаружить аддитивный белый Гауссов шум (AWGN), который имеет неизвестные уровни. Сеть является передающей обесценивающей сверточной сетью, которая реализует метод остаточного обучения для предсказания остаточного изображения. Другими словами, DnCNN [1] вычисляет различие между шумным изображением и скрытым чистым изображением.
Сеть содержит 59 слоев, включая свертки, нормализацию партии . и выходные слои регрессии. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork (Deep Learning Toolbox) функция.
analyzeNetwork(net);
denoisenet_predict ФункцияThe 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, чтобы извлечь активации из последнего уровня сети. The 'OutputAs' 'channels' аргумент пары "имя-значение" вычисляет активации на изображениях, больших, чем imageInputLayer.InputSize сети.
The activations метод возвращает оценку шума в вход изображении при помощи предварительно обученного шумоподавления изображения.
Когда шум будет оценен, вычесть шум из оригинального изображения, чтобы получить обесцененное изображение.
Чтобы сгенерировать код CUDA для denoisenet_predict.m функция точки входа, создайте объект строения кода GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig функция для создания CuDNN объект строения глубокого обучения и присвоение его DeepLearningConfig свойство объекта строения кода GPU. Запуск 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').
DnCNN [1] обучается на входных изображениях, имеющих входную область значений [0,1]. Вызовите im2single (Image Processing Toolbox) функция на noisyI для изменения значения от [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. Помимо Гауссова Денуазера: Остаточное Обучение Deep CNN для шумоподавления изображений. Транзакции IEEE по обработке изображений. Том 26, № 7, февраль 2017, с. 3142-3155.
coder.CodeConfig | coder.CuDNNConfig | coder.EmbeddedCodeConfig | coder.gpuConfig | coder.gpuEnvConfig