主要内容

深層学習を使用した邮箱メ邮箱ジの高解像度化

この例では,很深的超分辨率(VDSR)ニューラルネットワークを使用して低解像度イメージから高解像度イメージを作成する方法を説明します。

超解像処理は低解像度openstackメopenstackジから高解像度openstackメopenstackジを作成するプロセスです。この例では,単一。目標は,1。SISRが難しいのは,一般的にはイメージの高周波数成分を低解像度イメージから回復することができないためです。高周波数情報なしでは、高解像度。さらに1つの低解像度イメージから複数の高解像度イメージの候補が生成される可能性があるため,SISRは不良設定問題です。

深層学習アルゴリズムを含め,いくいくsisrを実行するために提案されています。この例では,很深的超分辨率(VDSR)と呼ばれるSISRのための深層学習アルゴリズムを扱います[1]。

VDSRネットワク

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

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

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

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

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

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

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

20000年個の静止した自然イメージから成る,IAPR TC-12ベンチマークをダウンロードします[2]。このデタセットには,人物,動物,都市などの写真が含まれます。デ。学習デタセットをダウンロドしない場合,コマンドランで负载(“trainedVDSRNet.mat”);と入力して,事前学習済みのVDSRネットワクを読み込むことができます。その後,この例のVDSRネットワクを使用した単一ジ超解像処理の実行の節に直接進みます。

デタをダウンロドするために補助関数downloadIAPRTC12Dataを使用します。この関数は,この例にサポルとして添付されています。dataDirをデタの目的の場所として指定します。

dataDir =tempdir;downloadIAPRTC12Data (dataDir);

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

trainImagesDir = fullfile(dataDir,“iaprtc12”“图片”“2”);extts = [“jpg”“bmp格式”“使用”];pristineImages = imageDatastore(trainImagesDir,FileExtensions=ext);

学習邮箱メ邮箱ジの数を表示します。

元素个数(pristineImages.Files)
Ans = 616

学習デタの準備

学習データセットを作成するには,アップサンプリングされたイメージと対応する残差イメージで構成されるイメージのペアを生成します。

アップサンプリングされたメジは,ディレクトリupsampledDirNameのmatファ。ネットワク応答を表す計算された残差residualDirNameのmatファ。ネットワクの学習時に精度を向上させるため、MAT ファイルはデータ型として格納されます。

upsampledDirName = trainImagesDir+filesep+“upsampledImages”;residualDirName = trainImagesDir+filesep+“residualImages”

補助関数createVDSRTrainingSetを使用して学習デタを前処理します。この関数は,この例にサポルとして添付されています。

この補助関数は,trainImagesの初期状態の各邮箱メ邮箱ジに対して以下の操作を実行します。

  • econメメジをYCbCr色空間に変換します。

  • 輝度(Y)チャネルを異なる倍率で縮小することによってサンプルの低解像度イメージを作成してから,双三次内挿を使用してイメージのサイズを元のサイズに変更します。

  • 初期状態のopenstackメopenstackジとサopenstackズ変更されたopenstackメopenstackジの差を計算します。

  • サopenstackズ変更されたopenstackメopenstackメ。

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

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

アップサンプリングされたイメージのデータストアと残差イメージのデータストアからのランダム化されたパッチ抽出を実行するrandomPatchExtractionDatastore(图像处理工具箱)を作成します。パッチ抽出は,小さなイメージパッチ,すなわちタイルを,より大きな1つのイメージから抽出するプロセスです。このタイプのデータ拡張は,非常に小さなサイズの入力イメージで多くのネットワークアーキテクチャに学習させることができるimage-to-image回帰問題でよく使用されます。これは,元の学習セットに含まれるフルサイズの各イメージから多くのパッチを抽出することができ,学習セットのサイズが大幅に大きくなることを意味します。

patchSize = [41 41];patchesPerImage = 64;dsTrain = randomPatchExtractionDatastore(upsampledImages,residualImages,patchSize,...DataAugmentation =增压器,PatchesPerImage = PatchesPerImage);

