【Unity × 機械学習】Barracuda をインストール → スタイル変換(学習済みモデル)する方法

どーも、ぐるたか@guru_takaです。

Unity ステーションで、Barracuda という Unity Technologies 製の推論エンジン(ライブラリ)が取り扱われました。


Barracuda を使えば、学習済みモデルを Unity 上で良い感じに使えるとのこと。早速、スタイル変換の学習済みモデルと Barracuda を使い、Unity 上でレナ嬢をスタイル変換しました!以下記事を参考にしています。
参考 Unity Technologies製推論エンジン Barracudaがスゴイという話Qiita

Barracudaでスタイル変換@Unity

本記事では Barracuda の導入方法や基本的な使い方、また詰まった点を、備忘録としてまとめます。Barracuda × Unity が気になる方の参考になれば幸いです!

実行環境
・Unity:2020.3.2f1
・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

注意
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-releaseGitHub

Barracuda のインストール

最初に Barracuda を Unity のプロジェクトにインストールしましょう。Unity のバージョンが 2020.3 以上の場合は、デフォルトで Package Manager にインストールされていません

そのため、GitHub のリポジトリ経由で、Package Manager に Barracuda を追加します。

STEP.1
WindowPackage Manager
window>package_manager
STEP.2
Package Manager に Barracuda を追加
add_Barracuda
STEP.3
GitHub のリポジトリ URL をコピペ

add_Barracuda_copu_paste_github_url

下図のように Barracuda が追加されれば成功です!

Barracudaインストール後

参考 barracuda-release/Installing.md at release/1.4.0 · Unity-Technologies/barracuda-releaseGitHub

Barracuda でスタイル変換する流れ

Barracuda でスタイル変換する流れは以下の通りです。

STEP.1
学習済みモデルの読み込み
STEP.2
推論エンジンの生成
STEP.3
推論の実行
入力の RenderTexture を Tensor に変換する必要あり。
STEP.4
結果の取得
得られた Tensor の結果を、RenderTexture に変換

全体のコード

スタイル変換する C# スクリプトは以下の通りです。コメントで解説しています。以下リポジトリを参考にしました!

参考 highnoRQ/BarracudaTestGitHub
StyleChange.cs
using 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 公式
MEMO
学習済みモデルによって、前処理が必要なケースがあります。使用する学習済みモデルで必要な前処理を予め確認しておきましょう!

ヒエラルキーの中身

まず Scene は下図のような構成になっています。

rendertexture_image_Barracuda

流れとしては、レナ嬢の画像を Quad にアタッチして表示。そして RenderTexture でレナ嬢が取得できるようにセットアップ。最終的に、スタイル変換された後の RenderTexture をもう片方の Quad に表示します!

RenderTexture について

RenderTexutre は入力用と出力用で2枚必要になります。

2枚のrendertexture

RenderTexture の作成方法は下図の通りです。

rendertexture_create

そして、RenderTexture のカラーフォーマットの設定をします。非常に忘れやすい設定ですが、重要なポイントです。

学習済みモデルには、入力値のフォーマットが予め決められており、推論結果も特定のフォーマットで出力されます。そのため、今回使用する学習済みモデルにあわせて、カラーフォーマットを変更しなくてはいけません

入力と出力のフォーマットが異なると、エラーが出力されたり、思うような結果が出ないので注意しましょう

今回の学習済みモデルにおける RenderTexture のカラーフォーマットは下図の通りです!

入力用の RenderTexture
input_rendertexture_color_format
出力用の RenderTexture
output_rendertexture_color_format
MEMO
いわゆる前処理(推論する前の下準備)に該当する部分と思ってください!

入力用の RenderTexture とスタイル変換のコンポーネント設定

スタイル変換のコンポーネント設定は下図のようになります。

endertexture_asset_style_transfer

本プロジェクトでは、スタイル変換するオブジェクトで、カメラコンポーネントでレナ嬢を綺麗に映し出すように調整した後、Target Texture に入力用の RenderTexture をアタッチすることで、カメラ画像が RednerTexture に保存されます。

またスタイル変換のコンポーネントに、入力用と出力用の RenderTexutre と学習済みモデルをアタッチしましょう!

スタイル変換された RenderTexture の表示

スタイル変換された RenderTexture を Quad にアウトプットすれば完成です!
rendertexture_output

プロジェクトを実行した時、下図のようにスタイル変換された RenderTexture が表示されれば成功です!

Barracudaでスタイル変換@Unity

最後に

以上で Barracuda を Unity に導入し、スタイル変換する方法の解説が終わりとなります。

実際に使ってみると、簡単に Unity 上でディープラーニングで学習したモデルが使用できて便利と感じました!個人的には、パフォーマンス面もチューニングされていて、使い勝手も良さそうです!!

Barracuda × Unity の参考になれば幸いです。

参考リンク

参考 Unity Technologies製推論エンジン Barracudaがスゴイという話Qiita 参考 Unityの推論エンジン『Barracuda』を試してみたのでそのメモe.blog 参考 Unity Barracuda - ニューラルネットワーク推論ライブラリ|npakanote 参考 Getting started with Barracuda | Barracuda | 1.4.0-previewUnity 公式

コメントを残す