主要内容

深層学習を使用したニュラルスタル転送

この例では,事前学習済みのVGG-19ネットワークを使用して,あるイメージのスタイル外観を別のイメージのシーンコンテンツに適用する方法を説明します。

デ,タの読み込み

スタル。この例では,ファン・ゴッホの有名な絵画“星月夜”をスタイルイメージとして使用し,灯台の写真をコンテンツイメージとして使用します。

styleImage = im2double(imread(“starryNight.jpg”));contentImage = imread(“lighthouse.png”);

imshow (imtile ({styleImage, contentImage},写成BackgroundColor =“w”));

特徴抽出ネットワ,クの読み込み

この例では,事前学習済みのVGG-19深層ニューラルネットワークに変更を加えたものを使用して,コンテンツイメージとスタイルイメージの特徴をさまざまな層で抽出します。この多層にわたる特徴は,コンテンとスタルの損失を計算するのに使用されます。このネットワ,クは,組み合わされた損失を使用して,スタ。

事前学習済みのvgg-19ネットワ,クを取得するには,vgg19(深度学习工具箱)を▪▪ンスト▪▪ルします。必要なサポトパッケジがンストルされていない場合,ダウンロド用リンクが表示されます。

Net = vgg19;

VGG-19ネットワークを特徴抽出に適したネットワークにするには,全結合層をネットワークからすべて削除します。

lastFeatureLayerIdx = 38;layers = net.Layers;layers = layers(1:lastFeatureLayerIdx);

Vgg-19ネットワ,クの最大プ,リング層は,フェ,ジング効果を引き起こします。フェージング効果を減らして勾配フローを増やすには,すべての最大プーリング層を平均プーリング層に置き換えます[1]

l = 1:lastFeatureLayerIdx layer = layers(l);如果isa(层,“nnet.cnn.layer.MaxPooling2DLayer”) layers(l) = averagePooling2dLayer(layer.PoolSize,Stride=layer.Stride,Name=layer.Name);结束结束

変更を加えた層を使用して,層グラフを作成します。

lgraph = layerGraph(图层);

特徴抽出ネットワ,クをプロットで可視化します。

