Search Unity

深層ニューラルネットワークを使った Unity でのリアルタイムスタイル変換

, 11月 25, 2020

ディープラーニングは現在、日常生活に現れる数多くの AI 技術に活用されており、畳み込みニューラルネットワーク(CNN)を使えば、画像に対する複雑な処理を高速に適用することができます。Unity では、3D レンダリングパイプラインでの CNN を使った推量のシームレスな統合を提案することを目標とした取り組みが進められています。この方針に従って、Unity Labs では、最先端の研究成果の改良に取り組んだり、Barracuda と呼ばれる効率のよいニューラル推量エンジンの開発に取り組んでいます。この記事では、ゲーム内でのマルチスタイル変換という、困難なユースケースに関する実験を行います。

ディープラーニングは、これまでスーパーコンピュータとオフライン計算に限定されてきましたが、計算能力の向上により、コンシューマー向けハードウェアを使ってリアルタイムでのディープラーニングを使える世界が急速に近づいています。Unity Labs は、Barracuda によって、クリエイターの手にいち早くリアルタイムのディープラーニングをお届けしたいと考えています。ニューラルネットワークは ML-Agents によってすでにゲーム AI に使用されていますが、レンダリングに関して、リアルタイムゲームエンジンではまだ検証されていない多くの応用先が存在します。例えば、ディープラーニングによるスーパーサンプリング、アンビエントオクルージョン、グローバルイルミネーション、スタイル変換などです。今回は、ネットワークの学習から Unity のレンダリングループへの統合までのパイプラインを実証するために、最後のスタイル変換を選択しました。

ニューラルスタイル変換

スタイル変換とは、ある画像のスタイル(画風)を別のコンテンツに乗せることです。有名な例としては、実際の写真を有名な絵画のスタイルに変換するというものがあります。2015 年以降、畳み込みニューラルネットワーク(CNN)の利用により、変換結果の質が飛躍的に向上しました。そして最近では、このタスクを 1 回のパスで処理する CNN を訓練するために、研究コミュニティによって大きな努力がなされています。特定の画像をネットワークへの入力として、その画像にスタイルを適用したバージョンを(GPU 上で)1 秒未満で出力するネットワークも実現されています。今回の実験では、このようなネットワークの小さなバージョンを使用して、マルチスタイル変換タスクに併せて訓練します。その後、このネットワークを Unity のレンダリングパイプラインに接続し、フレームバッファを入力として受け取り、リアルタイムでスタイルを適用したバージョンに変換するしくみを作ってみます。

結果として得られるものは、ゲーム内でのリアルタイムスタイル変換です。ここでは、『Book of the Dead』の環境にそれを適用した素晴らしいビジュアルの例をお見せします。これは現在のハイエンド PC ハードウェアを使って、ニューラルネットワークによるスタイル変換をリアルタイムに適用したもので、オンザフライのスタイル切り替えが可能です。

 

フル HD でのリアルタイム 30 FPS スタイル変換(Barracuda 使用)
『Book of the Dead』デモ

深層畳み込みニューラルネットワークの学習

スタート地点としては、Ghiasi らが提案した最先端の高速スタイル変換のためのニューラルネットワークを選びました。このネットワークには 2 つの部分があります。

1)スタイル画像から、ニューラルネットワークを使ってスタイルのコンパクト表現を推定する。

2)このコンパクト表現を入力画像をスタイル変換された画像にする実際のスタイル変換ネットワークに注入します。このようにして、実行時にスタイル画像を変更することができ、スタイル変換はその変更に適応します。

スタイル推量ネットワークはスタイル画像からスタイルのコンパクト表現を推論し、スタイル変換ネットワークはこの表現を使用して入力画像のスタイル変換を行う。

私たちのスタイル変換ネットワークは、2 つのダウンサンプリング層と対称的なアップサンプリング層で構成され、それらの層の間には 5 つの残差ブロックがあります。

アーキテクチャが選択されると、まず、ネットワーク全体をオフラインで事前に訓練します(一度訓練されると、実行時に使用されます)。この目的のために、ビデオやコンピューターアニメーション映画から撮影された「コンテンツ」画像と、約 8 万点の絵画のデータベースから撮影された「スタイル」画像のカスタムデータセットを使用しています。ニューラルネットワークの重みは、スタイルとコンテンツ画像が与えられたときに、結果として出力される画像がスタイルをよく再現し、コンテンツを認識できるように最適化されています。

また、連続したフレームに対してはかなり異なったスタイルの適用が可能ですが、実際にこれが起きるとちらつきの激しいアーティファクトが発生します。そこで、時間次元を扱うためにネットワークを訓練する必要があります。実際には、これは(変位ベクトルを適用した後に)2 つの連続したフレームに対して同じスタイルを適用することを強制するという学習目標です。

