どーも、ぐるたか@guru_takaです。
Unity ステーションで、Barracuda という Unity Technologies 製の推論エンジン(ライブラリ)が取り扱われました。
Barracuda を使えば、学習済みモデルを Unity 上で良い感じに使えるとのこと。早速、スタイル変換の学習済みモデルと Barracuda を使い、Unity 上でレナ嬢をスタイル変換しました!以下記事を参考にしています。
参考
Unity Technologies製推論エンジン Barracudaがスゴイという話Qiita
本記事では Barracuda の導入方法や基本的な使い方、また詰まった点を、備忘録としてまとめます。Barracuda × Unity が気になる方の参考になれば幸いです!
・Visual Effect Graph:10.4.0
目次
Barracuda とは?
Barracuda とは、Unity 用のニューラルネットワークの軽量な Unity Technologies 製の推論ライブラリです。
Unity Barracuda is a lightweight cross-platform Neural Networks inference library for Unity.
Barracuda can run Neural Networks both on GPU and CPU.
引用:Unity-Technologies/barracuda-release | GitHub
CPU はもちろん、GPU でも動かすことが可能。さらに、パフォーマンスの最適化もされています!
参考 Real-time style transfer in Unity using deep neural networksUnity 公式ブログBarracuda は推論ライブラリのため、予め学習済みモデルが必要です。また、モデルのフォーマットは ONNX(Open Neural Network eXchange)になります。ONNX(読み方:オニキス)とは、様々な機械学習用のフレームワークに対応できるフォーマットです。
PyTorch や TensorFlow など様々な機械学習用のフレームワークがありますが、最終的に ONNX でモデルを出力すれば、Barracuda でも使えるわけです。
ONNX フォーマットの学習済みモデル
ONNX の学習済みモデルは、何と GitHub 上に無料で公開されています!そのため、ゼロから学習済みモデルを構築しなくても、有名どころのモデルであれば、無料でダウンロードできます。
参考 onnx/models: A collection of pre-trained, state-of-the-art models in the ONNX formatGitHub本記事では Fast Neural Style Transfer の Mosaic を拝借して、スタイル変換を行います!
出典:models/vision/style_transfer/fast_neural_style at master · onnx/models
InvalidProtocolBufferException: Protocol message contained a tag with an invalid wire type.
同じような現象を報告している Issue があり、モデルが壊れていることが原因とのこと。再ダウンロードすれば解決すると紹介されています。上述した方法でモデルを再ダウンロードすると、上記のようなエラーは出力されませんでした!
参考 'InvalidProtocolBufferException' occurs when importing Tiny-YOLO v2 assets · Issue #143 · Unity-Technologies/barracuda-releaseGitHubBarracuda のインストール
最初に Barracuda を Unity のプロジェクトにインストールしましょう。Unity のバージョンが 2020.3 以上の場合は、デフォルトで Package Manager にインストールされていません。
そのため、GitHub のリポジトリ経由で、Package Manager に Barracuda を追加します。
Window
→ Package Manager
下図のように Barracuda が追加されれば成功です!
参考 barracuda-release/Installing.md at release/1.4.0 · Unity-Technologies/barracuda-releaseGitHubBarracuda でスタイル変換する流れ
Barracuda でスタイル変換する流れは以下の通りです。
全体のコード
スタイル変換する C# スクリプトは以下の通りです。コメントで解説しています。以下リポジトリを参考にしました!
参考 highnoRQ/BarracudaTestGitHubusing UnityEngine;
using Unity.Barracuda; // import 必須
public class StyleChange : MonoBehaviour
{
// Barracuda 推論用
public NNModel modelAsset;
private Model m_RuntimeModel;
private IWorker m_worker;
public RenderTexture inputTexture;
public RenderTexture outputTexture;
// Start is called before the first frame update
void Start()
{
// 学習済みモデルの読み込み
m_RuntimeModel = ModelLoader.Load(modelAsset);
// GPU 実行
var workerType = WorkerFactory.Type.Compute;
// CPU 実行
// var workerType = WorkerFactory.Type.CSharp;
// 推論エンジンの生成
m_worker = WorkerFactory.CreateWorker(workerType, m_RuntimeModel);
}
private void Update()
{
// RenderTexture → Tensor に変換
Tensor input = new Tensor(inputTexture);
// 推論の実行
m_worker.Execute(input);
// 出力結果を取得
Tensor output = m_worker.PeekOutput();
// 出力結果(Tensor)を RenderTexture に保存
// バッチサイズは 1 なので、第 2 引数は 0
// チャンネル数は 3 なので、第 3 引数は 0 or 1 or 2
// 0~255 → 0~1 にスケーリングするため、第 4 引数 は 1/255f、
// 第 5 引数 のバイアスで、色味調整が可能。今回は 0 とする
output.ToRenderTexture(outputTexture, 0, 0, 1 / 255f, 0, null);
// メモリリークを回避のため、各ステップごとに Tensor は破棄
// ※ PeekOutput で得られた Tensor の破棄は除く
input.Dispose();
}
private void OnDestroy()
{
//終了時に 推論エンジン は破棄
m_worker.Dispose();
}
}
ポイントは以下3つです!
- 最初に、学習済みモデルの読み込み → GPU or CPU の選択 → 推論エンジンの生成を行う
Tensor
のインスタンス化と、ToRenderTexture
メソッドで簡単に Tensor ↔ RenderTexture への変換が可能!- メモリリークを防ぐため、Tensor と推論エンジンは破棄する必要あり(
PeekOutput
メソッドで得られた Tensor は除く)
Unity の公式にも基本的な流れが解説されているので、併せてチェックしてみてください!
参考 Memory management | Barracuda | 1.4.0-previewUnity 公式 参考 Getting started with Barracuda | Barracuda | 1.4.0-previewUnity 公式ヒエラルキーの中身
まず Scene は下図のような構成になっています。
流れとしては、レナ嬢の画像を Quad にアタッチして表示。そして RenderTexture でレナ嬢が取得できるようにセットアップ。最終的に、スタイル変換された後の RenderTexture をもう片方の Quad に表示します!
RenderTexture について
RenderTexutre は入力用と出力用で2枚必要になります。
RenderTexture の作成方法は下図の通りです。
そして、RenderTexture のカラーフォーマットの設定をします。非常に忘れやすい設定ですが、重要なポイントです。
学習済みモデルには、入力値のフォーマットが予め決められており、推論結果も特定のフォーマットで出力されます。そのため、今回使用する学習済みモデルにあわせて、カラーフォーマットを変更しなくてはいけません。
入力と出力のフォーマットが異なると、エラーが出力されたり、思うような結果が出ないので注意しましょう。
今回の学習済みモデルにおける RenderTexture のカラーフォーマットは下図の通りです!
入力用の RenderTexture とスタイル変換のコンポーネント設定
スタイル変換のコンポーネント設定は下図のようになります。
本プロジェクトでは、スタイル変換するオブジェクトで、カメラコンポーネントでレナ嬢を綺麗に映し出すように調整した後、Target Texture
に入力用の RenderTexture をアタッチすることで、カメラ画像が RednerTexture に保存されます。
またスタイル変換のコンポーネントに、入力用と出力用の RenderTexutre と学習済みモデルをアタッチしましょう!
スタイル変換された RenderTexture の表示
スタイル変換された RenderTexture を Quad にアウトプットすれば完成です!
プロジェクトを実行した時、下図のようにスタイル変換された RenderTexture が表示されれば成功です!
最後に
以上で Barracuda を Unity に導入し、スタイル変換する方法の解説が終わりとなります。
実際に使ってみると、簡単に Unity 上でディープラーニングで学習したモデルが使用できて便利と感じました!個人的には、パフォーマンス面もチューニングされていて、使い勝手も良さそうです!!
Barracuda × Unity の参考になれば幸いです。
コメントを残す