概要
2020年5月12日のML-Agents正式版公開に伴い、
ML-Agentsで利用されている推論エンジンのBarracudaが正式公開されたのでテストした所
導入および実施がありえない程簡単だったので記事にしました
実施内容
以前実施した画像分類モデルに加え、画風変換モデルをテストしました。
1.画像分類
空間内に配置した写真をUnityのカメラで撮影し、画像分類モデルで判定を行いました
結果は次のようになりました
convertible(オープンカー)
見た限り、正しく分類できていそうです。
使用したモデルは次の通りです
画像分類 | |
---|---|
モデル名 | VGG-19 |
入力 | 224×224×3 |
出力 | 1000 |
データセット | ImageNet (ILSVRCA2012) |
2.画風変換
画像分類同様、空間内に配置した写真をUnityのカメラで撮影し、画風変換モデルを適用したものを表示しました
画風変換 | |
---|---|
モデル名 | Fast Neural Style Transfer |
入力 | 224×224×3 |
出力 | 224×224×3 |
データセット | COCO 2014 Training images dataset |
上で示した通り、Unity上で学習済みモデルを推論できることが分かりました。
次から実施方法について解説します。
導入方法
1. PackageMangerを開き、Barracudaをインストールします。
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ファイル(学習済みモデル)をアタッチします。
5. モデルをロードし、推論を実行するワーカーを作成します
void Start()
{
m_RuntimeModel = ModelLoader.Load(modelAsset);
m_worker = WorkerFactory.CreateWorker(WorkerFactory.Type.Compute, m_RuntimeModel);
}
CPU・GPUの使用はここで決定します。
Workerのタイプ
6. ProjectタブからRenderTextureを作成します
7. Hierarchyからカメラを作成し、出力先を先ほど作成したRenderTextureにします
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アプリの作成等にも使っていけそうです。