これらの異なる制約の間のバランスはデリケートなものであり、このプロセスにはかなりの試行錯誤が必要です。

学習は、NVidia RTX 2080 GPU を 1 つ使う Cuda/CuDNN バックエンドで動く Tensorflow ライブラリを使用して、約 2~3 日間かかります。学習後、ネットワーク構造と学習済みのパラメーターはディスクに保存され、実行時に使用するために後から Unity に読み込めるようになっています。

Barracuda を使った Unity 統合

Unity Labs は Barracuda を使用して、Unity 用のクロスプラットフォームのニューラルネットワーク推量エンジンを構築しました。ニューラルネットワークは、選択したライブラリに収録された事前学習済みのものをディスクにセーブして、Barracuda を介して Unity でインポートして実行することができます。ドキュメントには、Pytorch または Tensorflow で学習済みのネットワークを準備する方法についての詳細が記載されています。Barracuda は、Unity のマルチプラットフォーム設計を採用しており、CPU または GPU で動作します。CPU 推量はすべての Unity プラットフォームでサポートされていますが、GPU 推量は Unity のコンピュートシェーダを必要とし、現在のところ WebGL を除くほぼすべてのプラットフォームで実行できます。

Barracuda の推奨インポートパスは、ほとんどのディープラーニングライブラリがエクスポートできるオープンフォーマットの ONNX 経由です。ユーザーは、ファイルを Unity プロジェクトにドラッグアンドドロップするだけで簡単にインポートできます。アセットインスペクターは、ネットワークの入力、出力、層などの情報を表示します。以下に例を示します。

その後、入力(コンテンツ画像とスタイル画像)をネットワークに供給し、スタイルが適用された出力を表示することになります。Unity 内では、Barracuda でニューラルネットワークをロードし、各フレームごとにカメラのレンダリング画像を取得し、その入力に基づいてネットワークを推定し、出力を画面にコピーするカスタムポストプロセッシングスクリプトを作成するだけです。

その結果、通常のレンダリングプロセスがフレームバッファに書き込み、その後 Barracuda で推定されたニューラルネットワークによって変換されるレンダリングパイプラインの全体ができました。

スタイル変換レンダリングは 2 段階の処理で、レンダリング段階では通常のゲーム画像を計算し、ポストプロセス段階では提供されたスタイルに応じてスタイル変換を行い、ゲーム画像にスタイルが適用された状態となる。

結果として得られるビジュアルとパフォーマンス

美しく複雑な『Book of the Dead』シーンでのリアルタイムスタイル変換の結果は先ほど提示した動画のとおりです。3D レンダリング段階もですが、特にニューラルネットワーク推量(ポストプロセス)段階は非常に計算量が多く、私たちのデモにもハイエンドのハードウェアが必要となりました。1080p 解像度で NVidia RTX 2080 GPU を使用した場合、1 フレームあたりの総消費時間は 23ms で、レンダリング段階で 6~9ms、ニューラルネットワーク推量段階で 14ms となりました。AMD Vega RX 64 を使った場合は、1 フレームあたりの総消費時間は 28ms で、シーンのレンダリングに 7~10ms、推量に 18ms 消費しました。どちらの場合も、デモは 30fps で安定して動作します。これらの数値には、ネットワークと Barracuda の両方に行われた最適化分が含まれています。

上の録画で見られるように、視聴者は通常の『Book of the Dead』をビューアーで見るときと同じことができます。つまり、自由に環境内を動き回り、複雑で美しい植生を楽しむことができます。それに加えて、例えば、ピカソの絵画のスタイルを適用するなど、好きなスタイルを視聴者の側で適用することもできます。スタイルの適用後も、ゲームはリアルタイムで適用したスタイルの絵になってリアルタイムで実行され続けます。

ニューラルネットワークのスタイルのコンパクト表現を推論する部分は、スタイルが変更されたときに一度だけ実行され、ディスクから読み込むこともできることに注意してください。つまり、スタイルの変更にラグはないということです。

現バージョンのニューラルネットワークでも多種多様なスタイルを扱うことができます。しかし、リアルタイムで利用できる効率的なネットワークの範囲内で、スタイル変換品質を向上させたり、取り扱うことのできるスタイルの幅を広げたりすることは、未解決の課題となっています。

PS4 Pro 向けにパフォーマンスを最適化する

Barracuda は設計上マルチプラットフォームなので、コードやネットワークに変更を加えることなく、PS4 Pro に乗せ換えてスタイル変換を実行することができます。しかし、このハードウェアターゲットは、RTX 2080 に比べて推量に割く計算能力がはるかに低いのです。そこでまず、3D レンダリング段階で費やす時間を短縮するために、昔使った Unity Vikings Village のシーンに対象を切り替えた上で、作業を始めました。

