Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

딥러닝을 사용한 단일 영상 초고해상도 복원 기법

이 예제에서는 VDSR(Very-Deep Super-Resolution) 신경망을 훈련시킨 다음 VDSR 신경망을 사용하여 하나의 저해상도 영상에서 고해상도 영상을 추정하는 방법을 보여줍니다.

이 예제에서는 VDSR 신경망을 훈련시키는 방법을 보여주고, 사전 훈련된 VDSR 신경망도 제공합니다. VDSR 신경망을 훈련시키려는 경우 CUDA 지원 NVIDIA™ GPU(Compute Capability 3.0 이상)를 사용하는 것이 권장됩니다. GPU를 사용하려면 Parallel Computing Toolbox™가 필요합니다.

소개

초고해상도 기법은 저해상도 영상에서 고해상도 영상을 만드는 방법입니다. 이 예제에서는 단일 영상 초고해상도(SISR) 복원 기법을 다룹니다. 여기서 목표는 하나의 저해상도 영상에서 하나의 고해상도 영상을 복구하는 것입니다. 일반적으로 저해상도 영상에서는 고주파 영상 콘텐츠를 복구할 수 없기 때문에 SISR은 까다롭습니다. 고주파 정보가 없으면 고해상도 영상의 품질이 제한됩니다. 또한, 하나의 저해상도 영상이 여러 개의 가능한 고해상도 영상을 산출할 수 있기 때문에 SISR은 불량 조건 문제입니다.

SISR을 수행하기 위해 딥러닝 알고리즘을 비롯한 몇 가지 기법이 제안되었습니다. 이 예제에서는 SISR을 위한 딥러닝 알고리즘의 하나인 VDSR(Very-Deep Super-Resolution) [1]을 살펴봅니다.

VDSR 신경망

VDSR은 단일 영상 초고해상도 복원을 수행하도록 설계된 컨벌루션 신경망 아키텍처입니다 [1]. VDSR 신경망은 저해상도 영상과 고해상도 영상 사이의 매핑을 학습합니다. 이 매핑은 저해상도 영상과 고해상도 영상이 비슷한 영상 콘텐츠를 가지고 있고 주로 고주파 세부 정보만 다르기 때문에 가능합니다.

VDSR은 잔차 학습 전략을 사용합니다. 즉, 이 신경망은 잔차 영상을 추정하도록 학습합니다. 초고해상도 기법에서 잔차 영상이란 참조 영상의 크기와 일치하도록 쌍삼차 보간을 사용하여 업스케일링된 저해상도 영상과 고해상도 참조 영상과 사이의 차이입니다. 잔차 영상은 영상의 고주파 세부 정보에 대한 정보를 포함합니다.

VDSR 신경망은 컬러 영상의 휘도로부터 잔차 영상을 검출합니다. 영상의 휘도 채널 Y는 빨간색, 녹색, 파란색 픽셀 값의 일차 결합을 통해 각 픽셀의 밝기를 나타냅니다. 이와 반대로, 영상의 두 색차 채널 CbCr은 빨간색, 녹색, 파란색 픽셀 값의 다른 일차 결합으로 색차 정보를 나타냅니다. 인간의 지각은 색의 변화보다 밝기의 변화에 더 민감하기 때문에 VDSR은 휘도 채널만 사용하여 훈련됩니다.

Yhighres가 고해상도 영상의 휘도이고 Ylowres가 쌍삼차 보간을 사용하여 업스케일링된 저해상도 영상의 휘도라면 VDSR 신경망에 대한 입력값은 Ylowres가 되고 신경망은 훈련 데이터로부터 Yresidual=Yhighres-Ylowres를 예측하도록 학습합니다.

VDSR 신경망이 잔차 영상을 추정하도록 학습한 후에는 업샘플링된 저해상도 영상에 추정된 잔차 영상을 더한 다음 영상을 다시 RGB 컬러스페이스로 변환하여 고해상도 영상을 복원할 수 있습니다.

