ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

深層学習を使用した単一イメージ超解像処理

この例では Very-Deep Super-Resolution (VDSR) ニューラル ネットワークに学習させる方法、VDSR ネットワークを使用し、単一の低解像度イメージから高解像度イメージを推定する方法を示します。

この例では、VSDR ネットワークに学習させる方法を説明し、事前学習済みの VDSR ネットワークも示します。VDSR ネットワークの学習を選択した場合、Compute Capability 3.0 以上の CUDA 対応 NVIDIA™ GPU を使用します。GPU を使用するには Parallel Computing Toolbox™ が必要です。

学習データ セットをダウンロードしない、またはネットワークに学習させない場合、コマンド ラインで load('trainedVDSR-Epoch-100-ScaleFactors-234.mat'); を入力して、事前学習済みの VDSR ネットワークを読み込むことができます。それから、この例の「VDSR ネットワークを使用した単一イメージ超解像処理の実行」セクションに進みます。

はじめに

超解像処理は低解像度イメージから高解像度イメージを作成するプロセスです。この例では、Single Image Super-Resolution (SISR) について考えます。目標は、1 つの低解像度イメージから 1 つの高解像度イメージを復元することです。SISR が難しいのは、一般的にはイメージの高周波数成分を低解像度イメージから回復することができないためです。高周波数情報なしでは、高解像度イメージの画質には限界があります。さらに、1 つの低解像度イメージから複数の高解像度イメージの候補が生成される可能性があるため、SISR は不良設定問題です。

深層学習アルゴリズムを含め、いくつかの手法が SISR を実行するために提案されています。この例では、Very-Deep Super-Resolution (VDSR) と呼ばれる SISR のための深層学習アルゴリズムを扱います [1]。

VDSR ネットワーク

VDSR は単一イメージ超解像処理を実行するために設計された、畳み込みニューラル ネットワーク アーキテクチャです [1]。VDSR ネットワークは低解像度イメージと高解像度イメージとのマッピングを学習します。低解像度イメージと高解像度イメージは類似したイメージの内容をもち、異なるのは主に細かい高周波数成分であるため、このマッピングは可能です。

VDSR は残差学習法を使用しています。これはネットワークに残差イメージを推定するように学習させるものです。超解像処理のコンテキストでは、残差イメージは高解像度の参照イメージと参照イメージのサイズに一致するように双三次内挿を使用してアップスケーリングされた低解像度イメージとの差分です。残差イメージには、イメージの詳細な高周波数成分に関する情報が含まれます。

VDSR ネットワークは、カラー イメージの輝度から残差イメージを検出します。イメージの輝度チャネル Y は、各ピクセルの明るさを赤、緑および青ピクセル値の線形結合で表したものです。一方、イメージの 2 つの色差チャネル Cb および Cr は、赤、緑および青ピクセル値の異なる線形結合で、色差情報を表します。VDSR は輝度チャネルだけを使用して学習します。人間の知覚は色の変化よりも明るさの変化に敏感であるからです。

Yhighres が高解像度イメージの輝度で、Ylowres が双三次内挿を使用してアップスケーリングされた低解像度イメージの輝度である場合、VDSR ネットワークへの入力は Ylowres で、ネットワークは学習データから Yresidual=Yhighres-Ylowres を予測するために学習します。

VDSR ネットワークに残差イメージを推定するように学習させた後、推定した残差イメージをアップサンプリングした低解像度イメージに追加し、イメージを RGB 色空間に変換し直すことによって、高解像度イメージを再構築できます。

倍率は、参照イメージのサイズの低解像度イメージのサイズに対するものです。低解像度イメージでは、イメージの高周波数成分に関する情報が特に失われるため、倍率が高くなるほど SISR はさらに不良設定になります。VDSR は大規模受容野を使用して、この問題を解決します。この例では、複数の倍率でのスケーリングによる拡張を使用して、VDSR ネットワークを学習させます。スケーリングによる拡張では、低倍率のイメージ コンテキストをネットワークが活用できるため、高倍率での結果が改善されます。さらに、VDSR ネットワークは相対倍率のイメージを受け入れることで一般化できます。

学習データとテスト データのダウンロード

20,000 個の静止した自然イメージから成る、IAPR TC-12 ベンチマークをダウンロードします [2]。このデータ セットには、人物、動物、都市などの写真が含まれます。データをダウンロードするために補助関数 downloadIAPRTC12Data が使用できます。データ ファイルのサイズは~1.8 GB です。

