Этот пример показывает, как сгенерировать 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.