В этом примере показано, как сгенерировать CUDA® MEX из кода MATLAB® и denoise полутоновых изображений при помощи сверточной нейронной сети шумоподавления (DnCNN [1]). Можно использовать сеть шумоподавления, чтобы оценить шум в шумном изображении, и затем удалить его, чтобы получить изображение denoised.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA® включил NVIDIA® графический процессор и совместимый драйвер.
Дополнительный
Для сборок не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
функция помощника, чтобы получить предварительно обученную глубокую нейронную сеть шумоподавления изображений.
net = getDenoisingNetwork;
getDenoisingNetwork
функция возвращает предварительно обученный DnCNN [1], который можно использовать, чтобы обнаружить аддитивный белый Гауссов шум (AWGN), который имеет неизвестные уровни. Сеть является шумоподавлением прямого распространения сверточная сеть, которая реализует метод изучения невязки, чтобы предсказать остаточное изображение. Другими словами, DnCNN [1] вычисляет различие между шумным изображением и скрытым чистым изображением.
Сеть содержит 59 слоев включая свертку, нормализацию партии. и регрессию выходные слои. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork
(Deep Learning Toolbox) функция.
analyzeNetwork(net);
denoisenet_predict
Функцияdenoisenet_predict
функция точки входа берет шумный вход изображений и возвращает изображение denoised при помощи предварительно обученной сети шумоподавления.
Функция загружает сетевой объект, возвращенный getDenoisingNetwork
в персистентную переменную mynet и повторные использования постоянный объект на последующих вызовах предсказания.
type denoisenet_predict
function I = denoisenet_predict(in) %#codegen % Copyright 2018-2021 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
метод возвращает оценку шума во входном изображении при помощи предварительно обученного изображения шумоподавления.
Если шум оценивается, вычтите шум из оригинального изображения, чтобы получить изображение denoised.
Сгенерировать код CUDA для denoisenet_predict.m
функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig
функция, чтобы создать CuDNN
объект настройки глубокого обучения и присвоение это к DeepLearningConfig
свойство объекта настройки графического процессора кода. Запустите codegen
команда, задающая входной размер [256,256]. Это значение соответствует размеру шумного изображения, которое вы предназначаете к denoise.
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: View report
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] Чжан, K., В. Цзо, И. Чен, Д. Мэн и Л. Чжан. "Вне Гауссова Denoiser: Невязка, Узнающая о Глубоком CNN для Шумоподавления Изображений". Транзакции IEEE на Обработке изображений. Издание 26, Номер 7, февраль 2017, стр 3142-3155.
coder.gpuConfig
| coder.CodeConfig
| coder.EmbeddedCodeConfig
| coder.gpuEnvConfig
| coder.CuDNNConfig