В этом примере показано, как обучить нейронную сеть Очень глубокого суперразрешения (VDSR), затем используйте сеть VDSR, чтобы оценить изображение с высоким разрешением от одного изображения с низкой разрешающей способностью.
Пример показывает, как обучить сеть VDSR и также обеспечивает предварительно обученную сеть VDSR. Если вы принимаете решение обучить сеть VDSR, использование CUDA-способного графического процессора NVIDIA™ с вычисляют возможность 3.0, или выше настоятельно рекомендован. Использование графического процессора требует Parallel Computing Toolbox™.
Суперразрешение является процессом создания изображений с высоким разрешением от изображений с низкой разрешающей способностью. Этот пример рассматривает одно суперразрешение изображений (SISR), где цель состоит в том, чтобы восстановить одно изображение с высоким разрешением с одного изображения с низкой разрешающей способностью. SISR сложен, потому что высокочастотное содержимое изображения обычно не может восстанавливаться с изображения с низкой разрешающей способностью. Без высокочастотной информации ограничивается качество изображения с высоким разрешением. Далее, SISR является плохо изложенной проблемой, потому что одно изображение с низкой разрешающей способностью может дать к нескольким возможным изображениям с высоким разрешением.
Несколько методов, включая алгоритмы глубокого обучения, были предложены, чтобы выполнить SISR. Этот пример исследует один алгоритм глубокого обучения для SISR, названного очень глубоким суперразрешением (VDSR) [1].
VDSR является архитектурой сверточной нейронной сети, спроектированной, чтобы выполнить одно суперразрешение [1] изображений. Сеть VDSR обучается отображению между низким - и изображениями с высоким разрешением. Это отображение возможно, потому что изображения с высоким разрешением и с низкой разрешающей способностью имеют подобное содержимое изображения и отличаются, в основном, по высокочастотным деталям.
VDSR использует остаточную стратегию обучения, означая, что сеть учится оценивать остаточное изображение. В контексте суперразрешения остаточное изображение является различием между ссылочным изображением с высоким разрешением и изображением с низкой разрешающей способностью, которое было увеличено масштаб с помощью бикубической интерполяции, чтобы совпадать с размером ссылочного изображения. Остаточное изображение содержит информацию о высокочастотных деталях изображения.
Сеть VDSR обнаруживает остаточное изображение от яркости цветного изображения. Канал яркости изображения, Y
, представляет яркость каждого пикселя через линейную комбинацию красных, зеленых, и синих пиксельных значений. В отличие от этого два канала цветности изображения, Cb и Cr, являются различными линейными комбинациями красных, зеленых, и синих пиксельных значений, которые представляют информацию о цветовом различии. VDSR обучен с помощью только канал яркости, потому что человеческое восприятие более чувствительно к изменениям в яркости, чем к изменениям в цвете.
Если яркость изображения с высоким разрешением и яркость изображение с низкой разрешающей способностью, которое было увеличено масштаб с помощью бикубической интерполяции, затем вход к сети VDSR и сеть учится предсказывать от обучающих данных.
После того, как сеть VDSR учится оценивать остаточное изображение, можно восстановить изображения с высоким разрешением путем добавления предполагаемого остаточного изображения в сверхдискретизированное изображение с низкой разрешающей способностью, затем преобразования изображения назад в цветовое пространство RGB.
Масштабный коэффициент связывает размер ссылочного изображения к размеру изображения с низкой разрешающей способностью. Когда масштабный коэффициент увеличивается, SISR становится более плохо изложенным, потому что изображение с низкой разрешающей способностью теряет больше информации о высокочастотном содержимом изображения. VDSR решает эту задачу при помощи большого восприимчивого поля. Этот пример обучает сеть VDSR с несколькими масштабными коэффициентами с помощью увеличения шкалы. Масштабируйтесь увеличение улучшает результаты в факторах более широкого масштаба, потому что сеть может использовать в своих интересах контекст изображений от факторов меньшего масштаба. Кроме того, сеть VDSR может сделать вывод, чтобы принять изображения с масштабными коэффициентами нецелого числа.
Загрузите Сравнительный тест IAPR TC-12, который состоит из 20 000 все еще естественных изображений [2]. Набор данных включает фотографии людей, животных, города и т.д. Размер файла данных составляет ~1.8 Гбайт. Если вы не хотите загружать обучающий набор данных, то можно загрузить предварительно обученную сеть VDSR путем ввода load('trainedVDSR-Epoch-100-ScaleFactors-234.mat');
в командной строке. Затем перейдите непосредственно к разделу Perform Single Image Super-Resolution Using VDSR Network в этом примере.
Используйте функцию помощника, downloadIAPRTC12Data
, загружать данные. Эта функция присоединена к примеру как к вспомогательному файлу.
imagesDir = tempdir;
url = 'http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz';
downloadIAPRTC12Data(url,imagesDir);
Этот пример обучит сеть с небольшим подмножеством TC IAPR 12 Исходных данных. Загрузите imageCLEF обучающие данные. Все изображения являются 32-битными цветными изображениями JPEG.
trainImagesDir = fullfile(imagesDir,'iaprtc12','images','02'); exts = {'.jpg','.bmp','.png'}; pristineImages = imageDatastore(trainImagesDir,'FileExtensions',exts);
Перечислите количество учебных изображений.
numel(pristineImages.Files)
ans = 616
Чтобы создать обучающий набор данных, сгенерируйте пары изображений, состоящих из сверхдискретизированных изображений и соответствующих остаточных изображений.
Сверхдискретизированные изображения хранятся на диске как файлы MAT в директории upsampledDirName
. Вычисленные остаточные изображения, представляющие сетевые ответы, хранятся на диске как файлы MAT в директории residualDirName
. Файлы MAT хранятся как тип данных double
для большей точности при обучении сети.
upsampledDirName = [trainImagesDir filesep 'upsampledImages']; residualDirName = [trainImagesDir filesep 'residualImages'];
Используйте функцию помощника createVDSRTrainingSet
предварительно обрабатывать обучающие данные. Эта функция присоединена к примеру как к вспомогательному файлу.
Функция помощника выполняет эти операции для каждого нетронутого изображения в trainImages
:
Преобразуйте изображение в цветовое пространство YCbCr
Уменьшите яркость (Y) канал различными масштабными коэффициентами, чтобы создать демонстрационные изображения с низкой разрешающей способностью, затем измените размер изображений к первоначальному размеру с помощью бикубической интерполяции
Вычислите различие между нетронутыми и измененными изображениями.
Сохраните измененные и остаточные изображения на диск.
scaleFactors = [2 3 4]; createVDSRTrainingSet(pristineImages,scaleFactors,upsampledDirName,residualDirName);
В этом примере сетевые входные параметры являются изображениями с низкой разрешающей способностью, которые были сверхдискретизированы с помощью бикубической интерполяции. Желаемые сетевые ответы являются остаточными изображениями. Создайте datastore изображений под названием upsampledImages
из набора входных файлов изображений. Создайте datastore изображений под названием residualImages
из набора вычисленных остаточных файлов изображений. Оба хранилища данных требуют функции помощника, matRead
, считать данные изображения из файлов изображений. Эта функция присоединена к примеру как к вспомогательному файлу.
upsampledImages = imageDatastore(upsampledDirName,'FileExtensions','.mat','ReadFcn',@matRead); residualImages = imageDatastore(residualDirName,'FileExtensions','.mat','ReadFcn',@matRead);
Создайте imageDataAugmenter
это задает параметры увеличения данных. Используйте увеличение данных во время обучения варьироваться обучающие данные, который эффективно увеличивает сумму доступных обучающих данных. Здесь, увеличение задает случайное вращение 90 градусами и случайные отражения в направлении X.
augmenter = imageDataAugmenter( ... 'RandRotation',@()randi([0,1],1)*90, ... 'RandXReflection',true);
Создайте randomPatchExtractionDatastore
это выполняет рандомизированную экстракцию закрашенной фигуры от сверхдискретизированных и остаточных хранилищ данных изображений. Экстракция закрашенной фигуры является процессом извлечения большого набора маленьких закрашенных фигур изображений или мозаик, из одного увеличенного изображения. Этот тип увеличения данных часто используется в проблемах регрессии от изображения к изображению, где много сетевых архитектур могут быть обучены на очень небольших входных размерах изображения. Это означает, что большое количество закрашенных фигур может быть извлечено из каждого полноразмерного изображения в исходном наборе обучающих данных, который значительно увеличивает размер набора обучающих данных.
patchSize = [41 41]; patchesPerImage = 64; dsTrain = randomPatchExtractionDatastore(upsampledImages,residualImages,patchSize, ... "DataAugmentation",augmenter,"PatchesPerImage",patchesPerImage);
Получившийся datastore, dsTrain
, обеспечивает мини-пакеты данных к сети в каждой итерации эпохи. Предварительно просмотрите результат чтения от datastore.
inputBatch = preview(dsTrain); disp(inputBatch)
InputImage ResponseImage ______________ ______________ {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double} {41×41 double}
Этот пример задает сеть VDSR с помощью 41 отдельного слоя от Deep Learning Toolbox™, включая:
imageInputLayer
- Отобразите входной слой
convolution2dLayer
- 2D слой свертки для сверточных нейронных сетей
reluLayer
- Исправленный линейный модульный слой (ReLU)
regressionLayer
- Regression слой выхода для нейронной сети
Первый слой, imageInputLayer
, работает с закрашенными фигурами изображений. Размер закрашенной фигуры основан на сетевом восприимчивом поле, которое является пространственной областью изображений, которая влияет на ответ верхнего слоя в сети. Идеально, сетевое восприимчивое поле совпадает с размером изображения так, чтобы поле видело все высокоуровневые функции в изображении. В этом случае, для сети со сверточными слоями D, восприимчивое поле (2D+1) (2D+1).
VDSR имеет 20 сверточных слоев, таким образом, восприимчивое поле и размер закрашенной фигуры изображений 41 41. Входной слой изображений принимает изображения с одним каналом, потому что VDSR обучен с помощью только канал яркости.
networkDepth = 20; firstLayer = imageInputLayer([41 41 1],'Name','InputLayer','Normalization','none');
Входной слой изображений сопровождается 2D сверточным слоем, который содержит 64 фильтра 3х3 размера. Мини-пакетный размер определяет количество фильтров. Нулевая клавиатура входные параметры к каждому сверточному слою так, чтобы карты функции остались тот же размер как вход после каждой свертки. Он - метод [3], инициализирует веса к случайным значениям так, чтобы была асимметрия в изучении нейрона. Каждый сверточный слой сопровождается слоем ReLU, который вводит нелинейность в сети.
convLayer = convolution2dLayer(3,64,'Padding',1, ... 'WeightsInitializer','he','BiasInitializer','zeros','Name','Conv1');
Задайте слой ReLU.
relLayer = reluLayer('Name','ReLU1');
Средние слои содержат 18 переменных сверточных и исправленных линейных модульных слоев. Каждый сверточный слой содержит 64 фильтра размера 3 3 64, где фильтр работает с 3х3 пространственной областью через 64 канала. Как прежде, слой ReLU следует за каждым сверточным слоем.
middleLayers = [convLayer relLayer]; for layerNumber = 2:networkDepth-1 convLayer = convolution2dLayer(3,64,'Padding',[1 1], ... 'WeightsInitializer','he','BiasInitializer','zeros', ... 'Name',['Conv' num2str(layerNumber)]); relLayer = reluLayer('Name',['ReLU' num2str(layerNumber)]); middleLayers = [middleLayers convLayer relLayer]; end
Предпоследний слой является сверточным слоем с одним фильтром размера 3 3 64, который восстанавливает изображение.
convLayer = convolution2dLayer(3,1,'Padding',[1 1], ... 'WeightsInitializer','he','BiasInitializer','zeros', ... 'NumChannels',64,'Name',['Conv' num2str(networkDepth)]);
Последний слой является слоем регрессии вместо слоя ReLU. Слой регрессии вычисляет среднеквадратическую ошибку между остаточным изображением и сетевым предсказанием.
finalLayers = [convLayer regressionLayer('Name','FinalRegressionLayer')];
Конкатенация всех слоев, чтобы сформировать сеть VDSR.
layers = [firstLayer middleLayers finalLayers];
В качестве альтернативы можно использовать vdsrLayers
функция помощника, чтобы создать слои VDSR. Эта функция присоединена к примеру как к вспомогательному файлу.
layers = vdsrLayers;
Обучите сеть с помощью стохастического градиентного спуска с импульсом (SGDM) оптимизация. Задайте установки гиперпараметров для SGDM при помощи trainingOptions
функция. Скоростью обучения является первоначально 0.1
и уменьшенный фактором 10 каждых 10 эпох. Обучайтесь в течение 100 эпох.
Обучение глубокой сети длительно. Ускорьте обучение путем определения высокой скорости обучения. Однако это может заставить градиенты сети взрываться или расти неудержимо, предотвратив сеть от обучения успешно. Чтобы сохранить градиенты в значимой области значений, включите усечение градиента путем определения 'GradientThreshold'
как 0.01
, и задайте 'GradientThresholdMethod'
использовать L2-норму градиентов.
maxEpochs = 100; epochIntervals = 1; initLearningRate = 0.1; learningRateFactor = 0.1; l2reg = 0.0001; miniBatchSize = 64; options = trainingOptions('sgdm', ... 'Momentum',0.9, ... 'InitialLearnRate',initLearningRate, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropPeriod',10, ... 'LearnRateDropFactor',learningRateFactor, ... 'L2Regularization',l2reg, ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'GradientThresholdMethod','l2norm', ... 'GradientThreshold',0.01, ... 'Plots','training-progress', ... 'Verbose',false);
После конфигурирования опций обучения и случайного datastore экстракции закрашенной фигуры, обучите сеть VDSR с помощью trainNetwork
функция. Чтобы обучить сеть, установите doTraining
параметр в следующем коде к true
. CUDA-способный графический процессор NVIDIA™ с вычисляет возможность 3.0, или выше настоятельно рекомендован для обучения.
Если вы сохраняете doTraining
параметр в следующем коде как false
, затем пример возвращает предварительно обученную сеть VDSR, которая была обучена, чтобы суперразрешить изображения для масштабных коэффициентов 2, 3 и 4.
Примечание: Обучение занимает приблизительно 6 часов на Титане NVIDIA™ X и может взять еще дольше в зависимости от вашего оборудования графического процессора.
doTraining = false; if doTraining modelDateTime = datestr(now,'dd-mmm-yyyy-HH-MM-SS'); net = trainNetwork(dsTrain,layers,options); save(['trainedVDSR-' modelDateTime '-Epoch-' num2str(maxEpochs*epochIntervals) '-ScaleFactors-' num2str(234) '.mat'],'net','options'); else load('trainedVDSR-Epoch-100-ScaleFactors-234.mat'); end
Чтобы выполнить одно суперразрешение изображений (SISR) с помощью сети VDSR, выполните остающиеся шаги этого примера. Остаток от примера показывает как:
Создайте демонстрационное изображение с низкой разрешающей способностью из ссылочного изображения с высоким разрешением.
Выполните SISR на изображении с низкой разрешающей способностью с помощью бикубической интерполяции, традиционное решение для обработки изображений, которое не использует глубокое обучение.
Выполните SISR на изображении с низкой разрешающей способностью с помощью нейронной сети VDSR.
Визуально сравните восстановленные изображения с высоким разрешением с помощью бикубической интерполяции и VDSR.
Оцените качество суперразрешенных изображений путем определения количества подобия изображений к ссылочному изображению с высоким разрешением.
Создайте изображение с низкой разрешающей способностью, которое будет использоваться, чтобы сравнить результаты суперразрешения с помощью глубокого обучения для результата с помощью традиционных методов обработки изображений, таких как бикубическая интерполяция. Набор тестовых данных, testImages
, содержит 21 неискаженное изображение, поставленное в Image Processing Toolbox™. Загрузите изображения в imageDatastore
.
exts = {'.jpg','.png'}; fileNames = {'sherlock.jpg','car2.jpg','fabric.png','greens.jpg','hands1.jpg','kobi.png', ... 'lighthouse.png','micromarket.jpg','office_4.jpg','onion.png','pears.png','yellowlily.jpg', ... 'indiancorn.jpg','flamingos.jpg','sevilla.jpg','llama.jpg','parkavenue.jpg', ... 'peacock.jpg','car1.jpg','strawberries.jpg','wagon.jpg'}; filePath = [fullfile(matlabroot,'toolbox','images','imdata') filesep]; filePathNames = strcat(filePath,fileNames); testImages = imageDatastore(filePathNames,'FileExtensions',exts);
Отобразите изображения тестирования как монтаж.
montage(testImages)
Выберите одно из изображений, чтобы использовать в качестве ссылочного изображения для суперразрешения. Можно опционально использовать собственное изображение с высоким разрешением в качестве ссылочного изображения.
indx = 1; % Index of image to read from the test image datastore Ireference = readimage(testImages,indx); Ireference = im2double(Ireference); imshow(Ireference) title('High-Resolution Reference Image')
Создайте версию с низкой разрешающей способностью ссылочного изображения с высоким разрешением при помощи imresize
с масштабным коэффициентом 0,25. Высокочастотные компоненты изображения потеряны во время уменьшения масштаба.
scaleFactor = 0.25; Ilowres = imresize(Ireference,scaleFactor,'bicubic'); imshow(Ilowres) title('Low-Resolution Image')
Стандартный способ увеличить разрешение изображения без глубокого обучения состоит в том, чтобы использовать бикубическую интерполяцию. Увеличьте масштаб изображение с низкой разрешающей способностью с помощью бикубической интерполяции так, чтобы получившееся изображение с высоким разрешением было одного размера со ссылочным изображением.
[nrows,ncols,np] = size(Ireference); Ibicubic = imresize(Ilowres,[nrows ncols],'bicubic'); imshow(Ibicubic) title('High-Resolution Image Obtained Using Bicubic Interpolation')
Вспомните, что VDSR обучен с помощью только канал яркости изображения, потому что человеческое восприятие более чувствительно к изменениям в яркости, чем к изменениям в цвете.
Преобразуйте изображение с низкой разрешающей способностью от цветового пространства RGB до яркости (Iy
) и цветность (Icb
и Icr
) каналы при помощи rgb2ycbcr
функция.
Iycbcr = rgb2ycbcr(Ilowres); Iy = Iycbcr(:,:,1); Icb = Iycbcr(:,:,2); Icr = Iycbcr(:,:,3);
Увеличьте масштаб яркость и два канала цветности с помощью бикубической интерполяции. Сверхдискретизированные каналы цветности, Icb_bicubic
и Icr_bicubic
, не потребуйте никакой последующей обработки.
Iy_bicubic = imresize(Iy,[nrows ncols],'bicubic'); Icb_bicubic = imresize(Icb,[nrows ncols],'bicubic'); Icr_bicubic = imresize(Icr,[nrows ncols],'bicubic');
Передайте увеличенный масштаб компонент яркости, Iy_bicubic
, через обученную сеть VDSR. Наблюдайте activations
от последнего слоя (слой регрессии). Выход сети является желаемым остаточным изображением.
Iresidual = activations(net,Iy_bicubic,41);
Iresidual = double(Iresidual);
imshow(Iresidual,[])
title('Residual Image from VDSR')
Добавьте остаточное изображение в увеличенный масштаб компонент яркости, чтобы получить компонент яркости VDSR с высоким разрешением.
Isr = Iy_bicubic + Iresidual;
Конкатенация компонента яркости VDSR с высоким разрешением с увеличенными масштаб компонентами цвета. Преобразуйте изображение в цветовое пространство RGB при помощи ycbcr2rgb
функция. Результатом является итоговое цветное изображение с высоким разрешением с помощью VDSR.
Ivdsr = ycbcr2rgb(cat(3,Isr,Icb_bicubic,Icr_bicubic));
imshow(Ivdsr)
title('High-Resolution Image Obtained Using VDSR')
Чтобы получить лучшее визуальное понимание изображений с высоким разрешением, исследуйте небольшую область в каждом изображении. Задайте видимую область (ROI) с помощью векторного roi
в формате [x y высота ширины]. Элементы задают x-и y-координату левого верхнего угла, и ширину и высоту ROI.
roi = [320 30 480 400];
Обрежьте изображения с высоким разрешением к этому ROI и отобразите результат как монтаж. Изображение VDSR имеет более ясные детали и более резкие ребра, чем изображение с высоким разрешением, созданное с помощью бикубической интерполяции.
montage({imcrop(Ibicubic,roi),imcrop(Ivdsr,roi)})
title('High-Resolution Results Using Bicubic Interpolation (Left) vs. VDSR (Right)');
Используйте метрики качества изображения, чтобы количественно сравнить изображение с высоким разрешением с помощью бикубической интерполяции для изображения VDSR. Ссылочное изображение является исходным изображением с высоким разрешением, Ireference
, прежде, чем подготовить демонстрационное изображение с низкой разрешающей способностью.
Измерьте пиковое отношение сигнал-шум (PSNR) каждого изображения против ссылочного изображения. Большие значения PSNR обычно указывают на лучшее качество изображения. Смотрите psnr
для получения дополнительной информации об этой метрике.
bicubicPSNR = psnr(Ibicubic,Ireference)
bicubicPSNR = 38.4747
vdsrPSNR = psnr(Ivdsr,Ireference)
vdsrPSNR = 39.2346
Измерьте структурный индекс подобия (SSIM) каждого изображения. SSIM оценивает визуальный удар трех характеристик изображения: яркость, контраст и структура, против ссылочного изображения. Чем ближе значение SSIM к 1, тем лучше тестовое изображение соглашается со ссылочным изображением. Смотрите ssim
для получения дополнительной информации об этой метрике.
bicubicSSIM = ssim(Ibicubic,Ireference)
bicubicSSIM = 0.9861
vdsrSSIM = ssim(Ivdsr,Ireference)
vdsrSSIM = 0.9874
Измерьте перцепционное качество изображения с помощью Средства анализа качества изображения естественности (NIQE). Меньшие баллы NIQE указывают на лучшее перцепционное качество. Смотрите niqe
для получения дополнительной информации об этой метрике.
bicubicNIQE = niqe(Ibicubic)
bicubicNIQE = 5.1721
vdsrNIQE = niqe(Ivdsr)
vdsrNIQE = 4.7611
Вычислите средний PSNR и SSIM целого набора тестовых изображений для масштабных коэффициентов 2, 3, и 4. Для простоты можно использовать функцию помощника, superResolutionMetrics
, вычислить средние метрики. Эта функция присоединена к примеру как к вспомогательному файлу.
scaleFactors = [2 3 4]; superResolutionMetrics(net,testImages,scaleFactors);
Results for Scale factor 2 Average PSNR for Bicubic = 31.809683 Average PSNR for VDSR = 31.921784 Average SSIM for Bicubic = 0.938194 Average SSIM for VDSR = 0.949404 Results for Scale factor 3 Average PSNR for Bicubic = 28.170441 Average PSNR for VDSR = 28.563952 Average SSIM for Bicubic = 0.884381 Average SSIM for VDSR = 0.895830 Results for Scale factor 4 Average PSNR for Bicubic = 27.010839 Average PSNR for VDSR = 27.837260 Average SSIM for Bicubic = 0.861604 Average SSIM for VDSR = 0.877132
VDSR имеет лучшие метрические баллы, чем бикубическая интерполяция для каждого масштабного коэффициента.
[1] Ким, J., Дж. К. Ли и К. М. Ли. "Точное Суперразрешение Изображений Используя Очень Глубокие Сверточные Сети". Продолжения Конференции IEEE® по Компьютерному зрению и Распознаванию образов. 2016, стр 1646-1654.
[2] Grubinger, M. P. Ущелье, Х. Мюллер и Т. Дезелэерс. "Сравнительный тест IAPR TC-12: Новый Ресурс Оценки для Визуальных Информационных систем". Продолжения ресурсов OntoImage 2006 Языка Для Извлечения Изображений На основе содержимого. Генуя, Италия. Издание 5, май 2006, p. 10.
[3] Он, K., С. Чжан, С. Жэнь и Дж. Сун. "Копаясь Глубоко в Выпрямителях: Превышение Производительности Человеческого Уровня на Классификации ImageNet". Продолжения Международной конференции IEEE по вопросам Компьютерного зрения, 2015, стр 1026-1034.
combine
| randomPatchExtractionDatastore
| rgb2ycbcr
| trainNetwork
| trainingOptions
| transform
| ycbcr2rgb