スタイル変換をかけた『Vikings Village』のシーン。左下の囲みは適用されたスタイルを示す。

この比較的軽いシーンに対して、スタイル変換をかけたレンダリングには当初約 166 ミリ秒かかりました(1080p での 3D レンダリングに 10 ミリ秒、720p でのニューラルネットワーク推量に 156 ミリ秒)。さらに、推量時の解像度を 1080p に上げると、デモはメモリを使い果たしてしまいました。このため、1080p のフル解像度で 30fps で動作させるためには、大幅な高速化とメモリサイズの削減が必要となりました。概念実証として、このデモを 3 つの方法で最適化し、1080p でフレームあたり 28ms を達成することを目指しました。Barracuda の GPU レベルの最適化、より小さい(したがってより高速な)ニューラルネットワークの実現、およびスクリーン空間の処理の時間軸方向への分散です。これらの最適化は PC でも有効であり、先ほど示した消費時間を達成するのに役立ちましたが、最近の GPU で 30fps で動作させるためには、スクリーン空間の時間軸方向への処理の分散は必要ありません。

Barracuda の GPU レベルでの最適化

パフォーマンスの面では、この実験のスタイル変換ネットワークは主な構成要素は以下のようになります。まず、畳み込みインスタンスの標準化ReLU(活性化関数) の活性化で構成され、さらにネットワークの実行時に使う部分には 2 つの興味深い特徴があります。この部分は全体的に高い解像度(残差ブロックは 480×270 で実行)で実行され、入出力サイズは 1920×1080 で、チャンネル数は 3(RGB)なのです。

Barracuda レベルの最適化については、今後のブログ記事で詳しく説明します。ここでは概要を述べるにとどめます。

  • メモリレイアウトをチャンネルラストからチャンネルファーストに変更し、メモリのコヒーレンシーを高めた。
  • ReLU を可能な限り他のオペレーターの内部に融合させた。
  • アップサンプリング/ダウンサンプリングの場合と残差の場合の両方をカバーするように、新しい畳み込みカーネルを書いた。
  • インスタンスの標準化カーネルを書き直した。

PS4 Pro では、これらの最適化により、720p の設定でリファレンスとなるネットワークで推量にかかる時間は 166ms から 70ms に短縮されました。

ニューラルネットワークのサイズの削減

ニューラルネットワークの構造は、どのようなシーンでどのようなスタイルでも扱えるように設計されています。私たちは CNN の各層に費やされた時間をプロファイリングし(PC では Unity の GPU プロファイラー、PS4 ではソニーの専用プロファイリングツールを使用)、品質と速度の関係を明らかにするためにいくつかの実験を行いました。最終的には、2 つの方法でネットワークを最適化しました。

  • アップサンプリングとダウンサンプリングでは、畳み込みの数を 3 から 2 に減らし、データが高解像度の場合はチャンネル数を少なくした。
  • ネットワークのチャンネル数を 48 チャンネルから 32 チャンネルに減らした。

 

高速化のために、アップサンプリングとダウンサンプリングを改良し、CNN のフィルターを 48 チャンネルから 32 チャンネルに削減した。

縮小されたニューラルネットワークを使って、先ほど 720p で 70ms だった PS4 Pro での推論が、1080p の解像度で 56ms で行えるようになりました。

時間軸方向でのアップサンプリング

推量に費やされる時間をさらに短縮する方法として、すぐに思いつくものの 1 つは、レンダリング解像度を下げることです。レンダリング解像度はネットワークの複雑さに直結しているので、確実に時間短縮はできます。しかし、スタイル変換をかけた結果は低解像度ではぼやけて見える傾向があり、シーンのディテールの大部分が失われてしまうため、これで妥協することはできません。代わりに、ゲーム開発者のハンドブックによくある別のトリックを適用することを試みます。アンビエントオクルージョンなどの手法とほぼ同じように、スタイル変換のデモが Unity の通常のポストエフェクトとして完全に統合されているという事実を利用することができます。Unity のようなゲームエンジンは、毎フレームでレンダリングの最終結果の他にもたくさんの情報を与えてくれるので、これでコンピューターグラフィックス技術をディープニューラルネットワークに適用することが可能になります。

現在のゲームでは、テンポラルアンチエイリアシングのような高価なスクリーン空間エフェクトの品質やパフォーマンスを向上させるために、時間軸方向に処理を分散させるスキームを使用することがよくあります。このアイデアは、連続したフレーム間の一貫性を利用して、以前にレンダリングされたフレームの情報を再利用して、現在のフレームを改善または完成させるというものです。Barracuda と同様に、ネットワーク推量は層ごとに手動でスケジューリングできるため、推量全体を等分なタイムシェアに分割して、複数のフレームにわたって画像にスタイル変換を適用できます。