結果のデタストアdsTrainでは,デ,タのミニバッチが,エポックの各反復でネットワ,クに渡されます。デタストアからの読み取りの結果をプレビュします。

inputBatch =预览(dsTrain);disp (inputBatch)
InputImage ResponseImage  ______________ ______________ { 41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}{41×41双}

VDSR層のセットアップ

この例では,以下を含む深度学习工具箱™の41の個別の層を使用してVDSRネットワークを定義します。

第 1 層imageInputLayerは邮箱メ邮箱ジパッチに対して作用します。パッチサイズは,ネットワークの最上位層の応答に影響する空間イメージ領域であるネットワーク受容野に基づきます。ネットワーク受容野がイメージ内の高レベルの特徴をすべて確認できるように,受容野のサイズはイメージのサイズと同じであるのが理想的です。この場合,畳み込み層DをもD+1) 行 (2D+1)列です。

VDSRには20個の畳み込み層があるため,受容野とイメージパッチのサイズは41行41列です。econeconメジ入力層は,1チャネルのeconeconメ。VDSRが輝度チャネルだけを使用して学習しているからです。

网络深度= 20;firstLayer = imageInputLayer([41 41 1],Name=“InputLayer”归一化=“没有”);

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

convLayer = convolution2dLayer(3,64,Padding=1,...WeightsInitializer =“他”BiasInitializer =“零”、名称=“Conv1”);

ReLU層を指定します。

relLayer = reluLayer(Name= . reluLayer“ReLU1”);

中間層は18個あり,畳み込み層と正規化線形ユニット層が交互に配置されています。各畳み込み層はサ管理员ズ3 × 3 × 64の64個のフィルタ管理员を含みます。1つのフィルターは 64 チャネルにわたって 3 行 3 列の空間領域に作用します。前述のとおり、ReLU 層はすべての畳み込み層に続きます。

middleayers = [convLayer relLayer];layerNumber = 2:networkDepth-1 convLayer = convolution2dLayer(3,64,Padding=[1 1],...WeightsInitializer =“他”BiasInitializer =“零”...Name =“Conv”+ num2str (layerNumber));relLayer = reluLayer(Name= . reluLayer“ReLU”+ num2str (layerNumber));middleelayers = [middleelayers convLayer relLayer];结束

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

convLayer = convolution2dLayer(3,1,Padding=[1 1],...WeightsInitializer =“他”BiasInitializer =“零”...NumChannels = 64,名字=“Conv”+ num2str (networkDepth));

最後の層はReLU層ではなく回帰層です。回帰層は,残差。

finalLayers = [convLayer regressionLayer(Name=“FinalRegressionLayer”));

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

layers = [firstLayer middleelayers finalLayers];

学習オプションの指定

モメンタム項付き確率的勾配降下(sgdm)最適化を使用してネットワクに学習させます。関数trainingOptionsを使用してSGDM用ハ。最初の学習率は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(“个”...动量= 0.9,...InitialLearnRate = initLearningRate,...LearnRateSchedule =“分段”...LearnRateDropPeriod = 10,...LearnRateDropFactor = learningRateFactor,...L2Regularization = l2reg,...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...GradientThresholdMethod =“l2norm”...GradientThreshold = 0.01,...情节=“训练进步”...Verbose = false);

ネットワクの学習

この例では既定で,超解像処理イメージを倍率2、3,および4で学習させた,事前学習済みバージョンのVDSRネットワークを読み込みます。この事前学習済みのネットワークを使用することで,学習の完了を待たずに,テストイメージの超解像処理を実行できます。

VDSRネットワクに学習させるには,以下のコドで変数doTraining真正的に設定します。関数trainNetworkを使用してネットワクを学習させます。

Gpuが利用できる場合,Gpuで学習を行います。GPUを使用するには,并行计算工具箱™,およびCUDA®対応のNVIDIA GPU®が必要です。詳細にいては,Gpu計算の要件(并行计算工具箱)を参照してください。学習にはNVIDIA Titan Xで約6時間を要します。