imagesDir = tempdir;
url = 'http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz';
downloadIAPRTC12Data(url,imagesDir);
Downloading IAPR TC-12 dataset...
This will take several minutes to download and unzip...
done.

この例ではネットワークを IAPR TC-12 ベンチマーク データの小さなサブセットで学習させます。imageCLEF 学習データを読み込みます。すべてのイメージは 32 ビット JPEG カラー イメージです。

trainImagesDir = fullfile(imagesDir,'iaprtc12','images','02');
exts = {'.jpg','.bmp','.png'};
trainImages = imageDatastore(trainImagesDir,'FileExtensions',exts);

学習イメージの数を表示します。

numel(trainImages.Files)
ans = 616

学習データの準備

学習データセットを作成するには、補助関数 createVDSRTrainingSet を使用してイメージを前処理します。この関数は、この例にサポート ファイルとして添付されています。

この補助関数は、イメージの YCbCr 色空間への変換、双三次内挿を使用した異なる倍率での輝度 (Y) チャネルのサイズ変更、初期状態のイメージとサイズ変更されたイメージの差の計算を行って、イメージを前処理します。処理された入力イメージは、ディレクトリ upsampledDirName の .mat ファイルとしてディスクに格納されます。計算された残差イメージは、ディレクトリ residualDirName の .mat ファイルとしてディスクに格納されます。ネットワークの学習時に精度を向上させるため、.mat ファイルはデータ型 double として格納されます。

scaleFactors = [2 3 4];
[upsampledDirName,residualDirName] = createVDSRTrainingSet(trainImages,scaleFactors);

学習セット用の前処理パイプラインの定義

データストアの組み合わせを使用して、ネットワークに学習データを供給します。このデータストアは、ネットワーク入力と目的のネットワーク応答が含まれる 2 つのイメージ データストアから、対応するランダムなパッチを抽出します。

この例では、ネットワーク入力は、双三次内挿を使用してアップスケーリングされた低解像度イメージです。目的のネットワーク応答は、残差イメージです。入力イメージ ファイルのコレクションから upsampledImages というイメージ データストアを作成します。計算された残差イメージ ファイルのコレクションから residualImages というイメージ データストアを作成します。いずれのデータストアでも、イメージ ファイルからイメージ データを読み取るには補助関数 matRead が必要です。この関数は、この例にサポート ファイルとして添付されています。

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

関数 combine を使用して、アップサンプリングされたイメージと残差イメージの関連付けられたペアを含む 1 つのデータストアを作成します。

dsTrain = combine(upsampledImages,residualImages);

データ拡張のパラメーターを指定する imageDataAugmenter を作成します。学習中にデータ拡張を使用して学習データを変化させることによって、使用可能な学習データの量が効果的に増加します。ここで、拡張により、90 度のランダムな回転、および x 方向のランダムな鏡映を指定します。

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

関数 transform を使用して、imageDataAugmenter で定義されたランダムな拡張を学習セットに適用します。関数 augment は、関連付けられたイメージの cell 配列を受け入れ、image-to-image 回帰問題で必要とされる方法と同じ方法で各イメージを拡張します。

dsTrain = transform(dsTrain,@(imagePair) augment(augmenter,imagePair));

前処理パイプラインの最後の手順として、関数 transform を使用してランダム化されたパッチ抽出を実行します。パッチ抽出は、小さなイメージ パッチ、すなわちタイルを、より大きな 1 つのイメージから抽出するプロセスです。このタイプのデータ拡張は、非常に小さなサイズの入力イメージで多くのネットワーク アーキテクチャに学習させることができる image-to-image 回帰問題でよく使用されます。これは、元の学習セットに含まれるフルサイズの各イメージから多くのパッチを抽出することができ、学習セットのサイズが大幅に大きくなることを意味します。

この例では、関数 extractImagePatches でパッチ抽出演算を定義します。この関数は、この例の終わりに含まれています。

patchSize = [41 41];
patchesPerImage = 64;
dsTrain = transform(dsTrain,@(imagePair) extractImagePatches(imagePair,patchesPerImage,patchSize));

結果のデータストア dsTrain では、データのミニバッチが、エポックの各反復でネットワークに渡されます。データを調査するためにデータストアでプレビュー操作を実行します。