스케일링 인자가 참조 영상의 크기를 저해상도 영상의 크기와 연결시킵니다. 스케일링 인자가 커질수록 저해상도 영상에서 고주파 영상 콘텐츠의 정보가 더 많이 손실되므로 SISR은 더욱 불량한 조건이 됩니다. VDSR은 큰 수용 영역을 사용함으로써 이 문제를 해결합니다. 이 예제에서는 스케일 증대를 사용하여 여러 개의 스케일링 인자로 VDSR 신경망을 훈련시킵니다. 스케일 증대를 사용하면 신경망이 작은 스케일링 인자를 사용해서 얻은 영상 컨텍스트를 활용할 수 있기 때문에 더 큰 스케일링 인자를 사용했을 때 결과가 개선됩니다. 또한, VDSR 신경망은 정수가 아닌 스케일링 인자를 갖는 영상을 수용하도록 일반화될 수 있습니다.

훈련 데이터와 테스트 데이터 다운로드하기

20,000개의 스틸 자연 영상으로 이루어진 IAPR TC-12 Benchmark를 다운로드합니다 [2]. 이 데이터 세트에는 사람, 동물, 도시 등의 사진이 포함되어 있습니다. 데이터 파일의 크기는 최대 1.8GB입니다. 훈련 데이터 세트를 다운로드하기를 원치 않는 경우에는 명령줄에 load('trainedVDSR-Epoch-100-ScaleFactors-234.mat');를 입력하여 사전 훈련된 VDSR 신경망을 불러올 수 있습니다. 그런 다음 이 예제의 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 (Deep Learning Toolbox)를 만듭니다. 훈련 중에 데이터 증대를 사용하여 훈련 데이터를 바꿉니다. 이렇게 하면 사용 가능한 훈련 데이터의 양이 늘어납니다. 여기서 증대기는 90도만큼 무작위 회전하고 x 방향으로 무작위 반사하도록 지정합니다.

augmenter = imageDataAugmenter( ...
    'RandRotation',@()randi([0,1],1)*90, ...
    'RandXReflection',true);

업샘플링된 영상의 데이터저장소와 잔차 영상의 데이터저장소로부터 무작위 패치 추출을 수행하는 randomPatchExtractionDatastore를 만듭니다. 패치 추출은 하나의 큰 영상에서 작은 영상 패치들로 이루어진 대규모 세트를 추출합니다. 이러한 유형의 데이터 증대는 image-to-image 회귀 문제에서 자주 사용되는데, 아주 작은 크기의 입력 영상에 대해 여러 신경망 아키텍처를 훈련시킬 수 있습니다. 이는 원래의 훈련 세트에 들어있는 전체 크기의 영상 각각으로부터 많은 수의 패치를 추출할 수 있음을 의미하며, 이로 인해 훈련 세트의 크기가 대폭 늘어나게 됩니다.

patchSize = [41 41];
patchesPerImage = 64;
dsTrain = randomPatchExtractionDatastore(upsampledImages,residualImages,patchSize, ...
    "DataAugmentation",augmenter,"PatchesPerImage",patchesPerImage);

결과로 생성되는 데이터저장소 dsTrain은 Epoch가 반복될 때마다 신경망으로 데이터의 미니 배치를 제공합니다. 데이터저장소에서 읽어 들인 결과를 미리 봅니다.

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 계층 설정하기

이 예제에서는 Deep Learning Toolbox™에서 제공하는 41개의 개별 계층을 사용하여 VSDR 신경망을 정의합니다. 여기에는 다음이 포함됩니다.

  • imageInputLayer (Deep Learning Toolbox) - 영상 입력 계층

  • convolution2dLayer (Deep Learning Toolbox) - 컨벌루션 신경망의 2차원 컨벌루션 계층

  • reluLayer (Deep Learning Toolbox) - ReLU(Rectified Linear Unit) 계층

  • regressionLayer (Deep Learning Toolbox) - 신경망의 회귀 출력 계층

첫 번째 계층 imageInputLayer는 영상 패치에 대해 연산을 수행합니다. 패치 크기는 신경망 수용 영역을 기반으로 합니다. 신경망 수용 영역은 신경망의 최상단 계층의 응답에 영향을 주는 공간 영상 영역입니다. 이상적인 경우에 신경망 수용 영역은 크기가 영상 크기와 같으므로 필드에서 영상에 포함된 모든 하이 레벨 특징을 볼 수 있습니다. 이 경우 컨벌루션 계층이 D개인 신경망에 대해 수용 영역은 (2D+1)x(2D+1)입니다.

