Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9551

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

$
0
0

概要

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変数で定義します
usingUnityEngine;usingUnityEngine.UI;usingUnity.Barracuda;// <- 2.publicclassClassification:MonoBehaviour{//  Barracuda 推論用publicNNModelmodelAsset;// <- 3.privateModelm_RuntimeModel;privateIWorkerm_worker;
4. 適当なオブジェクトにスクリプトを追加し、InspectorからONNXファイル(学習済みモデル)をアタッチします。

barracuda.PNG

5. モデルをロードし、推論を実行するワーカーを作成します
voidStart(){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をスクリプトにアタッチし、次のようなコードで推論を実行します
Tensorinput=newTensor(targetTexture);m_worker.Execute(input);Tensoroutput=m_worker.PeekOutput();

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

9. 出力は次のような形で取り出せます
output.ToReadOnlyArray();//floatの配列で取得するoutput.ToRenderTexture(outputTexture,0,0,1/255f,0,null);//RenderTextureに直接出力

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

privatevoidUpdate(){Tensorinput=newTensor(inputTexture);Inference(input);input.Dispose();//処理が終わったタイミングで破棄}privatevoidOnDestroy(){m_worker.Dispose();//終了時に破棄する}

まとめ

今回のポイント

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

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

リンク

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


Viewing all articles
Browse latest Browse all 9551

Trending Articles