Регрессия изображение-изображение в 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 функция от Toolbox™ Computer Vision. Эта функция обеспечивает сеть, подходящую для семантической сегментации, которая может быть легко адаптирована для регрессии изображения к изображению.

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

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

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

deepNetworkDesigner(layers);

На панели Designer замените слои классификации softmax и пикселей слоем регрессии из библиотеки слоев.

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

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

Импорт данных

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

На вкладке Данные щелкните Импорт данных > Импорт Datastore и выберите dsTrain как обучающие данные и dsVal в качестве данных валидации. Импортировать оба хранилища данных можно нажав кнопку Импорт.

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

Обучите сеть

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

На вкладке Обучение выберите Опции обучения. В списке Решатель выберите adam. Установите MaxEpochs на 10. Подтвердите опции обучения, нажав кнопку Закрыть.

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

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

После завершения обучения щелкните Экспортом, чтобы экспортировать обученную сеть в рабочую область. Обученная сеть сохранена в переменной 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')

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

Сеть в этом примере очень проста и сильно адаптирована к набору данных цифр. Для примера, показывающего, как создать более сложную сеть регрессии изображение-изображение для повседневных изображений, смотрите Single Image Super-Resolution Using Deep Learning.

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

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

См. также

|

Похожие темы