自己紹介
CyberAgentの26卒ゲームクライアントエンジニアとして内定を頂いています海道敦也(@kaidoatsuya)です。
最近はUnity Sentisを触っているものの、なかなかうまく動いてくれないですw
本記事について
この記事はCyberAgent 26th Fresh Engineer's Advent Calendar 2024の24日目です。
本アドベントカレンダーは、サイバーエージェント26卒の有志がお送りするものです。
あくまで有志での開催となります。楽しんでいってください!
Unity Senitsについて
Unity SentisとはUnity公式が提供するランタイムでAIモデルを動かすUnityパッケージです。
実態はテンソル(n次元の行列のようなもの)演算を行うライブラリです。
ONNXファイルに対応しており、Unity用に最適化するSentisファイルというものに変換できます。
ONNXについて
ONNXは汎用的なAIモデルを表現するフォーマットです。
ONNXを拡張する
Unity Sentigsでは画像を入力データとしてテンソル(Tensor)に変換するときにRGBを0-1の値として生成します。
一方、一部のモデルでは入力データがRGBの値が0-255である必要があります。
こういったときにONNXを拡張する、もしくはONNXなしでモデルを簡易的に作る必要があります。
公式ドキュメントには、出力を変更するサンプルコードが掲載されていますが、入力を変更するコードは存在しません。
今回は入力を変更するコードを基にSentisの演算プロセスの構築方法を見ていきます。
主要なクラス
モデルの拡張や作成に使うクラスは2つあります。FunctionalGraph
とFunctional
というクラスです。
FunctionalGraph
これは構造全体を構築するクラスです。
このクラスが最終的なアウトプットを出力してくれます。
Functional
これはどのような演算をするのか指定する静的クラスです。
掛け算だとか、キャストなどが静的なメソッドを呼び出して構造を作っていきます。
実際のコード
言葉では上手く理解できないと思うので、ソースコードです。
public void CreateRGB255()
{
// FunctionalGraphのインスタンスを生成
var graph = new FunctionalGraph();
// 1. インプットを追加(Shapeはモデルに合わせて作成)
var input = graph.AddInput(DataType.Float, new DynamicTensorShape(1, -1, -1, 3));
// 2. 255で乗算する
var rgb255 = Functional.Mul(input, Functional.Constant(255.0f));
// 3. Intにキャスト
var castInt = Functional.Int(rgb255);
// 4. モデルをコンパイル
var newModel = graph.Compile(castInt);
// モデルを保存(Sentisファイルとして出力されます。)
ModelWriter.Save($"{Application.dataPath}/Onnx/ToRGB255.sentis", newModel);
Debug.Log("Saved the new model.");
}
FunctionalGraphとFunctionalの静的なメソッドから来る引数の関係が極めて分かりにくいですが、このような形です。
実際の処理・解説
デバッカーを用いて、どのような処理となっているのか自分なりに考察しました。
- インプットを追加
-
input
は入力だけを持ちます
-
- 255で乗算する
-
rgb255
は入力と乗算するという構造を持ちます
-
- Intにキャスト
-
castInt
は入力と乗算とキャストという構造を持ちます
-
- モデルをコンパイル
-
castInt
は今までの構造すべてを持っているため、これをコンパイルすればOK!
-
おまけ
ちなみに、DynamicTensorShape
という記述がありますが、これは動的な形状の入力です。
-1に値を設定したときはどのようなサイズの配列(厳密に言うと配列ではない?)がそこに入ってきてもOK!になります。
まとめ
公式ドキュメントにもあるものの、分かりにくいところを記事にしてみました!
もう少しFunctionalGraph
とFunctional
の関係性が分かりやすければ良いなぁと思うばかりです。
おわりに
CyberAgent 26th Fresh Engineer's Advent Calendar 2024もそろそろ終わりですね!
それでは、さようなら!
ほかの記事も見てね~