doTraining =如果doTraining net = trainNetwork(dsTrain,layers,options);modelDateTime = string(datetime)“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedVDSR——”+ modelDateTime +“.mat”“净”);其他的负载(“trainedVDSRNet.mat”);结束

VDSRネットワクを使用した単一ジ超解像処理の実行

VDSRネットワークを使用して単一イメージ超解像処理(SISR)を実行するには,この例の残りの手順に従って以下を行います。

  • 高解像度の参照openstackメopenstackジからサンプルの低解像度openstackメopenstackジを作成します。

  • 深層学習に依存しない従来型のイメージ処理ソリューションである双三次内挿を使用したSISRを,低解像度イメージで実行します。

  • VDSRニュラルネットワクを使用した,低解像度。

  • 双三次内挿とVDSRを使用して再構成した高解像度。

  • 超解像処理イメージと高解像度の参照イメージとの類似度を定量化することで,このイメージの画質を評価します。

低解像度サンプル邮箱メ邮箱ジの作成

テストデタセットtestImagesには、图像处理工具箱™に付属する20個の歪みのないイメージが含まれています。帐号メ帐号ジをimageDatastoreに読み込み,その。

fileNames = [“sherlock.jpg”“peacock.jpg”“fabric.png”“greens.jpg”...“hands1.jpg”“kobi.png”“lighthouse.png”“office_4.jpg”...“onion.png”“pears.png”“yellowlily.jpg”“indiancorn.jpg”...“flamingos.jpg”“sevilla.jpg”“llama.jpg”“parkavenue.jpg”...“strawberries.jpg”“trailer.jpg”“wagon.jpg”“football.jpg”];filePath = fullfile(matlabroot,“工具箱”“图片”“imdata”) + filesep;filePathNames = strcat(filePath, filename);testImages = imageDatastore(filePathNames);

テスト邮箱メ邮箱ジをモンタ邮箱ジュとして表示します。

蒙太奇(testImages)

いずれかのテストメジを選択して,超解像ネットワクのテストに使用します。

