В этом примере показано, как генерировать CUDA ® MEX из кода MATLAB ® и закрывать изображения в градациях серого с помощью деноизирующей сверточной нейронной сети (DnCNN [1]). Можно использовать помехоустойчивую сеть для оценки шума в шумном изображении, а затем удалить ее для получения засоренного изображения.
Необходимый
В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.
Графический процессор NVIDIA ® с поддержкой CUDA ® и совместимый драйвер.
Дополнительный
Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей (GPU Coder) и Настройка необходимых продуктов (GPU Coder).
Используйте 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 способ возвращает оценку шума во входном изображении с использованием предварительно обученного денуалирующего изображения.
Как только шум оценен, вычитайте шум из исходного изображения, чтобы получить деноизированное изображение.
Создание кода CUDA для denoisenet_predict.m создание объекта конфигурации кода GPU для цели MEX и установка целевого языка на C++. Используйте coder.DeepLearningConfig (Кодер графического процессора) для создания CuDNN глубокий объект конфигурации обучения и назначить его 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').
DnCNN [1] обучается на входных изображениях, имеющих входной диапазон [0,1]. Позвоните в im2single(Панель инструментов обработки изображений) на 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] Чжан, К., В. Цзо, Я. Чен, Д. Мэн и Л. Чжан. «За пределами гауссова денуазера: остаточное обучение глубокому CNN для обличения изображений». Транзакции IEEE при обработке изображений. Том 26, номер 7, февраль 2017 г., стр. 3142-3155.