HoloLab DNN Packagesを利用してUnityでオブジェクト検出の推論を実装する

概要

HoloLab DNN PackagesというUnity Sentisをベースにしたディープラーニングによる画像認識を実装したパッケージを公開しました。 この記事ではHoloLab DNN Packagesを利用したオブジェクト検出の推論をUnityアプリに組み込む方法を紹介します。

blog.hololab.co.jp

オブジェクト検出

学習済みモデルの準備

HoloLab DNN Packagesのオブジェクト検出パッケージではYOLOXを利用することができます。

YOLOXは精度と速度のバランスに優れたオブジェクト検出モデルです。 公式実装のリポジトリも学習、推論、エクスポートの使い勝手がよく整備されています。 商用で扱いやすいライセンスなこともあり、現在も広く利用されている印象です。

github.com

Unity SentisをベースにしたHoloLab DNN PackagesではONNXフォーマットの学習済みモデルが利用できます。 YOLOXの学習済みモデルをONNXにエクスポートして利用してください。

github.com

パッケージのインポート

Unityのメニューから[Window]>[Package Manager]を開きます。 Package Managerの左上にある[+]>[Add package from git URL]から以下のURLを入力して[Add]ボタンを押します。 ここではHoloLab DNN Packagesのうち「基本パッケージ」と「オブジェクト検出パッケージ」の2つをインポートしていきます。

  1. 基本パッケージ

    まずは基本パッケージをインポートします。

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

    基本パッケージのインポート

  2. オブジェクト検出パッケージ

    次にオブジェクト検出パッケージをインポートします。

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

    オブジェクト検出パッケージのインポート

これで準備は完了です。

クラス分類の推論を実装

それではHoloLab DNN Packagesを利用してオブジェクト検出の推論を実装していきます。

  1. 名前空間を参照する

    Unity SentisとHoloLab DNN Packagesの名前空間を参照します。 ここではオブジェクト検出を利用するのでHoloLab.DNN.ObjectDetectionを参照しています。

     using Unity.Sentis;
     using HoloLab.DNN.ObjectDetection;
    
  2. クラスを生成する

    オブジェクト検出のObjectDetectionModel_YOLOXクラスを生成します。 2つのコンストラクタが用意されています。 インスペクタから学習済みモデルをアタッチする場合は前者、ファイルパスから読み込む場合は後者を利用します。

     // for Asset
     [SerializeField] private ModelAsset model_asset = default;
     var model = new ObjectDetectionModel_YOLOX(model_asset);
    
     // for File Path
     [SerializeField] private string model_path = "./model.onnx";
     var model = new ObjectDetectionModel_YOLOX(model_path);
    
  3. 画像を準備する

    Texture2Dクラスで入力画像を準備します。 WebCamTextureTexture2D.LoadImage()などお好みの方法で取得します。

     // e.g. Load Image
     var data = File.ReadAllBytes("./image.jpg");
     var texure = new Texture2D(1, 1);
     texture.LoadImage(data);
    
  4. オブジェクトを検出する

    モデルと画像が用意できたらオブジェクトを検出します。

    ObjectDetectionModel_YOLOX.Detect()に画像と信頼度の閾値、IoUの閾値を与えます。 オブジェクト(位置と大きさ、クラスの番号、信頼度)のリストを得ることができます。

     // Detect Objects
     var score_threshold = 0.6f;
     var iou_threshold = 0.4f;
     var objects = model.Detect(texture, score_threshold, iou_threshold);
    
  5. オブジェクトを描画する

    検出されたオブジェクトは目的に合わせて利用できます。 ここでは簡易的にバウンディングボックスを可視化することにします。

    オブジェクト検出パッケージでは画像が描画されているUnity UIにバウンディングボックスを描画する簡易可視化クラスを提供しています。 Raw ImageなどのUnity UIオブジェクトに描画された画像の上に色付きのPanelでバウンディングボックスを表現して描画します。

     // e.g. Generate Random Colors List
     var num_classes = 80;
     var colors = Visualizer.GenerateRandomColors(num_classes);
    
     // e.g. All Clear and Draw Objects on Unity UI
     Visualizer.ClearBoundingBoxes(ui_object);
     objects.ForEach(o => Visualizer.DrawBoudingBox(ui_object, o.rect, colors[o.class_id]));
    

まとめ

Unityで簡単にディープラーニングによる画像認識を実装できるHoloLab DNN Packagesを利用してオブジェクト検出の実装方法を紹介しました。 Unityアプリにディープラーニングによる画像認識を使った機能を組み込んで遊んでみてください。