Barracuda で次のスタイル化されたフレームが計算されている間に中間フレームを表示するために、コンピューターグラフィックスの他の時間的手法と同様に再投影を使用しています。具体的には、画像空間での双方向シーン再投影(Yang et al, 2011)を適用して、各ネットワーク出力フレームの間に高品質の中間フレームを生成し、できるだけディスオクルージョンエラーを少なくした形で表示しています。

これを 4 つのフレームにわたってスタイル変換の計算をするために適用すると、PS4 Pro では 30 FPS のフレーム予算になります。分割された推量がフレームあたり 14ms、再投影のオーバーヘッド 4ms、シーンレンダリングに 10ms で、合計 28ms となります。そして、コンソール上で実行された最終的な結果がこちらです。

 

しかし、このように時間軸方向に処理を分散させるスキームをスタイル変換で使用すると、問題が発生します。例えば、スタイル変換では、境界線上でオブジェクトの形状が変更され、その周りにハローが追加され、エッジ周りの深度とモーションベクターが正しくなくなります。これにより、再投影された中間フレームにゴーストが発生します。このデモでは、各ピクセルの近傍で深度が最小のモーションベクターを取得することで、これを修正しました。これにより、ハローがハローを発生させているオブジェクトに密着するようになり、アーティファクトは減少しましたが、完全に除去することはできませんでした。

今後の課題:レンダリングループの中の CNN

先ほどのセクションで紹介した内容は、Unity の統合を活用したものでした。これにより、レンダリングパイプラインのポストエフェクトとしてネットワークを追加して動作させることができ、時間軸方向に処理を分散させることのメリットを得ることができました。さらに、複数の G バッファーを入力とするニューラルネットワークを、ノイズ除去、テクスチャの幻覚化、アンチエイリアシング、大域照明などのタスクのために、遅延させたパイプラインで適用するというアイデアが思い浮かびます。

また、CNN をコンピューターグラフィックス技術と組み合わせることで、どのような課題が生じるかを見てきました。私たちの場合、スタイル変換は形状を変えてしまうため、再投影のエラーが発生しやすく、コストがかかります。より良い解決策は、ゲームエンジンの制約を念頭に置いて設計された改良されたネットワークを使用して、ネットワークの学習自体に織り込むことができるものでしょう。このような問題は、リアルタイムグラフィックスとディープラーニングが交差する領域の最前線にあるものです。そして、Barracuda のおかげで、皆様と Unity Labs がこの領域の研究に全面的に投資できるようになりました。

このデモを使用して、ニューラルテクスチャ合成とスタイル変換の両方の研究、および Barracuda の開発を進めてきました。Barracuda は利用可能ですが、機能開発や最適化は活発に行われており、例えば、標準的な形ではない層を含むニューラルネットワークは現在のバージョンではサポートされていない可能性が高いです。フォーラムでご意見をお聞かせください。

サンプルプロジェクトのダウンロード

上記のデモの実行時スタイル変換モデルを紹介する Unity サンプルプロジェクトが Github で公開されています。このプロジェクトでは、オンザフライでスタイルを選択することができます。このサンプルは実験目的のみでの使用を想定しています。たとえば、皆さんご自身のシーンを接続してみても構いません。私たちからは実験的な実装をありのままの形で提供します。皆さんのお手元で内容を見たり、これを使って遊んでみたり、壊してしまったり、自由に試してください。

9 replies on “深層ニューラルネットワークを使った Unity でのリアルタイムスタイル変換”

Hey, please also share an article how to train your own models please. The repo, setup etc. Without it, we won’t be able to experiment.

Hi Erick,

Yes, it is performed on a frame-by-frame basis: a neural network transforms the output of the rendering into a stylized output.
However, the neural network was trained using video’s and with frame-by-frame continuity in mind. The result is that it “knows” how to stylize a single frame in a conservative manner, so that it doesn’t flicker when run independently over multiple frames at runtime.

This is so cool. I was thinking about trying something similar for a prototype so I will definitely be checking out this repo!

@fuzzy3d that’s exactly what DLSS does. It doesn’t perform style transfer but still uses deep learning to reduce rendering noise.

To add to what Henry said Deep Learning (DL) can also be used to denoised offline pathtracer!
Unity progressive lightmapper actually offer it in the form of NVidia OptiX and and Intel OIDN!
(see https://docs.unity3d.com/2020.1/Documentation/Manual/progressive-lightmapper.html#AdvancedFilteringSettings).
Those denoiser are not using Barracuda however we have made several successfull experiment about that for example porting Intel OIDN CPU implementation to GPU using as a backend Barracuda.
The future is bright!

I would need to reduce the noise in real-time path-tracing. Path-tracing works great, but it doesn’t have a full-screen denoiser yet. Any improvement in noise or just the removal of black fireflies would make a great thing out of it.

Comments are closed.