情节(lgraph)标题(“特征提取网络”

カスタム学習ル,プを使用してネットワ,クに学習させ,自動微分を有効にするには,層グラフをdlnetworkオブジェクトに変換します。

Dlnet = dlnetwork(lgraph);

デ,タの前処理

より高速に処理できるように,スタズを小さくします。

imageSize = [384,512];styleImg = imresize(styleImage,imageSize);contentImg = imresize(contentImage,imageSize);

事前学習済みのVGG-19ネットワークは,チャネル単位の平均値を減算したイメージで分類を実行します。。

imgInputLayer = lgraph.Layers(1);meanVggNet = imgInputLayer.Mean(1,1,:);

チャネル単位の平均値は,ピクセル値の範囲が[0,255]である浮動小数点データ型のイメージに適しています。スタルに変換します。。

styleImg = rescale(single(styleImg),0,255) - meanVggNet;contentImg = rescale(single(contentImg),0,255) - meanVggNet;

転送▪▪メ▪▪ジの初期化

転送。この転送イメージは,スタイルイメージ,コンテンツイメージ,または任意のランダムイメージを使用して初期化できます。スタイルイメージまたはコンテンツイメージを使用して初期化すると,スタイル転送処理にバイアスがかけられ,転送イメージは入力イメージに似たものになります。それに対し,ホワイトノイズを使用して初期化すると,バイアスが除去されますが,スタイル化されたイメージに収束するまで時間がかかります。この例では,より優れたスタイル化とより高速な収束を実現するため,コンテンツイメージとホワイトノイズイメージの重み付けされた組み合わせとして出力転送イメージを初期化します。

noiseRatio = 0.7;randImage = randi([-20,20],[imageSize 3]);transferImage = noiseRatio。*randImage + (1-noiseRatio).*contentImg;

損失関数とスタル転送パラメタの定義

コンテン損失

コンテン損失の目的は,転送メジの特徴をコンテンメジの特徴に一致させることです。コンテン損失は,各コンテンツ特徴層におけるコンテンツ イメージの特徴と転送イメージの特徴との間の平均二乗差として計算されます[1] Y ˆ は転送メジにいて予測された特徴マップで, Y はコンテンいて予測された特徴マップです。 W c l は, l t h 番目の層におけるコンテン層の重みです。 H W C はそれぞれ,特徴マップの高さ,幅,チャネル数です

l c o n t e n t l W c l × 1 H W C j Y ˆ j l - Y j l 2

コンテン特徴抽出層の名前を指定します。これらの層から抽出された特徴は,コンテン損失の計算に使用されます。VGG-19ネットワークでは,浅い層から抽出された特徴を使用するよりも,深い層から抽出された特徴を使用するほうがより効果的です。そのため,コンテン特徴抽出層を4番目の畳み込み層として指定します。

styleTransferOptions。contentFeatureLayerNames =“conv4_2”

コンテン特徴抽出層の重みを指定します。

styleTransferOptions。contentFeatureLayerWeights = 1;

スタ@ @ル損失

スタイル損失の目的は,転送イメージのテクスチャをスタイルイメージのテクスチャに一致させることです。@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @そのため,スタイル損失は,スタイルイメージのグラム行列と転送イメージのグラム行列との間の平均二乗差として計算されます[1] Z Z ˆ はそれぞれ,スタ▪▪ル▪▪メいて予測された特徴マップです。 G Z G Z ˆ はそれぞれ,スタ。 W 年代 l は, l t h 番目の層におけるスタ@ @ル層の重みです。

G Z ˆ j Z ˆ j × Z ˆ j

G Z j Z j × Z j

l 年代 t y l e l W 年代 l × 1 2 H W C 2 G Z ˆ l - G Z l 2

スタ@ @ル特徴抽出層の名前を指定します。これらの層から抽出された特徴は,スタ。

styleTransferOptions。年代tyleFeatureLayerNames = [“conv1_1”“conv2_1”“conv3_1”“conv4_1”“conv5_1”];

スタ@ @ル特徴抽出層の重みを指定します。単純なスタイルイメージの場合は小さな重みを指定し,複雑なスタイルイメージの場合は重みを増やします。

styleTransferOptions。年代tyleFeatureLayerWeights = [0.5,1.0,1.5,3.0,4.0];

合計損失

合計損失は,コンテン損失とスタル損失が重み付けされて組み合わされたものです。 α β はそれぞれ,コンテン損失とスタル損失の重み係数です。

l t o t 一个 l α × l c o n t e n t + β × l 年代 t y l e

コンテン損失とスタル損失の重み係数αβを指定します。αβの比は,約1e-3または1e-4でなければなりません[1]

styleTransferOptions。Alpha = 1;styleTransferOptions。Beta = 1e3;

学習オプションの指定

2500回反復して学習させます。

numIterations = 2500;

亚当最適化のオプションを指定します。より早く収束するように,学習率を2に設定します。出力。最後の平均勾配と最後の平均2乗勾配減衰率を[]に初期化します。

learningRate = 2;trailingAvg = [];trailingAvgSq = [];

ネットワ,クの学習

スタイルイメージ,コンテンツイメージ,および転送イメージを,基となる型がで次元ラベルが”SSC”であるdlarray(深度学习工具箱)オブジェクトに変換します。

dlStyle = darray (styleImg,“SSC”);dlContent = darray (contentImg,“SSC”);dlTransfer = dlarray(transferImage,“SSC”);

Gpuが利用できる場合,Gpuで学習を行います。GPU を使用するには、Parallel Computing Toolbox™、および CUDA® 対応の NVIDIA® GPU が必要です。詳細については、Gpu計算の要件(并行计算工具箱)を参照してください。GPU で学習する場合、データをgpuArrayに変換します。

如果canUseGPU dlContent = gpuArray(dlContent);dlStyle = gpuArray(dlStyle);dlTransfer = gpuArray(dlTransfer);结束

コンテンの特徴を抽出します。

numContentFeatureLayers = numel(styleTransferOptions.contentFeatureLayerNames);contentFeatures = cell(1,numContentFeatureLayers);[contentFeatures{:}] = forward(dlnet,dlContent,Outputs=styleTransferOptions.contentFeatureLayerNames);

スタ▪▪ル▪▪メ▪ジからスタ▪▪ルの特徴を抽出します。

numStyleFeatureLayers = numel(styleTransferOptions.styleFeatureLayerNames);styleFeatures = cell(1,numStyleFeatureLayers);[styleFeatures{:}] = forward(dlnet,dlStyle,Outputs=styleTransferOptions.styleFeatureLayerNames);

カスタム学習ル,プを使用してモデルに学習させます。それぞれの反復で次を行います。

  • コンテンツイメージ,スタイルイメージ,および転送イメージの特徴量を使用して,コンテンツ損失とスタイル損失を計算します。損失と勾配を計算するには,補助関数imageGradientsを使用します(この例のサポ,ト関数の節で定義されています)。

  • 関数adamupdate(深度学习工具箱)を使用して,転送。

  • 最も優れたスタル転送メメ。

图minimumLoss = inf;iteration = 1:numIterations使用dlfeval和示例末尾列出的% imageGradients函数[grad,losses] = dlfeval(@imageGradients,dlnet,dlTransfer,contentFeatures,styleFeatures,styleTransferOptions);[dlTransfer,trailingAvg,trailingAvgSq] = adamupdate(dlTransfer,grad,trailingAvg,trailingAvgSq,iteration,learningRate);如果的损失。tot一个llo年代年代< minimumLoss minimumLoss = losses.totalLoss; dlOutput = dlTransfer;结束在第一次迭代和每50次之后显示传输图像%的迭代。后处理步骤在“后处理”中描述%传输图像用于显示”部分如果mod(迭代,50)== 0 ||(迭代== 1)transferImage = gather(extractdata(dlTransfer));transferImage = transferImage + meanVggNet;transferImage = uint8(transferImage);transferImage = imresize(transferImage,size(contentImage,[1 2]));图像(transferImage)标题([“迭代后转移图像”num2str(迭代)])轴图像drawnow结束结束

転送▪▪メ▪▪ジを表示するための後処理

更新された転送▪▪メ▪▪ジを取得します。

transferImage = gather(extractdata(dlOutput));

ネットワクで学習した平均値を転送メジに追加します。

transferImage = transferImage + meanVggNet;

ピクセルによっては,ピクセル値がコンテンツイメージとスタイルイメージの元の範囲[0,255]を超える場合があります。デ,タ型をuint8に変換することで,この値を[0,255]の範囲にクリップすることができます。

transferImage = uint8(transferImage);

転送▪▪メ▪▪ジのサ▪ズを,コンテン▪▪メ▪ジの元のサ▪ズに合わせて変更します。

transferImage = imresize(transferImage,size(contentImage,[1 2]));

コンテンツイメージ,転送イメージ,およびスタイルイメージをモンタージュに表示します。

imshow (imtile ({contentImage、transferImage styleImage},...GridSize = 3[1],写成BackgroundColor =“w”));

サポ,ト関数

メ,ジの損失と勾配の計算

補助関数imageGradientsは,コンテンツイメージ,スタイルイメージ,および転送イメージの特徴量を使用して,損失と勾配を返します。

函数[gradients,losses] = imageGradients(dlnet,dlTransfer,contentFeatures,styleFeatures,params)初始化传输映像特性容器numContentFeatureLayers = numel(params.contentFeatureLayerNames);numStyleFeatureLayers = numel(params.styleFeatureLayerNames);transferContentFeatures = cell(1,numContentFeatureLayers);transferStyleFeatures = cell(1, numstylefeaturelays);提取传输图像的内容特征[transferContentFeatures{:}] = forward(dlnet,dlTransfer,Outputs=params.contentFeatureLayerNames);提取转移图像的风格特征[transferStyleFeatures{:}] = forward(dlnet,dlTransfer,Outputs=params.styleFeatureLayerNames);计算内容损失cLoss = contentLoss(transferContentFeatures,contentFeatures,params.contentFeatureLayerWeights);计算款式损失sLoss = styleLoss(transferStyleFeatures,styleFeatures,params.styleFeatureLayerWeights);以内容损失和样式损失的加权组合计算最终损失损失=(参数。α* cLoss) + (params.beta * sLoss);计算关于转移图像的梯度gradients = dlgradient(loss,dlTransfer);提取各种损失的损失。tot一个llo年代年代=gather(extractdata(loss)); losses.contentLoss = gather(extractdata(cLoss)); losses.styleLoss = gather(extractdata(sLoss));结束

コンテン損失の計算

補助関数contentLossは,コンテン。

函数(transferContentFeatures,contentFeatures,contentWeights)* mean((transferContentFeatures{1,i} - contentFeatures{1,i}).^2,“所有”);loss = loss + (contentWeights(i)*temp);结束结束

スタ@ @ル損失の計算

補助関数styleLossは,スタイルイメージの特徴量に関するグラム行列と転送イメージの特徴量に関するグラム行列との間の重み付け平均二乗差を計算します。

函数损失= styloss (transferStyleFeatures,styleFeatures,styleWeights)损失= 0;i=1:numel(styleFeatures) tsf = transferStyleFeatures{1,i};sf = styleFeatures{1,i};[h,w,c] = size(sf);gramStyle = calculateGramMatrix(sf);gramTransfer = calculateGramMatrix(tsf);sLoss = mean((gramTransfer - gramStyle).^2,“所有”) / ((h*w*c)^2);loss = loss + (styleWeights(i)*sLoss);结束结束

グラム行列の計算

補助関数styleLossは,補助関数calculateGramMatrixを使用して特徴マップのグラム行列を計算します。

函数gramMatrix = calculateGramMatrix(featureMap) [H,W,C] = size(featureMap);重塑(feature remap,H*W,C);gramMatrix = reshapedFeatures' * reshapedFeatures;结束

参考文献

Leon A. Gatys, Alexander S. Ecker, Matthias Bethge。“艺术风格的神经算法。”预印本,2015年9月2日提交。https://arxiv.org/abs/1508.06576

参考

(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)

関連するトピック