Neural Style Transfer
ニューラルスタイル転送は、CNNの特徴統計を一致させ、写真の内容を別の画像のスタイルで描き直します。Gatysの手法、高速モデル、用途を解説します。
ニューラルスタイル変換(NST)は、事前学習済みの畳み込みニューラルネットワーク(CNN)の内部特徴を照合し、街並みの写真など一方の画像の内容を、絵画など別の画像の視覚的なスタイルで描画するコンピュータービジョン技術です。内容は、何がどこにあるかを記録する深い層の特徴マップに捉えられます。スタイルは特徴チャネル間の相関として捉えられ、質感、色、筆致を記録しつつ、配置は保持しません。テュービンゲン大学のLeon Gatys、Alexander Ecker、Matthias Bethgeは、2015年8月に『A Neural Algorithm of Artistic Style』でこの手法を発表しました。翌年、Prismaアプリによってスマートフォンユーザーにも広まりました。
元の手法の仕組み#
Gatysの手法では、ImageNetで学習したCNNのVGG-19を固定の特徴抽出器として使います。ネットワークの重みではなく、出力画像のピクセルを変更します。結果は2つの損失関数によって導かれます。
- コンテンツ損失: 深い層の1つであるconv4_2における、出力画像と元画像の特徴マップの二乗差です。物体やレイアウトを認識できる状態に保ちます。
- スタイル損失: conv1_1からconv5_1までの5つの層におけるグラム行列の二乗差です。C個のチャネルを持つ層の場合、グラム行列はC x Cの表で、各要素(i, j)は画像内のすべての位置について合計した、チャネルiとjの応答の強さを表します。
2つの損失の加重和を、L-BFGS 最適化アルゴリズムで最小化します。誤差逆伝播によって、凍結したネットワークを通じてピクセルまで勾配を伝えます。
グラム行列は位置ごとの値を合計するため、画像のレイアウトを変えてもほとんど変化しません。写真の象限を入れ替えると、VGG-19より小さいImageNet CNNであるtorchvisionのResNet-18をPyTorchで使った場合に、この性質を確認できます。
import torch
from skimage import data
from torchvision.models import ResNet18_Weights, resnet18
weights = ResNet18_Weights.DEFAULT
cnn = resnet18(weights=weights).eval()
early_layers = torch.nn.Sequential(cnn.conv1, cnn.bn1, cnn.relu, cnn.maxpool, cnn.layer1)
preprocess = weights.transforms()
photo = torch.tensor(data.astronaut()).permute(2, 0, 1) # 3 x 512 x 512
rearranged = torch.roll(photo, shifts=(256, 256), dims=(1, 2)) # same pixels, quadrants swapped
def content_and_style(image):
"""Return an early CNN layer's feature map (content) and its Gram matrix (style)."""
with torch.no_grad():
features = early_layers(preprocess(image)[None])[0].flatten(1) # channels x positions
return features, features @ features.T / features.shape[1]
(content_a, style_a), (content_b, style_b) = content_and_style(photo), content_and_style(rearranged)
print(f"Content change: {(content_a - content_b).norm() / content_a.norm():.0%}")
print(f"Style change: {(style_a - style_b).norm() / style_a.norm():.0%}")象限を入れ替えると特徴マップは96%変化しますが、グラム行列の変化はわずか7%です。残る7%の変化は、新しくできた境界と、各画像から異なる部分を切り出す中央クロップによるものです。このため、スタイル損失は絵画の筆致や配色をコピーしながら、絵画内の物体の位置はコピーしません。
高速なスタイル変換と任意のスタイルへの対応#
画像ごとの最適化には何百回もの反復が必要なため、その後の研究では最適化を学習プロセスに組み込みました。スタンフォード大学のJustin Johnson、Alexandre Alahi、Li Fei-Feiは、2016年に同じ損失関数を使ってスタイルごとにフィードフォワードネットワークを学習し、約3桁高速な結果を実現しました。また、同じ知覚損失を超解像にも適用しました。Dmitry Ulyanovらは、それらのネットワークでバッチ正規化をインスタンス正規化に置き換えると、スタイル変換の品質が向上することを示しました。Xun HuangとSerge Belongieによる適応的インスタンス正規化(AdaIN、2017)は、再学習なしであらゆるスタイルに対応します。コンテンツ特徴の各チャネルの平均と標準偏差をスタイル画像の値に合わせて調整し、デコードするため、リアルタイムで動作します。
堅牢なビジョンモデルのためのスタイル変換#
Robert GeirhosらはAdaINを使い、ImageNetで学習したCNNが形状よりもテクスチャに強く依存することを示しました。たとえばResNet-50は、ゾウの皮膚のテクスチャを持つ猫の画像をゾウと分類します。これはショートカット学習の一例です。彼らは79,434点の絵画を収録したPainter by Numbersコレクションからランダムに選んだ絵画を使って、ImageNetの全画像にスタイル変換を施したStylized-ImageNetを作成しました。このデータセットで学習したResNet-50は、代わりに形状を重視しました。この形状ベースのネットワークをFaster R-CNN 物体検出モデルのバックボーンとして使うと、Pascal VOC 2007のmAP50は70.7から75.1に、MS COCOでは52.3から55.2に向上しました。
スタイル変換は物体の位置を変えないため、同じ考え方を検出データセットのデータ拡張にも利用できます。ラベル付き画像をスタイル変換した画像では、元のバウンディングボックスを再利用できます。そのため、Ultralytics YOLO26の検出データセットでは、新しい画像名で元のラベルファイルをコピーするだけで済みます。
ニューラルスタイル変換と関連用語の違い#
- 敵対的生成ネットワーク(GAN): CycleGANは、1枚のスタイル画像の統計量を照合するのではなく、写真とモネの絵画など、画像コレクション全体の間の変換を学習します。
- 転移学習: 新しいタスクに向けて事前学習済みの重みをファインチューニングします。NSTではネットワークの重みを更新せず、損失の測定にのみ使用します。
- 拡散モデル: テキストプロンプトまたは参照画像から画像を再生成してスタイルを変換します。その過程で、スタイルだけでなく形状や細部も変わることがあります。










