MR and Azure 310:物体検出

こんにちは、ナレコム菅井です。

今回はMR and Azure 310のアプリを作っていきます。

開発環境は以下の通りです。
・Windows
・Unity 2017.4.11f1
・Visual Studio 2017
・HoloLens

0.準備


まずはじめに、画像を学習させます。

1. Custom Vision Serviceにログインします。
[はじめる]をクリックします。

[SIGN IN]をクリックします。

2. 新しいプロジェクトを作ります。[NEW PROJECT]をクリックします。

3. 新しいプロジェクトに関する情報を入力していきます。今回はObject Detectionなので、[Object Detection]を選択し、[Create project]をクリックします。

4. 学習させるため、新しいタグを作ります。今回はカップを学習させるためタグの名前をCupとし[保存]します。保存し終わった後、新しくタグが追加されているのがわかります。

5. 画像をアップしていきます。[Add images]をクリックします。カップの画像15枚以上を学習させます。


6. アップした画像にタグをつけていきます。画像の上でクリックするとタグがつけられます。全ての画像に関してタグ付けを行っていきます。

タグ付けされたカップが26枚となりました。

7. 全ての画像にタグをつけ終わったら、[Train]をクリックします。

8. Trainが終了したら、[Performance]を開きます。[Make default]をクリックした後、[Prediction URL]を開きます。Prediction URLとPrediction Keyがあるのがわかります。これは後ほど使うのでメモしておきます。


1.Unityの設定


続いてUnityの設定を行っていきたいと思います。以下の手順で進めていきましょう。

1.Unityを開き、[New]から新しいプロジェクトをつくる。
名前をCustomVisionObjDetectionとして、[Create project]をクリックします。

2. [Build Settings..]からさまざまな項目を編集していく。
[File]->[Build Settings..]を開きます。

a.プラットフォームの変更
[PC, Mac & Linux Standalone]を[Universal Windows Platform]に変更し、[Switch Platform]をクリックします

b.[Player Settings..]を編集する
[Player Settings..]をクリックします。

そのあと[Other Settings]、[Publishing Settings]->[Capabilities]、[XR Settings]を以下のように設定してきます。


続いて、[Unity C#]にチェックを入れます。

[Build Settings..]の変更は以上です。

4. Azure-MR-310 packageパッケージのインポート。
まず、Azure-MR-310.packageをダウンロードします。[Assets]->[Import Package]->[Custom Package]をクリックします。ダウンロードしたAzure-MR-310 packageをフォルダの中から探し選択し、[Import]をクリックします。このパッケージの中に、必要なシーンなどが揃っています。


Importが終わったら、シーンをObjDetectionSceneに切り替えます。

5. [Edit]->[Project Settings]->[Graphics]の[Inspector]を編集していきます。

デフォルトでは[Size]が6になっているかと思うので9に変更します。

2.スクリプトの作成


ここでは以下の6つのスクリプトを作っていきたいと思います。
・CustomVisionAnalyser
・CustomVisionObjects
・SpatialMapping
・GazeCursor
・SceneOrganiser
・ImageCapture

まず、すべてのスクリプトをまとめておくフォルダーを作成します。[Project]->[Create]をクリックし、[Folder]を選択して新しいフォルダーを作ります。名前をScriptsとします。続いて[Project]->[Create]->[C# Script]をクリックし、クラス名をつけていきます。

・CustomVisionAnalyser
このクラスは、撮影された最新の画像の情報をAzure Custom Visionに送信し、その結果を受信して他クラスに渡す役割を担います。コードは以下の通りです。ここで0.準備で取得したPrediction URLとPrediction Keyを使いますので–Insert yourからはじめる文に適切に入れていきます。

・CustomVisionObjects
このスクリプトは、他のクラスがAzure Custom Visionとのやりとりの際にシリアライズ化やデシリアライズ化するためのクラスをひとまとめにしたものです。コードは以下の通りです。

・SpatialMapping
このクラスはカーソルとなるキューブと現実世界の衝突を検知し、キューブの大きさを適切に保つためのスクリプトです。コードは以下の通りです。

・GazeCursor
このクラスはカーソルが現実世界で適切な場所にあるように調整するクラスです。コードは以下の通りです。

・SceneOrganiser
このクラスは、オブジェクトをメインカメラ内に適切に配置したり、Azure Custom Visionからの結果に合わせて適切にラベルを表示したりするためのクラスです。コードは以下の通りです。

・ImageCapture
このクラスは、HoloLensで画像をキャプチャしたり、ユーザーのジェスチャーを処理したりするためのクラスです。

全てのコードを記述し終わったら、それらが正しく機能するようにアタッチしていきます。

1. [Hierarchy]->[Main Camera]の[Inspector]->[Add Component]からSceneOrganiserを検索し、選択してダブルクリックします。

2. 今追加した[Main Camera]の[Inspector]->[Scene Organiser]->[Label]に[Project]->[Prefabs]->[Label]をD&Dします。

3. [Main Camera]->[GazeCursor]の[Inspector]->[Add Componet]からGazeCursorを検索し、選択してダブルクリックします。

4. [Main Camera]->[SpatialMapping]の[Inspector]->[Add Componet]からSpatialMappingを検索し、選択してダブルクリックします。

3.ビルド


[File]->[Build Settings..]->[Add Open Scene]とし、シーンを追加します。

続いて[File]->[Build Settings..]->[Build]の順に選択します。新しいフォルダー(App)を作ります。このフォルダーを選択し、保存します。

この後の手順についてはこちらを参照してください。

HoloLensで実行した時の様子です。カップに視線を合わせエアタップすると、カップと認識することができました。

以上となります。 お疲れ様でした。

この記事を書いた人

azure-recipe-user