exponenta event banner

Суперразрешение одного изображения с помощью глубокого обучения

В этом примере показано, как оценить изображение с высоким разрешением по изображению с низким разрешением с помощью нейронной сети с очень глубоким сверхразрешением (VDSR).

Суперразрешение - это процесс создания изображений с высоким разрешением из изображений с низким разрешением. В этом примере рассматривается суперразрешение одного изображения (SISR), где целью является восстановление одного изображения с высоким разрешением из одного изображения с низким разрешением. SISR является сложной задачей, поскольку содержимое высокочастотного изображения обычно не может быть восстановлено из изображения с низким разрешением. Без высокочастотной информации качество изображения высокого разрешения ограничено. Кроме того, SISR является неуместной проблемой, поскольку одно изображение с низким разрешением может давать несколько возможных изображений с высоким разрешением.

Для выполнения SISR было предложено несколько методов, включая алгоритмы глубокого обучения. В этом примере исследуется один алгоритм глубокого обучения для SISR, называемый очень глубоким суперразрешением (VDSR) [1].

Сеть VDSR

VDSR - сверточная нейронная сетевая архитектура, предназначенная для выполнения суперразрешения одиночного изображения [1]. Сеть VDSR распознает соответствие между изображениями с низким и высоким разрешением. Такое отображение возможно, поскольку изображения с низким разрешением и с высоким разрешением имеют одинаковое содержание изображения и отличаются главным образом высокочастотными деталями.

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

Сеть VDSR обнаруживает остаточное изображение по яркости цветного изображения. Канал яркости изображения, Y, представляет яркость каждого пикселя через линейную комбинацию значений красного, зеленого и синего пикселей. Напротив, два канала цветности изображения, Cb и Cr, представляют собой различные линейные комбинации значений красного, зеленого и синего пикселей, которые представляют информацию о цветоразнице. VDSR обучается, используя только канал яркости, потому что человеческое восприятие более чувствительно к изменениям яркости, чем к изменениям цвета.

Если Yhighres - яркость изображения высокого разрешения, а Ylowres - яркость изображения низкого разрешения, которое было увеличено с помощью бикубической интерполяции, то вход в сеть VDSR - это Ylowres, и сеть учится предсказывать Yresidual = Yhighres-Ylowres из обучающих данных.

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

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

Загрузить данные обучения и тестирования

Загрузите IAPR TC-12 Benchmark, который состоит из 20 000 натурных изображений [2]. Набор данных включает фотографии людей, животных, городов и многое другое. Размер файла данных составляет ~ 1,8 ГБ. Если не требуется загружать набор обучающих данных, можно загрузить предварительно обученную сеть VDSR, набравload('trainedVDSR-Epoch-100-ScaleFactors-234.mat'); в командной строке. Затем перейдите непосредственно к разделу Выполнение суперразрешения одиночного изображения с использованием сети VDSR в этом примере.

Используйте функцию помощника, downloadIAPRTC12Data, для загрузки данных. Эта функция присоединена к примеру как вспомогательный файл.

imagesDir = tempdir;
url = 'http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz';
downloadIAPRTC12Data(url,imagesDir);

В этом примере сеть будет обучаться с помощью небольшого подмножества данных IAPR TC-12 Benchmark. Загрузите учебные данные 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);

Определение конвейера предварительной обработки для обучающего набора

В этом примере сетевые входы представляют собой изображения с низким разрешением, которые были дискретизированы с использованием бикубической интерполяции. Требуемыми сетевыми ответами являются остаточные изображения. Создание хранилища данных образа с именем upsampledImages из коллекции входных файлов изображений. Создание хранилища данных образа с именем residualImages из коллекции вычисленных файлов остаточных изображений. Для обоих хранилищ данных требуется вспомогательная функция, matRead, для считывания данных изображения из файлов изображений. Эта функция присоединена к примеру как вспомогательный файл.

upsampledImages = imageDatastore(upsampledDirName,'FileExtensions','.mat','ReadFcn',@matRead);
residualImages = imageDatastore(residualDirName,'FileExtensions','.mat','ReadFcn',@matRead);

Создание imageDataAugmenter определяет параметры увеличения данных. Используйте увеличение данных во время обучения для изменения данных обучения, что эффективно увеличивает объем доступных данных обучения. Здесь augmenter задает случайное вращение на 90 градусов и случайные отражения в направлении х.

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);

