В этом примере показано, как сгенерировать 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
Функция helper для получения предварительно обученного изображения, обличающего глубокую нейронную сеть.
net = getDenoisingNetwork;
The getDenoisingNetwork
функция возвращает предварительно обученный DnCNN [1], который можно использовать, чтобы обнаружить аддитивный белый Гауссов шум (AWGN), который имеет неизвестные уровни. Сеть является передающей обесценивающей сверточной сетью, которая реализует метод остаточного обучения для предсказания остаточного изображения. Другими словами, DnCNN [1] вычисляет различие между шумным изображением и скрытым чистым изображением.
Сеть содержит 59 слоев, включая свертки, нормализацию партии . и выходные слои регрессии. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork
функция.
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
(GPU Coder) функция для создания 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.