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

В этом примере показано, как сгенерировать CUDA® MEX из кода MATLAB® и denoise полутоновых изображений при помощи сверточной нейронной сети шумоподавления (DnCNN [1]). Можно использовать сеть шумоподавления, чтобы оценить шум в шумном изображении, и затем удалить его, чтобы получить изображение denoised.

Сторонние необходимые условия

Необходимый

Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.

  • CUDA® включил NVIDIA® графический процессор и совместимый драйвер.

Дополнительный

Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall Функция (GPU Coder), чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

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 функция.

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.

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

Сгенерировать код CUDA для denoisenet_predict.m функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig (GPU Coder) функция, чтобы создать 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

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

DnCNN [1] обучен на входных изображениях, имеющих входной диапазон [0,1]. Вызовите im2single (Image Processing Toolbox) функция на 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.

Похожие темы