VDSR에는 20개의 컨벌루션 계층이 있으므로 수용 영역 및 영상 패치 크기는 41x41이 됩니다. VDSR은 휘도 채널만 사용하여 훈련되므로 영상 입력 계층은 채널이 1개인 영상을 받습니다.

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

영상 입력 계층 뒤에는 크기가 3x3인 필터를 64개 포함하는 2차원 컨벌루션 계층이 옵니다. 미니 배치 크기가 필터의 개수를 결정합니다. 각 컨벌루션 후에도 특징 맵의 크기가 입력값의 크기와 같은 상태로 유지되도록 각 컨벌루션 계층에 대한 입력값을 0으로 채웁니다. He의 방법 [3]은 뉴런 학습에 비대칭성이 존재하도록 가중치를 난수 값으로 초기화합니다. 각 컨벌루션 계층 뒤에는 신경망에 비선형성을 발생시키는 ReLU 계층이 옵니다.

convLayer = convolution2dLayer(3,64,'Padding',1, ...
    'WeightsInitializer','he','BiasInitializer','zeros','Name','Conv1');

ReLU 계층을 지정합니다.

relLayer = reluLayer('Name','ReLU1');

중간 계층에는 컨벌루션 계층과 ReLU 계층 18개가 번갈아 가며 포함되어 있습니다. 각 컨벌루션 계층은 크기가 3x3x64인 필터 64개를 포함하는데, 여기서 하나의 필터는 64개의 채널에서 3x3 공간 영역에 대해 연산을 수행합니다. 앞에서와 마찬가지로, 각 컨벌루션 계층 뒤에는 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

끝에서 두 번째 계층은 크기가 3x3x64인 필터를 한 개 가지는 컨벌루션 계층이며 영상을 복원합니다.

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(Stochastic Gradient Descent with Momentum: 모멘텀을 사용한 확률적 경사하강법)을 사용하여 신경망을 훈련시킵니다. trainingOptions (Deep Learning Toolbox) 함수를 사용하여 SGDM의 하이퍼파라미터 설정을 지정합니다. 학습률은 초기에 0.1로 설정되고, Epoch 10회가 지날 때마다 10배만큼 줄어듭니다. 훈련을 Epoch 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);

신경망 훈련시키기

훈련 옵션과 무작위 패치 추출 데이터저장소를 구성한 후에는 trainNetwork (Deep Learning Toolbox) 함수를 사용하여 VDSR 신경망을 훈련시킵니다. 신경망을 훈련시키려면 다음 코드의 doTraining 파라미터를 true로 설정하십시오. 훈련을 수행할 때는 CUDA 지원 NVIDIA™ GPU(Compute Capability 3.0 이상)를 사용하는 것이 권장됩니다.

다음 코드에서 doTraining 파라미터를 false로 유지하면 이 예제는 스케일링 인자 2, 3, 4에 대해 영상에 초해상도 기법을 적용하도록 사전 훈련된 VDSR 신경망을 반환합니다.

참고: 훈련은 NVIDIA™ Titan X에서 6시간 정도 걸리며, GPU 하드웨어에 따라 시간이 더 걸릴 수 있습니다.

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

VDSR 신경망을 사용하여 단일 영상 초고해상도 복원 수행하기

VDSR 신경망을 사용하여 단일 영상 초고해상도(SISR) 복원을 수행하려면 이 예제의 나머지 단계를 따르십시오. 이 예제의 나머지 부분에서는 다음을 수행하는 방법을 보여줍니다.

  • 고해상도 참조 영상에서 샘플 저해상도 영상 만들기.

  • 딥러닝에 의존하지 않는 기존의 영상 처리 솔루션인 쌍삼차 보간을 사용하여 저해상도 영상에서 SISR 복원.

  • VDSR 심층망을 사용하여 저해상도 영상에서 SISR 복원.

  • 쌍삼차 보간과 VDSR을 사용하여 복원된 고해상도 영상을 시각적으로 비교.

  • 초고해상도 복원 영상과 고해상도 참조 영상의 유사도를 수치화하여 해당 영상의 품질 평가.

샘플 저해상도 영상 만들기

