Регрессия от изображения к изображению в Deep Network Designer

В этом примере показано, как использовать Deep Network Designer, чтобы создать и обучить сеть регрессии от изображения к изображению для супер разрешения.

Пространственное разрешение является количеством пикселей, используемых, чтобы создать цифровое изображение. Изображение с высоким пространственным разрешением состоит из большего количества пикселей, и в результате изображение содержит большую деталь. Супер разрешение является процессом взятия в качестве входа изображение с невысокой четкостью и увелечение масштаба его в более высокое изображение разрешения. Когда вы работаете с данными изображения, вы можете уменьшать пространственное разрешение, чтобы уменьшить размер данных, за счет проигрывающей информации. Чтобы восстановить эту потерянную информацию, можно обучить нейронную сеть для глубокого обучения предсказывать недостающие детали изображения. В этом примере вы восстанавливаете 28 28 пиксельные изображения с изображений, которые были сжаты до 7 7 пикселей.

Загрузка данных

Этот пример использует набор данных цифр, который состоит из 10 000 синтетических полутоновых изображений рукописных цифр. Каждое изображение 28 28 на 1 пиксель.

Загрузите данные и создайте datastore изображений.

dataFolder = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset');

imds = imageDatastore(dataFolder, ...
    'IncludeSubfolders',true, ....
    'LabelSource','foldernames');

Используйте shuffle функционируйте, чтобы переставить данные до обучения.

imds = shuffle(imds);

Используйте splitEachLabel функционируйте, чтобы разделить datastore изображений на три хранилища данных изображений, содержащие изображения для обучения, валидации и тестирования.

[imdsTrain,imdsVal,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,'randomized');

Нормируйте данные в каждом изображении к области значений [0,1]. Нормализация помогает стабилизироваться и ускорить сетевое обучение с помощью градиентного спуска. Если ваши данные плохо масштабируются, то потеря может стать NaN, и сетевые параметры могут отличаться во время обучения.

imdsTrain = transform(imdsTrain,@(x) rescale(x));
imdsVal = transform(imdsVal,@(x) rescale(x));
imdsTest = transform(imdsTest,@(x) rescale(x));

Сгенерируйте обучающие данные

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

Чтобы обучить сеть, чтобы выполнить регрессию от изображения к изображению, изображения должны быть парами, состоящими из входа и ответа, где оба изображения одного размера. Сгенерируйте обучающие данные путем субдискретизации каждого изображения к 7 7 пикселям и затем повышающей дискретизации к 28 28 пикселям. Используя пары преобразованных и оригинальных изображений, сеть может изучить, как сопоставить между двумя различными разрешениями.

Сгенерируйте входные данные с помощью функции помощника upsampLowRes, который использует imresize произвести более низкие изображения разрешения.

imdsInputTrain = transform(imdsTrain,@upsampLowRes);
imdsInputVal= transform(imdsVal,@upsampLowRes);
imdsInputTest = transform(imdsTest,@upsampLowRes);

Используйте combine функционируйте, чтобы объединить изображения с низким разрешением и высокого разрешения в один datastore. Выход combine функцией является CombinedDatastore объект.

dsTrain = combine(imdsInputTrain,imdsTrain);
dsVal = combine(imdsInputVal,imdsVal);
dsTest = combine(imdsInputTest,imdsTest);

Создайте сетевую архитектуру

Создайте сетевую архитектуру с помощью unetLayers функция от Computer Vision Toolbox™. Эта функция обеспечивает сеть, подходящую для семантической сегментации, которая может быть легко адаптирована к регрессии от изображения к изображению.

Создайте сеть с входным размером 28 28 на 1 пиксель.

layers = unetLayers([28,28,1],2,'encoderDepth',2);

Отредактируйте сеть для регрессии от изображения к изображению с помощью Deep Network Designer.

deepNetworkDesigner(layers);

В панели Разработчика замените softmax и слои классификации пикселей со слоем регрессии от Библиотеки Слоя.

Выберите итоговый сверточный слой и установите NumFilters свойство к 1.

Сеть теперь готова к обучению.

Импортируйте данные

Импортируйте данные об обучении и валидации в Deep Network Designer.

Во вкладке Data нажмите Import Data> Import Datastore и выберите dsTrain как обучающие данные и dsVal как данные о валидации. Импортируйте оба хранилища данных путем нажатия на Import.

Deep Network Designer отображает пары изображений в объединенном datastore. Увеличенные масштаб с низким разрешением входные изображения слева, и исходные изображения ответа высокого разрешения справа. Сеть изучает, как сопоставить между входом и изображениями ответа.

Обучение сети

Выберите опции обучения и обучите сеть.

Во вкладке Training выберите Training Options. Из списка Решателей выберите adam. Установите MaxEpochs на 10. Подтвердите опции обучения путем нажатия на Close.

Обучите сеть на объединенном datastore путем нажатия на Train.

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

Если обучение завершено, нажмите Export, чтобы экспортировать обучивший сеть в рабочую область. Обучивший сеть хранится в переменной trainedNetwork_1.

Тестирование сети

Оцените эффективность сети с помощью тестовых данных.

Используя predict, можно протестировать, если сеть может произвести изображение высокого разрешения из с низким разрешением входного изображения, которое не было включено в набор обучающих данных.

ypred = predict(trainedNetwork_1,dsTest);

for i = 1:8
    I(1:2,i) = read(dsTest);
    I(3,i) = {ypred(:,:,:,i)};
end

Сравните вход, предсказанный, и изображения ответа.

subplot(1,3,1)
imshow(imtile(I(1,:),'GridSize',[8,1]))
title('Input')
subplot(1,3,2)
imshow(imtile(I(3,:),'GridSize',[8,1]))
title('Predict')
subplot(1,3,3)
imshow(imtile(I(2,:),'GridSize',[8,1]))
title('Response')

Сеть успешно производит изображения высокого разрешения из с низким разрешением входных параметров.

Сеть в этом примере является очень простой и узкоспециализированной к набору данных цифр. Для примера, показывающего, как создать более комплексную сеть регрессии от изображения к изображению для повседневных изображений, смотрите, что Одно Суперразрешение Изображений Использует Глубокое обучение.

Вспомогательные Функции

function dataOut = upsampLowRes(dataIn)
        temp = dataIn;
        temp = imresize(temp,[7,7],'method','bilinear');
        dataOut = {imresize(temp,[28,28],'method','bilinear')};
end

Смотрите также

|

Похожие темы