Этот пример показывает, как сгенерировать CUDA® MEX из кода MATLAB® и denoise полутоновых изображений при помощи шумоподавления сверточная нейронная сеть (DnCNN [1]). Сеть Denoising может использоваться, чтобы оценить шум в шумном изображении и затем удалить его, чтобы получить изображение denoised.
CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN v7 или выше.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Переменные окружения.
GPU Coder™ для генерации кода CUDA.
Deep Learning Toolbox™ для использования SeriesNetwork или объектов DAGNetwork.
Image Processing Toolbox™ для чтения и отображения изображений.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
coder.checkGpuInstall('gpu','codegen','cudnn','quiet');
Загрузите шумное полутоновое изображение на рабочую область и отобразите изображение.
noisyI = imread('noisy_cameraman.png'); figure imshow(noisyI); title('Noisy Image');
Вызовите getDenoisingNetwork функцию, чтобы получить предварительно обученную глубокую нейронную сеть шумоподавления изображений.
net = getDenoisingNetwork;
Функция getDenoisingNetwork
возвращает предварительно обученный DnCNN [1], который может использоваться, чтобы обнаружить аддитивный белый гауссов шум (AWGN) с неизвестными уровнями. Сеть является прямым каналом шумоподавлением сверточная сеть, которая реализует метод изучения невязки, чтобы предсказать остаточное изображение. Другими словами, DnCNN [1] вычисляет различие между шумным изображением и скрытым чистым изображением.
Сеть содержит 59 слоев включая свертку, пакетную нормализацию и регрессию выходные слои.
net.Layers
ans = 59x1 Layer array with layers: 1 'InputLayer' Image Input 50x50x1 images 2 'Conv1' Convolution 64 3x3x1 convolutions with stride [1 1] and padding [1 1 1 1] 3 'ReLU1' ReLU ReLU 4 'Conv2' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 5 'BNorm2' Batch Normalization Batch normalization with 64 channels 6 'ReLU2' ReLU ReLU 7 'Conv3' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 8 'BNorm3' Batch Normalization Batch normalization with 64 channels 9 'ReLU3' ReLU ReLU 10 'Conv4' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 11 'BNorm4' Batch Normalization Batch normalization with 64 channels 12 'ReLU4' ReLU ReLU 13 'Conv5' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 14 'BNorm5' Batch Normalization Batch normalization with 64 channels 15 'ReLU5' ReLU ReLU 16 'Conv6' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 17 'BNorm6' Batch Normalization Batch normalization with 64 channels 18 'ReLU6' ReLU ReLU 19 'Conv7' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 20 'BNorm7' Batch Normalization Batch normalization with 64 channels 21 'ReLU7' ReLU ReLU 22 'Conv8' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 23 'BNorm8' Batch Normalization Batch normalization with 64 channels 24 'ReLU8' ReLU ReLU 25 'Conv9' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 26 'BNorm9' Batch Normalization Batch normalization with 64 channels 27 'ReLU9' ReLU ReLU 28 'Conv10' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 29 'BNorm10' Batch Normalization Batch normalization with 64 channels 30 'ReLU10' ReLU ReLU 31 'Conv11' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 32 'BNorm11' Batch Normalization Batch normalization with 64 channels 33 'ReLU11' ReLU ReLU 34 'Conv12' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 35 'BNorm12' Batch Normalization Batch normalization with 64 channels 36 'ReLU12' ReLU ReLU 37 'Conv13' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 38 'BNorm13' Batch Normalization Batch normalization with 64 channels 39 'ReLU13' ReLU ReLU 40 'Conv14' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 41 'BNorm14' Batch Normalization Batch normalization with 64 channels 42 'ReLU14' ReLU ReLU 43 'Conv15' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 44 'BNorm15' Batch Normalization Batch normalization with 64 channels 45 'ReLU15' ReLU ReLU 46 'Conv16' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 47 'BNorm16' Batch Normalization Batch normalization with 64 channels 48 'ReLU16' ReLU ReLU 49 'Conv17' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 50 'BNorm17' Batch Normalization Batch normalization with 64 channels 51 'ReLU17' ReLU ReLU 52 'Conv18' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 53 'BNorm18' Batch Normalization Batch normalization with 64 channels 54 'ReLU18' ReLU ReLU 55 'Conv19' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 56 'BNorm19' Batch Normalization Batch normalization with 64 channels 57 'ReLU19' ReLU ReLU 58 'Conv20' Convolution 1 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 59 'FinalRegressionLayer' Regression Output mean-squared-error with response 'Response'
Функция denoisenet_predict берет шумный вход изображений и возвращает изображение denoised с помощью предварительно обученной сети шумоподавления.
Функция загружает сетевой объект, возвращенный getDenoisingNetwork в персистентную переменную mynet. На последующих вызовах функции постоянный объект снова используется для прогноза.
type denoisenet_predict
% Copyright 2018 The MathWorks, Inc. function I = denoisenet_predict(in) %#codegen % A persistent object mynet is used to load the SeriesNetwork network object. % At the first call to this function, the persistent object is constructed and % setup. When the function is called subsequent times, the same object is reused % to call predict on inputs, thus avoiding reconstructing and reloading the % network object. 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
на перемасштабированном входном изображении.
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.