testImage =“sherlock.jpg”;Ireference = imread(testImage);Ireference = im2double(Ireference);imshow (Ireference)标题(“高分辨率参考图像”

imresizeを0.25の倍率で使用して,高解像度参照。ダウンスケリング中にジの高周波数成分は失われます。

scaleFactor = 0.25;Ilowres = imresize(Ireference,scaleFactor,“双三次的”);imshow (Ilowres)标题(“低分辨率图像”

双三次内挿を使用した邮箱メ邮箱ジ解像度の向上

深層学習を使用しない場合,メ,メ,双三次内挿を使うことです。結果の高解像度イメージが参照イメージと同じサイズになるように,双三次内挿を使用して低解像度イメージをアップスケーリングします。

[nrows,ncols,np] = size(Ireference);Ibicubic = imresize(Ilowres,[nrows ncols],“双三次的”);imshow (Ibicubic)标题(用双三次插值法获得高分辨率图像

事前学習済みのVDSRネットワ

VDSRはメジの輝度チャネルだけを使用して学習させることに注意してください。人間の知覚は色の変化よりも明度の変化に敏感であるからです。

関数rgb2ycbcr(图像处理工具箱)を使用して,低解像度邮箱メ,ジをRGB色空間から輝度(Iy)および色差(银行独立委员会只有几チャネルに変換します。

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

双三次内挿を使用して,輝度と2の色差チャネルをアップスケリングします。アップサンプリングされた色差チャネルIcb_bicubicIcr_bicubicでは,それ以上の処理は必要ありません。

Iy_bicubic = imresize(Iy,[nrows ncols],“双三次的”);Icb_bicubic = imresize(Icb,[nrows ncols],“双三次的”);Icr_bicubic = imresize(Icr,[nrows ncols],“双三次的”);

アップスケリングした輝度コンポネントIy_bicubicを事前学習済みのVDSRネットワクを通じて渡します。最終層(回帰層)から激活を観測します。ネットワクの出力は目的の残差ジです。

Iresidual = activation (net,Iy_bicubic,41);Iresidual = double(Iresidual);imshow (Iresidual[])标题(VDSR残留图像

残差イメージをアップスケーリングされた輝度コンポーネントに加えて,高解像度のVDSR輝度コンポーネントを取得します。

Isr = Iy_bicubic + Iresidual;

高解像度のVDSR輝度成分をアップスケリングした色成分と連結します。関数ycbcr2rgb(图像处理工具箱)を使用して、メ、ジをRGB色空間に変換します。結果は,vdsrを使用した最終の高解像度カラ。

Ivdsr = ycbcr2rgb(cat(3,Isr,Icb_bicubic,Icr_bicubic));imshow (Ivdsr)标题(使用VDSR获得的高分辨率图像

視覚的な比較と定量的比較

高解像度openstackメopenstackジを視覚的によく把握するために,それぞれのopenstackメopenstackジ内の小領域を調べます。関心領域(roi)をベクトルroiを使って[xy宽度高度の形式で指定します。各要素は,ROIの左上隅のxとy座標,幅と高さで定義されます。

ROI = [360 50 400 350];

高解像度econfメジをこのROIにトリミングして,結果をモンタ。VDSRイメージは,双三次内挿を使用して作成された高解像度イメージと比べ,細部がより鮮明で,鋭いエッジがあります。

蒙太奇({imcrop (Ibicubic roi), imcrop (Ivdsr roi)})标题(使用双三次插值(左)和VDSR(右)的高分辨率结果);

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

参照。PSNRの値が大きいほど,一般には画質が高いことを示します。このメトリクスの詳細にいては,psnr值(图像处理工具箱)を参照してください。

bicubicPSNR = psnr(Ibicubic,Ireference)
bicbicpsnr = 38.4747
vdsrPSNR = psnr(Ivdsr,Ireference)
vdsrPSNR = 39.2346

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

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

自然图像质量评估者(NIQE)を使用して,知覚的画質を測定します。Niqeスコアが小さいほど知覚的画質が良好なことを示します。このメトリクスの詳細にいては,niqe(图像处理工具箱)を参照してください。

bicubicNIQE = niqe(Ibicubic)
bicbicniqe = 5.1721
vdsrNIQE = niqe(Ivdsr)
vdsrNIQE = 4.7612

テストイメージのセット全体に対して,倍率2、3および4で平均PSNRおよびSSIMを計算します。簡単にするために,補助関数vdsrMetricsを使用して平均メトリクスを計算できます。この関数は,この例にサポルとして添付されています。

scaleFactors = [2 3 4];vdsrMetrics(净testImages scaleFactors);
结果比例因子2双三次的平均PSNR值= 31.467070平均PSNR VDSR = 31.481973平均SSIM双三次的= 0.935820平均SSIM VDSR = 0.947057结果比例因子3双三次的平均PSNR值= 28.107057平均PSNR VDSR = 28.430546平均SSIM双三次的= 0.883927平均SSIM VDSR = 0.894634结果比例因子4双三次的平均PSNR值= 27.066129平均PSNR VDSR = 27.846590平均SSIM双三次的= 0.863270平均SSIM VDSR = 0.878101

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

参考文献

[1]金,J., J. K.李,K. M.李。“使用非常深度卷积网络的精确图像超分辨率。”IEEE学报®计算机视觉与模式识别会议.2016年,第1646-1654页。

[2]格鲁宾格,M., P.克拉夫,H. Müller,和T.德塞勒。IAPR TC-12基准:视觉信息系统的新评估资源。OntoImage 2006基于内容的图像检索语言资源.意大利热那亚。第五卷,2006年5月,第10页。

[3]何凯,张旭,任硕,孙杰。深入研究整流器:在ImageNet分类上超越人类水平的性能。IEEE计算机视觉国际会议论文集, 2015, pp. 1026-1034。

参考

||||||

関連するトピック