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

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

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

Используйте 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 Функция helper для получения предварительно обученного изображения, обличающего глубокую нейронную сеть.

net = getDenoisingNetwork;

The getDenoisingNetwork функция возвращает предварительно обученный DnCNN [1], который можно использовать, чтобы обнаружить аддитивный белый Гауссов шум (AWGN), который имеет неизвестные уровни. Сеть является передающей обесценивающей сверточной сетью, которая реализует метод остаточного обучения для предсказания остаточного изображения. Другими словами, DnCNN [1] вычисляет различие между шумным изображением и скрытым чистым изображением.

Сеть содержит 59 слоев, включая свертки, нормализацию партии . и выходные слои регрессии. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork (Deep Learning Toolbox) функция.

analyzeNetwork(net);

The denoisenet_predict Функция

The denoisenet_predict функция точки входа принимает зашумленный вход изображения и возвращает обесцененное изображение с помощью предварительно обученной обесценивающей сети.

Функция загружает сетевой объект, возвращенный 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, чтобы извлечь активации из последнего уровня сети. The 'OutputAs' 'channels' аргумент пары "имя-значение" вычисляет активации на изображениях, больших, чем imageInputLayer.InputSize сети.

The activations метод возвращает оценку шума в вход изображении при помощи предварительно обученного шумоподавления изображения.

Когда шум будет оценен, вычесть шум из оригинального изображения, чтобы получить обесцененное изображение.

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

Чтобы сгенерировать код CUDA для denoisenet_predict.m функция точки входа, создайте объект строения кода GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig функция для создания CuDNN объект строения глубокого обучения и присвоение его DeepLearningConfig свойство объекта строения кода GPU. Запуск codegen команда, задающая размер входа [256 256]. Это значение соответствует размеру шумного изображения, которое вы намереваетесь обесценить.

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 (Image Processing Toolbox) функция на 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] Zhang, K., W. Zuo, Y. Chen, D. Meng, and L. Zhang. Помимо Гауссова Денуазера: Остаточное Обучение Deep CNN для шумоподавления изображений. Транзакции IEEE по обработке изображений. Том 26, № 7, февраль 2017, с. 3142-3155.

См. также

Функции

Объекты

Похожие темы