LoginSignup
51
29

More than 3 years have passed since last update.

Unity Technologies製推論エンジン Barracudaがスゴイという話

Last updated at Posted at 2020-07-02

概要

2020年5月12日のML-Agents正式版公開に伴い、
ML-Agentsで利用されている推論エンジンのBarracudaが正式公開されたのでテストした所
導入および実施がありえない程簡単だったので記事にしました

Unity Technologies 公式ブログ

実施内容

以前実施した画像分類モデルに加え、画風変換モデルをテストしました。

1.画像分類

空間内に配置した写真をUnityのカメラで撮影し、画像分類モデルで判定を行いました
sc.PNG

結果は次のようになりました

malchese.PNG
Maltese dog

convertible.PNG
convertible(オープンカー)
見た限り、正しく分類できていそうです。

使用したモデルは次の通りです

画像分類
モデル名 VGG-19
入力 224×224×3
出力 1000
データセット ImageNet (ILSVRCA2012)

2.画風変換

画像分類同様、空間内に配置した写真をUnityのカメラで撮影し、画風変換モデルを適用したものを表示しました

candy.PNG
イラスト風

mosaic.PNG
ステンドグラス風
シェーダーみたいに使えたら面白そうですね

画風変換
モデル名 Fast Neural Style Transfer
入力 224×224×3
出力 224×224×3
データセット COCO 2014 Training images dataset

学習済みモデルの配布元

上で示した通り、Unity上で学習済みモデルを推論できることが分かりました。
次から実施方法について解説します。

導入方法

1. PackageMangerを開き、Barracudaをインストールします。

マネージャー.PNG
barracuda.PNG

2. スクリプトを作成し、Unity.Barracudaをインポートします。
3. NNModelをPublic変数で定義します
using UnityEngine;
using UnityEngine.UI;
using Unity.Barracuda;  // <- 2.

public class Classification : MonoBehaviour
{
    //  Barracuda 推論用
    public NNModel modelAsset;  // <- 3.
    private Model m_RuntimeModel;
    private IWorker m_worker;
4. 適当なオブジェクトにスクリプトを追加し、InspectorからONNXファイル(学習済みモデル)をアタッチします。

barracuda.PNG

5. モデルをロードし、推論を実行するワーカーを作成します
    void Start()
    {
        m_RuntimeModel = ModelLoader.Load(modelAsset);
        m_worker = WorkerFactory.CreateWorker(WorkerFactory.Type.Compute, m_RuntimeModel);
    }

CPU・GPUの使用はここで決定します。
Workerのタイプ

6. ProjectタブからRenderTextureを作成します

barracuda.PNG

7. Hierarchyからカメラを作成し、出力先を先ほど作成したRenderTextureにします

barracuda.PNG
barracuda.PNG

8. 作成したRenderTextureをスクリプトにアタッチし、次のようなコードで推論を実行します
   Tensor input = new Tensor(targetTexture); 

   m_worker.Execute(input);
   Tensor output = m_worker.PeekOutput();

 入力はRenderTextureから直接作成できます!!
 以前実施した際には前処理が色々面倒だったのでここだけでも使う価値があると思います。

9. 出力は次のような形で取り出せます
  output.ToReadOnlyArray();  //floatの配列で取得する

  output.ToRenderTexture(outputTexture, 0, 0, 1/255f, 0, null);  //RenderTextureに直接出力

※Tensor及びworkerは処理が終了したタイミングで破棄する必要があります

  private void Update()
  {
      Tensor input = new Tensor(inputTexture); 
      Inference(input);

      input.Dispose(); //処理が終わったタイミングで破棄
  }

  private void OnDestroy()
  {
      m_worker.Dispose(); //終了時に破棄する
  }

まとめ

今回のポイント

  • 入力が簡単
  • モデルをUnity上で管理できる
  • RenderTextureに直接出力できる

さすが公式の実装だけあって以前と比べてかなり簡単に実施できるようになっていました。
Unityはスマートフォンアプリへの出力にも対応しているので、ARアプリの作成等にも使っていけそうです。

リンク

公式ドキュメント
今回のコード

51
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
29