Генерация кода для глубокой нейронной сети шумоподавления

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

Запустите генерацию кода MEX

Чтобы сгенерировать код 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').

Запустите сгенерированный MEX

DnCNN [1] обучен на входных изображениях, имеющих входной диапазон [0,1]. Вызовите im2single функцию на noisyI повторно масштабировать значения от [0,255] до [0,1].

Вызовите denoisenet_predict_predict на перемасштабированном входном изображении.

denoisedI = denoisenet_predict_mex(im2single(noisyI));

Просмотрите изображение Denoised

figure
imshowpair(noisyI,denoisedI,'montage');
title('Noisy Image (left) and Denoised Image (right)');

Ссылки

[1] Чжан, K., В. Цзо, И. Чен, Д. Мэн и Л. Чжан. "Вне Гауссова Denoiser: Невязка, Узнающая о Глубоком CNN для Шумоподавления Изображений". Транзакции IEEE на Обработке изображений. Издание 26, Номер 7, февраль 2017, стр 3142-3155.