Полученное хранилище данных, dsTrainпредоставляет мини-пакеты данных в сеть на каждой итерации эпохи. Предварительный просмотр результата чтения из хранилища данных.

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

В этом примере определяется сеть VDSR с использованием 41 отдельного уровня из Deep Learning Toolbox™, включая:

  • imageInputLayer - Слой ввода изображения

  • convolution2dLayer - 2-D сверточный слой для сверточных нейронных сетей

  • reluLayer - Слой выпрямленного линейного блока (ReLU)

  • regressionLayer - Уровень регрессионного вывода для нейронной сети

Первый слой, imageInputLayer, работает с исправлениями изображений. Размер исправления основан на сетевом поле приема, которое является пространственной областью изображения, влияющей на отклик самого верхнего уровня в сети. В идеале поле сетевого приемника совпадает с размером изображения, так что поле может видеть все функции высокого уровня в изображении. В этом случае для сети с D сверточными слоями воспринимающим полем является (2D + 1) -by- (2D + 1).

VDSR имеет 20 сверточных уровня, так что воспринимающее поле и размер исправления изображения равны 41 на 41. Уровень ввода изображения принимает изображения с одним каналом, поскольку VDSR обучается только с использованием канала яркости.

networkDepth = 20;
firstLayer = imageInputLayer([41 41 1],'Name','InputLayer','Normalization','none');

За входным слоем изображения следует сверточный слой 2-D, содержащий фильтры 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-norm градиентов.

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);

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

По умолчанию в примере загружается предварительно подготовленная версия сети VDSR, обученная сверхразрешению изображений для масштабных коэффициентов 2, 3 и 4. Предварительно обученная сеть позволяет выполнять суперразрешение тестовых изображений, не дожидаясь завершения обучения.

Для обучения сети VDSR установите doTraining переменная в следующем коде true. Обучение сети с помощью trainNetwork функция.

Обучение на GPU, если он доступен. Для использования графического процессора требуются параллельные вычислительные Toolbox™ и графический процессор NVIDIA ® с поддержкой CUDA ®. Дополнительные сведения см. в разделе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений). Обучение занимает около 6 часов на NVIDIA Titan X.

doTraining = false;
if doTraining
    net = trainNetwork(dsTrain,layers,options);
    modelDateTime = string(datetime('now','Format',"yyyy-MM-dd-HH-mm-ss"));
    save(strcat("trainedVDSR-",modelDateTime,"-Epoch-",num2str(maxEpochs),"-ScaleFactors-234.mat"),'net');
else
    load('trainedVDSR-Epoch-100-ScaleFactors-234.mat');
end

Выполнение суперразрешения одного изображения с использованием сети VDSR

Чтобы выполнить суперразрешение одного изображения (SISR) с использованием сети VDSR, выполните остальные шаги этого примера. В остальном примере показано, как:

  • Создайте образец изображения с низким разрешением из опорного изображения с высоким разрешением.

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

  • Выполнение SISR на изображении низкого разрешения с помощью нейронной сети VDSR.

  • Визуальное сравнение реконструированных изображений высокого разрешения с использованием бикубической интерполяции и VDSR.

  • Оцените качество сверхразрешенных изображений путем количественной оценки сходства изображений с опорным изображением высокого разрешения.

Создание образца изображения с низким разрешением

Создайте изображение с низким разрешением, которое будет использоваться для сравнения результатов сверхразрешения с использованием глубокого обучения с результатом с использованием традиционных методов обработки изображений, таких как бикубическая интерполяция. Набор тестовых данных, testImagesсодержит 21 неискаженное изображение, переданное в 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

Напомним, что 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 width height]. Элементы определяют координаты x и y верхнего левого угла, а также ширину и высоту окупаемости инвестиций.

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] Грубингер, М., П. Клаф, Х. Мюллер и Т. Деселер. «Эталонный тест IAPR TC-12: новый ресурс оценки для визуальных информационных систем». Труды языковых ресурсов TrainingImage 2006 для извлечения изображений на основе контента. Генуя, Италия. Том 5, май 2006, стр. 10.

[3] Он, К., X. Zhang, С. Рен и Дж. Сун. «Углубляясь в выпрямители: превосходя показатели на уровне человека по классификации ImageNet». Материалы Международной конференции IEEE по компьютерному зрению, 2015 год, стр. 1026-1034.

См. также

| | | | | |

Связанные темы