主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

image-to-image回帰用のデータストアの準備

この例では,ImageDatastoreの関数变换および结合を使用してimage-to-image回帰ネットワークの学習用のデータストアを準備する方法を説明します。

この例では,ノイズ除去ネットワークの学習に適したパイプラインを使用してデータの前処理を行う方法を説明します。その後,前処理したノイズデータを使用して,シンプルな畳み込み自己符号化器ネットワークにイメージノイズを削除することを学習させます。

前処理パイプラインを使用したデータの準備

この例では,入力イメージの各ピクセルが0または1(それぞれ黒および白)に設定されているごま塩ノイズモデルを使用します。ノイズを含むイメージはネットワーク入力となります。初期状態のイメージは予測されるネットワーク応答となります。ネットワークはごま塩ノイズを検出して削除することを学習します。

数字のデータセット内の初期状態のイメージをimageDatastoreとして読み込みます。データストアには,0 ~ 9の数字から成る10000個の合成イメージが格納されています。イメージは,さまざまなフォントを使用して作成された数字のイメージにランダム変換を適用して生成されたものです。数字のイメージはそれぞれ28 x 28ピクセルです。データストアには,カテゴリごとに同じ数のイメージが含まれます。

digitDatasetPath = fullfile (matlabroot,“工具箱”“nnet”...“nndemos”“nndatasets”“DigitDataset”);imd = imageDatastore (digitDatasetPath,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

大きい読み込みサイズを指定して,ファイルI / Oのコストを最小化します。

洛桑国际管理发展学院。ReadSize = 500;

グローバル乱数発生器のシードを設定して,結果の再現性を高めます。

rng (0)

学習前に関数洗牌を使用して数字データをシャッフルします。

imd = shuffle (imd);

関数splitEachLabelを使用して,洛桑国际管理发展学院を学習,検証,およびテスト用の初期状態のイメージが含まれる3つのイメージデータストアに分割します。

[imdsTrain, imdsVal imdsTest] = splitEachLabel (imd, 0.95, 0.025);

関数变换を使用して,ネットワーク入力として使用する,各入力イメージのノイズを含むバージョンを作成します。関数变换は,基になるデータストアからデータを読み取り,補助関数addNoise(この例の最後に定義)に定義されている演算を使用してデータを処理します。関数变换の出力はTransformedDatastoreです。

dsTrainNoisy =变换(imdsTrain @addNoise);dsValNoisy =变换(imdsVal @addNoise);dsTestNoisy =变换(imdsTest @addNoise);

関数结合を使用して,ノイズを含むイメージと初期状態のイメージを組み合わせてtrainNetworkにデータを供給する単一のデータストアにします。このデータストアの組み合わせは,データのバッチをtrainNetworkで期待される2列の细胞配列に読み取ります。関数结合の出力はCombinedDatastoreです。

dsTrain =结合(dsTrainNoisy imdsTrain);dsVal =结合(dsValNoisy imdsVal);dst =结合(dsTestNoisy imdsTest);

関数变换を使用して,入力データストアと応答データストアの両方に共通する追加の前処理演算を実行します。補助関数commonPreprocessing(この例の最後に定義)は,ネットワークの入力サイズに一致するように入力イメージと応答イメージのサイズを32行32列ピクセルに変更し,各イメージのデータを[0,1]の範囲に正規化します。

dsTrain =变换(dsTrain @commonPreprocessing);dsVal =变换(dsVal @commonPreprocessing);dst =变换(dst, @commonPreprocessing);

最後に,関数变换を使用してランダム化された拡張を学習セットに追加します。補助関数augmentImages(この例の最後に定義)は,ランダムな90度の回転をデータに適用します。ネットワーク入力とそれに対応する予測される応答に同一の回転が適用されます。

dsTrain =变换(dsTrain @augmentImages);

拡張は過適合を抑え,学習済みネットワークに存在する回転のロバスト性を高めます。検証データセットまたはテストデータセットにはランダム化された拡張は不要です。

前処理したデータのプレビュー

学習データの準備に必要な前処理演算はいくつかあるため,学習前に前処理したデータをプレビューして正しいことを確認します。関数预览を使用してデータをプレビューします。

関数蒙太奇(图像处理工具箱)を使用して,ノイズを含むイメージと初期状態のイメージのペアの例を可視化します。学習データは正しいようです。左列の入力イメージにはごま塩ノイズが見られます。ノイズが追加されている点を除き,入力イメージと応答イメージは同じです。入力イメージと応答イメージにはランダムな90度の回転が同じ方法で適用されています。

exampleData =预览(dsTrain);输入= exampleData (: 1);反应= exampleData (:, 2);minibatch =猫(2输入反应);蒙太奇(minibatch ',“大小”, 2[8])标题(“输入(左)和回应(右)”

畳み込み自己符号化器ネットワークの定義

畳み込み自己符号化器は,イメージのノイズ除去を行うための一般的なアーキテクチャです。畳み込み自己符号化器は,符号化器と復号化器という2つの段階で構成されます。符号化器は,元の入力イメージを圧縮して潜在表現にします。この潜在表現では,元の入力イメージより幅と高さが小さくなっている一方で,空間位置あたりの特徴マップ数が多いという点で深度が大きくなっています。圧縮された潜在表現は,元のイメージの高周波数の特徴を復元する際に空間分解能がいくらか低下しますが,元のイメージの符号化でノイズアーティファクトを含めないように学習しています。復号化器は,符号化された信号を繰り返しアップサンプリングして,元の幅、高さ,チャネル数に戻します。符号化器はノイズを除去するため,復号化された最終的なイメージに含まれるノイズアーティファクトは少なくなります。

この例では,以下を含む深度学习工具箱™の層を使用して畳み込み自己符号化器ネットワークを定義します。

イメージ入力層を作成します。係数2によるダウンサンプリングとアップサンプリングに関連するパディングの問題を簡略化するには,入力サイズに32行32列を選択します。これは32が2 4,および8できれいに割り切れるためです。

imageLayer = imageInputLayer([32岁,32岁,1]);

符号化層を作成します。符号化器でのダウンサンプリングは,プールサイズ2およびストライド2で最大プーリングを行うことによって実行できます。

encodingLayers = [...convolution2dLayer(3, 16岁,“填充”“相同”),...reluLayer,...maxPooling2dLayer (2“填充”“相同”“步”2),...convolution2dLayer (3 8“填充”“相同”),...reluLayer,...maxPooling2dLayer (2“填充”“相同”“步”2),...convolution2dLayer (3 8“填充”“相同”),...reluLayer,...maxPooling2dLayer (2“填充”“相同”“步”, 2)];

復号化層を作成します。復号化器は,転置畳み込み層を使用して符号化された信号をアップサンプリングします。補助関数createUpsampleTransponseConvLayerを使用して,正しいアップサンプリング係数で転置畳み込み層を作成します。この関数の定義は,この例の終わりで行います。

ネットワークはclippedReluLayerを最終的な活性化層として使用して,出力の範囲を[0,1]にします。

decodingLayers = [...createUpsampleTransponseConvLayer (8),...reluLayer,...createUpsampleTransponseConvLayer (8),...reluLayer,...createUpsampleTransponseConvLayer (16),...reluLayer,...convolution2dLayer(3、1“填充”“相同”),...clippedReluLayer (1.0),...regressionLayer];

イメージ入力層,符号化層,および復号化層を連結して,畳み込み自己符号化器ネットワークアーキテクチャを形成します。

层= [imageLayer、encodingLayers decodingLayers];

学習オプションの定義

亚当オプティマイザーを使用してネットワークに学習させます。関数trainingOptionsを使用してハイパーパラメーター設定を指定します。100年学習をエポック行います。(関数结合を使用して作成した)組み合わせが行われたデータストアではシャッフルがサポートされないため,Shuffleパラメーターを“永远”に指定します。

选择= trainingOptions (“亚当”...“MaxEpochs”, 100,...“MiniBatchSize”洛桑国际管理发展学院。ReadSize,...“ValidationData”dsVal,...“洗牌”“永远”...“阴谋”“训练进步”...“详细”、假);

ネットワークの学習

データソースおよび学習オプションが構成されたので,関数trainNetworkを使用して畳み込み自己符号化器ネットワークに学習させます。3.0以学習には、计算能力上のCUDA対応NVIDIA GPU™を使用することを強く推奨します。

メモ:英伟达™泰坦XP GPUでは学習に約25分かかります。

网= trainNetwork (dsTrain层,选项);

ノイズ除去ネットワークの性能の評価

関数预测を使用して,テストセットから出力イメージを取得します。

ypred =预测(净,dst);

サンプル入力イメージおよびネットワークからの関連する予測出力を可視化して,ノイズ除去がどれだけ適切に機能しているかを把握します。予測どおり,ネットワークからの出力イメージでは,入力イメージのノイズアーティファクトの大部分が除去されています。符号化および復号化プロセスの結果,ノイズ除去後のイメージは少し不鮮明になっています。

inputImageExamples =预览(dst);蒙太奇({inputImageExamples {1}, ypred (:,:,: 1)});

ピークS / N比(PSNR)を解析することによって,ネットワークの性能を評価します。

ref = inputImageExamples {1,2};originalNoisyImage = inputImageExamples {1};psnrNoisy = psnr (originalNoisyImage ref)
psnrNoisy =18.6498
psnrDenoised = psnr (ypred(::,:, 1),裁判)
psnrDenoised =21.8640

予想どおり,出力イメージのPSNRは,ノイズを含む入力イメージより高くなっています。

まとめ

この例では,ImageDatastoreの関数变换および関数结合を使用して,数字のデータセットで畳み込み自己符号化器に学習させて評価するために必要なデータの前処理を設定する方法を説明しました。

サポート関数

補助関数addNoiseは,関数imnoise(图像处理工具箱)を使用してイメージにごま塩ノイズを追加します。関数addNoiseでは,入力データの形式がイメージデータの细胞配列であることが必要です。これは,ImageDatastoreの関数によって返されるデータの形式と一致します。

函数dataOut = addNoise(data) dataOut = data;idx = 1:size(data,1) dataOut{idx} = imnoise(data{idx},)的盐和胡椒);结束结束

補助関数commonPreprocessingは,学習セット,検証セット,およびテストセットに共通する前処理を定義します。この補助関数は以下の前処理手順を実行します。

  1. イメージデータをデータ型に変換する。

  2. 関数imresize(图像处理工具箱)を使用して,入力層のサイズに一致するようにイメージデータのサイズを変更する。

  3. 関数重新调节を使用してデータを[0,1]の範囲に正規化する。

この補助関数では,入力データの形式がイメージデータの2列の细胞配列であることが必要です。これは,CombinedDatastoreの関数によって返されるデータの形式と一致します。

函数dataOut = commonPreprocessing(data) dataOut = cell(size(data));坳= 1:尺寸(数据,2)Idx = 1:size(data,1) temp = single(data{Idx,col});temp = imresize (temp,[32岁,32]);temp =重新调节(临时);dataOut {idx,坳}= temp;结束结束结束

補助関数augmentImagesは,関数rot90を使用してランダムな90度の回転をデータに追加します。ネットワーク入力とそれに対応する予測される応答に同一の回転が適用されます。この関数では,入力データの形式がイメージデータの2列の细胞配列であることが必要です。これは,CombinedDatastoreの関数によって返されるデータの形式と一致します。

函数dataOut = augmentImages(数据)dataOut = cell(size(数据));idx = 1:size(data,1)dataOut (idx:) = {rot90(数据{idx 1}, rot90Val), rot90(数据{idx 2}, rot90Val)};结束结束

補助関数createUpsampleTransposeConvLayerは,指定された係数によって層入力をアップサンプリングする転置畳み込み層を定義します。

函数out = createUpsampleTransponseConvLayer(factor,numFilters) filterSize = 2*factor - mod(factor,2); / /输出裁剪= (factor-mod(因素,2))/ 2;numChannels = 1;= transposedConv2dLayer (filterSize numFilters,...“NumChannels”numChannels,“步”因素,“种植”、裁剪);结束

参考

||||

関連する例

詳細