概要
HoloLab DNN PackagesというUnity Sentisをベースにしたディープラーニングによる画像認識を実装したパッケージを公開しました。 この記事ではHoloLab DNN Packagesを利用したオブジェクト検出の推論をUnityアプリに組み込む方法を紹介します。
学習済みモデルの準備
HoloLab DNN Packagesのオブジェクト検出パッケージではYOLOXを利用することができます。
YOLOXは精度と速度のバランスに優れたオブジェクト検出モデルです。 公式実装のリポジトリも学習、推論、エクスポートの使い勝手がよく整備されています。 商用で扱いやすいライセンスなこともあり、現在も広く利用されている印象です。
Unity SentisをベースにしたHoloLab DNN PackagesではONNXフォーマットの学習済みモデルが利用できます。 YOLOXの学習済みモデルをONNXにエクスポートして利用してください。
パッケージのインポート
Unityのメニューから[Window]>[Package Manager]を開きます。 Package Managerの左上にある[+]>[Add package from git URL]から以下のURLを入力して[Add]ボタンを押します。 ここではHoloLab DNN Packagesのうち「基本パッケージ」と「オブジェクト検出パッケージ」の2つをインポートしていきます。
基本パッケージ
まずは基本パッケージをインポートします。
https://github.com/HoloLabInc/HoloLabDnnPackages.git?path=packages/jp.co.hololab.dnn.base
オブジェクト検出パッケージ
次にオブジェクト検出パッケージをインポートします。
https://github.com/HoloLabInc/HoloLabDnnPackages.git?path=packages/jp.co.hololab.dnn.objectdetection
これで準備は完了です。
クラス分類の推論を実装
それではHoloLab DNN Packagesを利用してオブジェクト検出の推論を実装していきます。
名前空間を参照する
Unity SentisとHoloLab DNN Packagesの名前空間を参照します。 ここではオブジェクト検出を利用するので
HoloLab.DNN.ObjectDetection
を参照しています。using Unity.Sentis; using HoloLab.DNN.ObjectDetection;
クラスを生成する
オブジェクト検出の
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);
画像を準備する
Texture2D
クラスで入力画像を準備します。WebCamTexture
やTexture2D.LoadImage()
などお好みの方法で取得します。// e.g. Load Image var data = File.ReadAllBytes("./image.jpg"); var texure = new Texture2D(1, 1); texture.LoadImage(data);
オブジェクトを検出する
モデルと画像が用意できたらオブジェクトを検出します。
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);
オブジェクトを描画する
検出されたオブジェクトは目的に合わせて利用できます。 ここでは簡易的にバウンディングボックスを可視化することにします。
オブジェクト検出パッケージでは画像が描画されている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アプリにディープラーニングによる画像認識を使った機能を組み込んで遊んでみてください。