inputBatch = preview(dsTrain);
disp(inputBatch)
    [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 の個別の層を使用して VDSR ネットワークを定義します。

第 1 層 imageInputLayer はイメージ パッチに対して作用します。パッチ サイズは、ネットワークの最上位層の応答に影響する空間イメージ領域であるネットワーク受容野に基づきます。理想的には、ネットワーク受容野は、イメージにある高レベルの特徴をすべて確認できるようにイメージ サイズと同じにします。この場合、ネットワークの深さ D に対して、受容野は (2D+1) 行 (2D+1) 列です。VDSR は 20 層ネットワークであるため、受容野とイメージ パッチのサイズは 41 行 41 列です。イメージ入力層は、1 チャネルのイメージを受け入れます。VDSR が輝度チャネルだけを使用して学習しているからです。

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

イメージ入力層に続いて、サイズが 3 行 3 列の 64 個のフィルターがある 2 次元畳み込み層があります。ミニバッチのサイズによりフィルター数が決まります。それぞれの畳み込みの後で、特徴マップのサイズが入力サイズと同じになるように、各畳み込み層の入力をゼロ パディングします。He の手法 [3] は、ニューロン学習が非対称になるようにランダムな値に重みを初期化します。各畳み込み層の後に、ネットワークに非線形性をもたらす ReLU 層が続きます。

convolutionLayer = convolution2dLayer(3,64,'Padding',1, ...
    'Name','Conv1');
convolutionLayer.Weights = sqrt(2/(9*64))*randn(3,3,1,64);
convolutionLayer.Bias = zeros(1,1,64);

ReLU 層を指定します。

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

中間層は 18 個あり、畳み込み層と正規化線形ユニット層が交互に配置されています。各畳み込み層はサイズ 3 x 3 x 64 の 64 個のフィルターを含みます。1 つのフィルターは 64 チャネルにわたって 3 行 3 列の空間領域に作用します。He の手法 [3] は、ランダムな値に重みを初期化します。前述のとおり、ReLU 層はすべての畳み込み層に続きます。

middleLayers = [convolutionLayer relLayer];
for layerNumber = 2:networkDepth-1
    conv2dLayer = convolution2dLayer(3,64, ...
        'Padding',[1 1], ...
        'Name',['Conv' num2str(layerNumber)]);
    
    % He initialization
    conv2dLayer.Weights = sqrt(2/(9*64))*randn(3,3,64,64);
    conv2dLayer.Bias = zeros(1,1,64);
    
    relLayer = reluLayer('Name',['ReLU' num2str(layerNumber)]);
    middleLayers = [middleLayers conv2dLayer relLayer];    
end

最後から 2 番目の層は、イメージを再構成するサイズ 3 x 3 x 64 の単一のフィルターを備えた、畳み込み層です。

conv2dLayer = convolution2dLayer(3,1,...
    'NumChannels',64,...
    'Padding',[1 1],...
    'Name',['Conv' num2str(networkDepth)]);
conv2dLayer.Weights = sqrt(2/(9*64))*randn(3,3,64,1);
conv2dLayer.Bias = zeros(1,1,1);

最後の層は ReLU 層ではなく回帰層です。回帰層は、残差イメージとネットワーク予測との平均二乗誤差を計算します。

finalLayers = [conv2dLayer regressionLayer('Name','FinalRegressionLayer')];

すべての層を連結して VDSR ネットワークを構築します。

layers = [firstLayer middleLayers finalLayers];

あるいは、この補助関数を使用して VDSR 層を作成します。

layers = vdsrLayers();

学習オプションの指定

モーメンタム項付き確率的勾配降下 (SGDM) 最適化を使用してネットワークに学習させます。関数 trainingOptions を使用して SDGM 用ハイパーパラメーター設定を指定します。学習率は 0.1 に初期設定し、20 エポックごとに 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', ...
    'Plots','training-progress', ...
    'GradientThreshold',0.01);

ネットワークの学習

学習オプションとランダム パッチ抽出データストアを構成した後、関数 trainNetwork を使用して VDSR ネットワークに学習させます。ネットワークを学習させるには、以下のコードで doTraining パラメーターを true に設定します。学習には、Compute Capability 3.0 以上の CUDA 対応 NVIDIA™ GPU を使用してください。

次のコードで 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 ネットワークを使用して Single Image Super-Resolution (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)

イメージを 1 つ選択して、超解像処理用の参照イメージとして使用します。参照イメージとして独自の高解像度イメージを使用することもできます。

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

双三次内挿を使用して、輝度と 2 つの色差チャネルをアップスケーリングします。アップサンプリングされた色差チャネル 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 を観測します。ネットワークの出力は目的の残差イメージです。

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) をベクトル roi を使って [x y width height] の形式で指定します。各要素は、ROI の左上隅の x と y 座標、幅と高さで定義されます。

