Unity Sentisでディープラーニングによる画像認識を実装したパッケージを公開しました

概要

Unity Sentisをベースにしたディープラーニングによる画像認識を実装したパッケージを公開しました。 UPMパッケージになっているのでUnityのプロジェクトに簡単に取り込むことができます。 画像認識はクラス分類(一般的なクラス分類モデル)、オブジェクト検出(YOLOX)などが実装されています。

blog.hololab.co.jp

クラス分類
オブジェクト検出

Unity Sentis

Unity SentisはUnity Technologiesが公開しているディープラーニングの推論ライブラリです。 以前から提供されていたUnity Barracudaの後継ライブラリとなります。

一般にライブラリを利用する場合はターゲットのプラットフォームに合わせてライブラリをビルドする必要があるなどデプロイが大変なことがあります。 特にマイナーなプラットフォームの場合はビルドが非常に困難であったり対応が実質不可能なことも多いです。

Unityで作成したアプリは様々なプラットフォーム(PC、iOS、Android、HoloLens 2、Magic Leap 2など)にデプロイできます。 SentisはUnityが対応するプラットフォームであれば基本的にはすべてのプラットフォームにデプロイすることができるのが魅力の一つです。

Unity Sentisではディープラーニングで広く利用されているONNXフォーマットの学習済みモデルを利用します。 Unity SentisはUnity Barracudaよりも多くのレイヤーをサポートしているため様々なモデルの推論が実行できるでしょう。

unity.com

Unity Sentisの特徴

HoloLab DNN Packages

HoloLab DNN PackagesはUnity Sentisをベースにしたディープラーニングによる画像認識を実装したパッケージです。 UPMパッケージになっているのでUnityのPackage ManagerでURLを入力することで簡単に取り込むことができます。 画像認識はクラス分類(一般的なクラス分類モデル)とオブジェクト検出(YOLOX)が実装されています。今後追加していく予定です。

HoloLab DNN PackagesはGitHubでOSSとして公開されています。 ライセンスはMIT Licenseで商用利用でも扱いやすくなっていると思います。

GitHub - HoloLabInc/HoloLabDnnPackages: The HoloLab DNN Packages providing image recognition library using deep learning running on the Unity. This packages is implemented based on Unity Sentis.

HoloLab DNN Packages

■ パッケージのインポート

Unityのメニューから[Window]>[Package Manager]を開きます。 Package Managerの左上にある[+]>[Add package from git URL]から以下のURLを入力します。

パッケージのインポート

現在、HoloLab DNN Packagesはベースとなる1つのパッケージと画像認識のタスクが実装されたいくつかのパッケージを公開しています。 それぞれのタスクのパッケージはベースのパッケージに依存するので、ベースのパッケージも必ずインポートしてください。

  • jp.co.hololab.dnn.base
    Unity Sentisを利用した推論のベースになる処理がまとめられているクラスを提供します。それぞれのタスクのパッケージはjp.co.hololab.dnn.baseに依存しています。*1

    *1 現在はPyTorchフォーマット([0.0-1.0]または[0.0-255.0]、NCHWのテンソル)の入力を持つモデルのみ対応

      https://github.com/HoloLabInc/HoloLabDnnPackages.git?path=packages/jp.co.hololab.dnn.base
    
  • jp.co.hololab.dnn.classification
    クラス分類を実装したクラスを提供します。 画像を入力してTop-1/Top-kのクラスの番号と信頼度を出力します。 MobileNetEfficientNetなど一般的なクラス分類モデルをサポートしています。

      https://github.com/HoloLabInc/HoloLabDnnPackages.git?path=packages/jp.co.hololab.dnn.classification
    
  • jp.co.hololab.dnn.objectdetection
    オブジェクト検出を実装したクラスを提供します。 画像を入力してオブジェクトの位置と種類を出力します。 YOLOXのオブジェクト検出モデルをサポートしています。

      https://github.com/HoloLabInc/HoloLabDnnPackages.git?path=packages/jp.co.hololab.dnn.objectdetection
    

■ パッケージの設定

この設定はエディタ拡張により自動的に適用されます!

HoloLab DNN Packagesの内部で利用しているシェーダーをアプリのビルドに含める設定を行います。 HoloLab DNN Packagesを利用したアプリのビルドの前に必ずこの設定を行ってください。 PreProcess.shaderはjp.co.hololab.dnn.baseパッケージに含まれています。

  1. [Edit]>[Project Settings]
  2. [Graphics]>[Always Included Shaders]
  3. Always Included Shadersのsizeを1つ増やす
  4. PreProcess.shader(BaseModel/PreProcess)を設定する

Always Included Shadersの設定

■ サンプルのインポート

クラス分類やオブジェクト検出などのパッケージではサンプルを提供しています。 Package Managerの[Samples]からImportボタンを押すことでUnityプロジェクトに取り込まれます。
サンプルはそれぞれのパッケージを利用した画像を入力とする推論です。 ボタンを押すだけで推論を実行でき簡単に動かすことができます。
まずはサンプルを動かして遊んでみてください。

サンプルシーンのインポート
サンプルシーン

■ クラス分類の使い方

クラス分類の使い方を簡単に紹介します。 ほとんどの必要な処理はパッケージで提供されているクラスの中で実装されているため、ユーザーは数行のコードを書くだけで利用できます。

  1. クラスが実装されている名前空間をインポートする

     // 名前空間をインポートする
     using HoloLab.DNN.Classification;
    
  2. クラスのインスタンスを生成する

     // クラス分類モデルクラスのインスタンスを生成する
     var model = new ClassificationModel("./weights.onnx");
    
  3. 画像を入力してクラスIDと信頼度を取得する

     // クラスIDと信頼度を取得する
     (var class_id, var score) = model.Classify(texture);
    

クラス分類のサンプルシーンの実行結果

■ オブジェクト検出の使い方

オブジェクト検出の使い方を簡単に紹介します。 こちらもほとんどの必要な処理はパッケージで提供されているクラスの中で実装されているため、ユーザーは数行のコードを書くだけで利用できます。 UnityのUI(RawImageなど)でオブジェクトの位置や種類を可視化する簡易的なビジュアライゼーションクラスも提供しています。

  1. クラスが実装されている名前空間をインポートする

     // 名前空間をインポートする
     using HoloLab.DNN.ObjectDetection;
    
  2. クラスのインスタンスを生成する

     // オブジェクト検出モデルクラスのインスタンスを生成する
     var model = new ObjectDetectionModel_YOLOX("./weights.onnx");
    
     // 可視化クラスのインスタンスを生成する
     var colors = Visualizer.GenerateRandomColors(num_classes);
    
  3. 画像を入力してオブジェクトの種類と位置のリストを取得する

     // オブジェクトのリストを取得する
     var score_threshold = 0.6f;
     var iou_threshold = 0.4f;
     var objects = model.Detect(texture, score_threshold, iou_threshold);
    
  4. オブジェクトを可視化する

     // バウンディングボックスを描画する
     Visualizer.ClearBoundingBoxes(raw_image);
     objects.ForEach(o => Visualizer.DrawBoudingBox(raw_image, o.rect, colors[o.class_id]));
    

オブジェクト検出のサンプルシーンの実行結果

まとめ

Unityで簡単にディープラーニングによる画像認識を実装できるHoloLab DNN Packagesを紹介しました。 Unityアプリにディープラーニングによる画像認識を使った機能を組み込んで遊んでみてください。