В этом примере показано, как сгенерировать CUDA® MEX из кода MATLAB® и denoise полутоновых изображений при помощи сверточной нейронной сети шумоподавления (DnCNN [1]). Можно использовать сеть шумоподавления, чтобы оценить шум в шумном изображении, и затем удалить его, чтобы получить изображение denoised.
CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Переменные окружения.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Используйте 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), который имеет неизвестные уровни. Сеть является шумоподавлением feedforward сверточная сеть, которая реализует метод изучения невязки, чтобы предсказать остаточное изображение. Другими словами, DnCNN [1] вычисляет различие между шумным изображением и скрытым чистым изображением.
Сеть содержит 59 слоев включая свертку, пакетную нормализацию и регрессию выходные слои. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork
функция.
analyzeNetwork(net);
denoisenet_predict
ФункцияФункция enntry-точки denoisenet_predict берет шумный вход изображений и возвращает изображение denoised при помощи предварительно обученной сети шумоподавления.
Функция загружает сетевой объект, возвращенный 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
метод возвращает оценку шума во входном изображении при помощи предварительно обученного изображения шумоподавления.
Если шум оценивается, вычтите шум из оригинального изображения, чтобы получить изображение 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: 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] Чжан, K., В. Цзо, И. Чен, Д. Мэн и Л. Чжан. "Вне Гауссова Denoiser: Невязка, Узнающая о Глубоком CNN для Шумоподавления Изображений". Транзакции IEEE на Обработке изображений. Издание 26, Номер 7, февраль 2017, стр 3142-3155.