roi = [320 30 480 400];

高解像度イメージをこの ROI にトリミングして、結果をモンタージュとして表示します。

montage({imcrop(Ibicubic,roi),imcrop(Ivdsr,roi)})
title('High-Resolution Results Using Bicubic Interpolation (Left) vs. VDSR (Right)');

VDSR イメージは細部がより鮮明で、鋭いエッジがあります。

画質メトリクスを使用して、双三次内挿による高解像度イメージと VDSR イメージを定量的に比較します。参照イメージは元の高解像度イメージ Ireference で、サンプルの低解像度イメージを作成する前のものです。

参照イメージに対する各イメージのピーク S/N 比 (PSNR) を測定します。PNSR の値が大きいほど、一般には画質が高いことを示します。このメトリクスについての詳細は、psnrを参照してください。

bicubicPSNR = psnr(Ibicubic,Ireference)
bicubicPSNR = 38.4747
vdsrPSNR = psnr(Ivdsr,Ireference)
vdsrPSNR = 39.2491

各イメージの構造的類似性 (SSIM) 指数を測定します。SSIM は参照イメージに対してイメージの 3 つの特性である輝度、コントラスト、構造の視覚的影響を評価します。SSIM 値が 1 に近いほど、テスト イメージは参照イメージに近づきます。このメトリクスについての詳細は、ssimを参照してください。

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

Naturalness Image Quality Evaluator (NIQE) を使用して、知覚的画質を測定します。NIQE スコアが小さいほど知覚的画質が良好なことを示します。このメトリクスについての詳細は、niqeを参照してください。

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

テスト イメージのセット全体に対して、倍率 2、3 および 4 で平均 PSNR および SSIM を計算します。これらは randomPatchExtractionDatastore を定義するために使用された倍率と同じ値です。単純化のために、平均メトリクスを算出するために補助関数 superResolutionMetrics が使用できます。

superResolutionMetrics(net,testImages,scaleFactors);
Results for Scale factor 2

Average PSNR for Bicubic = 31.809683
Average PSNR for VDSR = 31.926088
Average SSIM for Bicubic = 0.938194
Average SSIM for VDSR = 0.949278

Results for Scale factor 3

Average PSNR for Bicubic = 28.170441
Average PSNR for VDSR = 28.515179
Average SSIM for Bicubic = 0.884381
Average SSIM for VDSR = 0.895356

Results for Scale factor 4

Average PSNR for Bicubic = 27.010839
Average PSNR for VDSR = 27.849618
Average SSIM for Bicubic = 0.861604
Average SSIM for VDSR = 0.877360

双三次内挿と比較すると、各倍率で VDSR のほうが良いメトリクス スコアを示しています。

まとめ

この例では、複数の倍率で VDSR ネットワークを作成し学習させ、さらにこのネットワークを使用して、超解像処理を通じてイメージ解像度を向上する方法を説明しました。ネットワークに学習させる手順は次のとおりです。

  • 学習データをダウンロードします。

  • 学習データをネットワークに供給する RandomPatchExtractionDatastore を定義します。

  • VDSR ネットワークの各層を定義します。

  • 学習オプションを指定します。

  • 関数 trainNetwork を使用してネットワークを学習させます。

VDSR ネットワークの学習後、または事前学習済みの VDSR ネットワークの読み込み後、この例は低解像度イメージで超解像処理を実行します。この例では、深層学習を使用しない双三次内挿を使用した超解像処理と VDSR の結果を比較しています。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.

サポート関数

function pairedPatchesOut = extractImagePatches(imagePair,patchesPerImage,patchSize)

pairedPatchesOut = cell(patchesPerImage,2);
for idx = 1:patchesPerImage
    inputImage = imagePair{1};
    responseImage = imagePair{2};
    imgSize = size(inputImage);
    
    % Obtain randomized indices in the input/response images that define
    % the cropping rectangle
    rowMin = randi(imgSize(1)-patchSize(1)+1);
    colMin = randi(imgSize(2)-patchSize(2)+1);
    rowIdx = rowMin:(rowMin+patchSize(1)-1);
    colIdx = colMin:(colMin+patchSize(2)-1);
    
    % Extract patch from same location in input and response image
    pairedPatchesOut{idx,1} = inputImage(rowIdx,colIdx);
    pairedPatchesOut{idx,2} = responseImage(rowIdx,colIdx); 
end

end

参考

| | | | | |

関連するトピック