딥러닝을 사용한 초고해상도 기법의 결과를 쌍삼차 보간과 같은 기존의 영상 처리 기법을 사용한 결과와 비교하는 데 사용될 저해상도 영상을 만듭니다. 테스트 데이터 세트 testImages는 Image Processing Toolbox™에서 제공하는 21개의 왜곡되지 않은 영상을 포함합니다. 영상을 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은 영상의 휘도 채널만 사용하여 훈련된다는 사실을 기억하십시오.

rgb2ycbcr 함수를 사용하여 저해상도 영상을 RGB 컬러스페이스에서 휘도(Iy) 채널과 색차(IcbIcr) 채널로 변환합니다.

Iycbcr = rgb2ycbcr(Ilowres);
Iy = Iycbcr(:,:,1);
Icb = Iycbcr(:,:,2);
Icr = Iycbcr(:,:,3);

쌍삼차 보간을 사용하여 휘도 채널과 두 색차 채널을 업스케일링합니다. 업샘플링된 색차 채널 Icb_bicubicIcr_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 (Deep Learning Toolbox)를 관찰합니다. 신경망의 출력값이 원하는 잔차 영상입니다.

Iresidual = activations(net,Iy_bicubic,41);
Iresidual = double(Iresidual);
imshow(Iresidual,[])
title('Residual Image from VDSR')

업스케일링된 휘도 성분에 잔차 영상을 더하여 고해상도 VDSR 휘도 성분을 얻습니다.

Isr = Iy_bicubic + Iresidual;

고해상도 VDSR 휘도 성분에 업스케일링된 색 성분을 결합합니다. ycbcr2rgb 함수를 사용하여 영상을 RGB 컬러스페이스로 변환합니다. 결과로 생성된 영상이 VDSR을 사용한 최종 고해상도 컬러 영상입니다.

Ivdsr = ycbcr2rgb(cat(3,Isr,Icb_bicubic,Icr_bicubic));
imshow(Ivdsr)
title('High-Resolution Image Obtained Using VDSR')

시각적 및 정량적 비교

고해상도 영상을 시각적으로 더 잘 이해하려면 각 영상 내부의 작은 영역을 살펴보십시오. 벡터 roi를 [x y 너비 높이] 형식으로 사용하여 관심 영역(ROI)을 지정합니다. 요소는 ROI의 왼쪽 위 코너 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은 참조 영상을 기준으로 영상의 3가지 특성인 휘도, 대비, 구조의 시각적 영향을 평가합니다. SSIM의 값이 1에 가까울수록 테스트 영상이 참조 영상에 더 잘 합치합니다. 이 메트릭에 대한 자세한 내용은 ssim 항목을 참조하십시오.

bicubicSSIM = ssim(Ibicubic,Ireference)
bicubicSSIM = 0.9861
vdsrSSIM = ssim(Ivdsr,Ireference)
vdsrSSIM = 0.9874

NIQE(Naturalness Image Quality Evaluator)를 사용하여 지각 영상 품질을 측정합니다. NIQE 점수가 낮을수록 더 나은 지각 품질을 나타냅니다. 이 메트릭에 대한 자세한 내용은 niqe 항목을 참조하십시오.

bicubicNIQE = niqe(Ibicubic)
bicubicNIQE = 5.1721
vdsrNIQE = niqe(Ivdsr)
vdsrNIQE = 4.7611

스케일링 인자 2, 3, 4인 경우에 대해 테스트 영상 전체 세트의 평균 PSNR 및 SSIM을 계산합니다. 문제를 단순화하기 위해 헬퍼 함수 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] Kim, J., J. K. Lee, and K. M. Lee. "Accurate Image Super-Resolution Using Very Deep Convolutional Networks." Proceedings of the IEEE® Conference on Computer Vision and Pattern Recognition. 2016, pp. 1646-1654.

[2] Grubinger, M., P. Clough, H. Müller, and T. Deselaers. "The IAPR TC-12 Benchmark: A New Evaluation Resource for Visual Information Systems." Proceedings of the OntoImage 2006 Language Resources For Content-Based Image Retrieval. Genoa, Italy. Vol. 5, May 2006, p. 10.

[3] He, K., X. Zhang, S. Ren, and J. Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." Proceedings of the IEEE International Conference on Computer Vision, 2015, pp. 1026-1034.

참고 항목

| | | | | (Deep Learning Toolbox) | (Deep Learning Toolbox)

관련 항목