コンテンツにスキップ

ONNX モデル(試験中)

この章は試験中です。 学習済みのモデルを、実行時に読み込むのではなくコンパイルの時点でコードへ焼き込みます(読み込む処理も、同時に配布するファイルも不要です)。

属性計算する場所結果書き方
[Onnx("…")]Udon数として読み出せます。小さいモデル向けですUdon で計算する ONNX モデル(試験中)
[OnnxGpu("…")]GPUはるかに大きいモデルを扱えますが、結果はバッファに出るので、数として使うには読み戻しが 1 段いりますGPU で計算する ONNX モデル(試験中)

ジェスチャの判定のように値を読んで分岐するなら前者、絵を作り替えるようにそのまま画面へ出すなら後者を選びます。

モデルのファイル名先頭に付く名前
gesture.onnxGesture
hand_pose.onnxHandPose

下線と拡張子は落ちます。

  1. 書き出した .onnx を、属性を書くスクリプトと同じフォルダへ置きます
  2. クラスに partial を付け、属性だけを書いて保存します
  3. Unity へ戻るとインポートが実行され、スクリプトの隣に生成されたファイルが現れます
  4. 生成された名前を使う処理を書きます
同時に書いたとき手順 2 と 4 を 1 度に書くと、生成される名前がまだ無いためコンパイルのエラーになります
エラーになったとき前に生成したファイルと重みのテクスチャは残り、隣に Judge.Gesture.Failed.Model.cs のような小さなファイルが書かれます。その中の #error 1 件が理由を示してコンパイルを止めるので、前の重みのまま実行されることも、アップロードされることもありません。モデルを直すか属性を削除すると、このファイルは消えます(一度も生成できていないモデルには前のファイルが無いので、生成される名前を使う処理もエラーになります)
モデルを差し替えたとき手順 3 が自動でやり直され、要素数の定数も新しい値になります
Safe Mode を尋ねられたとき生成されたファイルが無い(同時に書いた・手で消したなど)と、起動したときにコンパイルのエラーになり、Safe Mode に入るかを尋ねられます。Ignore を選ぶと、読み込みが終わったところでファイルが生成され、コンパイルが通ります
名前スクリプトとモデルの名前をつないだものです。Judge.cs に gesture.onnx の属性を書くと Judge.Gesture.Model.cs になります
配置先属性を書いたスクリプトと同じフォルダです
モデルの探し先属性に書いた経路を、スクリプトの隣・プロジェクトのフォルダの順に探します
再生成スクリプトかモデルのどちらかが変わると生成し直され、属性を削除すると消えます。手で編集しないでください。
大きさ重みがそのままコードになるので、重みの数より多い行数になり、コンパイルのたびに全部読まれます
記述の順序属性と、生成される名前を使う処理を同時に書くとコンパイルのエラーになります。先に属性だけを保存してください。
演算受け取る演算と、その条件はONNX モデルの演算(試験中)にあります。そこに無い演算を含むモデルは、コンパイルの時点でエラーになります
層の順モデルの層は実行する順に並んでいなくてもかまいません(元の実行環境と同じく、変換が並べ直します)。互いの出力を輪になって読む層はそのように並べられないので、層を示してエラーになります(元の実行環境もそのようなモデルをエラーにします)

元のモデルと同じ結果になるとは限りません。8 ビットへ量子化する時点で値が丸まり、半精度で運ぶ値は GPU が半精度で格納するときの丸め方(PC のグラフィックスカード 1 台で測ると、0 の方向への切り捨て)に従うので、書き出し元の実行環境で計算した値とはその分だけ違います(実数のモデルでは 16 ビットへ丸める分です)。