実機なしでMR and Azure 3XXぜんぶやーる

[HoloLens Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hololens)の25日目の記事です。
[Mixed Reality Academy](https://docs.microsoft.com/en-us/windows/mixed-reality/academy)の301～313までを[Mixed Reality Toolkit](https://github.com/Microsoft/MixedRealityToolkit-Unity)を用いて、実装しました。（今回は301～305まで公開、今年中に更新予定）もちろん、**実機なし**でもできます！

## 開発環境
- HoloLens RS5（日本語）
- Visual Studio 2017（15.9.2）
- Unity 2017.2.2p2
- [HoloToolkit-Unity-2017.4.2.0.unitypackage](https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/download/2017.4.2.0/HoloToolkit-Unity-2017.4.2.0.unitypackage)
- [HoloToolkit-Unity-Examples-2017.4.2.0.unitypackage](https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/download/2017.4.2.0/HoloToolkit-Unity-Examples-2017.4.2.0.unitypackage)

ソースコードは[こちら](https://github.com/SatoshiRobatoFujimoto/MRAzure3XX.git)。
ゼロから作りたい人は、301～304までだったら[20181121 - ガチラボvol.10 資料](https://www.facebook.com/download/507840373049823/20181121%20-%20%E3%82%AC%E3%83%81%E3%83%A9%E3%83%9Cvol10.pdf?hash=AcrYXHEo-vyl_fve)を読んでください。

## [MR and Azure 301: Language translation](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-301)
HoloLensのマイクで拾った音声をテキスト化し、Translator Text APIを用いて、言語翻訳します。
音声入力はOSの言語に依存するので注意してください。

1．Translator Text APIの作成、Keyをメモる
2．Translator.csの17行目`authorizationKey`にメモったKeyを入れる
3．実行
「こんにちは」と言うと、結果がフランス語で「Salut」と返ってきました。言語の設定はTranslator Manager->Translator(Script)のInspectorビューから変更できます。フランス語、イタリア語、韓国語、英語、日本語に対応しています。
<img width="419" alt="mrazure01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/f068f836-e770-3c6a-4b0a-f097553bd366.png">

## [MR and Azure 302: Computer vision](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-302)
HoloLensで画像をキャプチャし、Computer Vision APIを用いて一般物体認識を行います。

1．Computer Vision API を作成、Keyをメモる
2．VisionManager.csの29行目`authorizationKey`にメモったKeyを入れる
3．実行
タップすると画像をキャプチャし、認識結果が表示されます。
<img width="420" alt="mrazure02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/44ab8a45-88d4-725a-ed5a-61d035dfdeb7.png">

## [MR and Azure 302b: Custom vision](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-302b)
HoloLensで画像をキャプチャし、Custom Vision APIを用いて転移学習し、特定物体認識を行います。
今回はマウスとキーボードの物体認識を行います。

1．[Custom Vision](https://www.customvision.ai/account/signin)にサインイン
2．画像とタグを準備、学習させる
<img width="955" alt="mrazure04.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/e7f14ca6-6a48-47c8-ab74-cd446f02159f.png">
3．APIの設定
CustomVisionTrainer.csの24行目`trainingKey`、29行目`projectId`
![mrazure06.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/d190f52a-3a9a-01d3-dd3a-633667f26034.png)

CustomVisionAnalyser.csの17行目`predictionKey`、22行目の`predictionEndpoint`
![mrazure05.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/22a04a8c-e14a-e20d-9e7c-c5319308af2e.png)

4．実行
### 学習モード
ImageCaptureCustom.csのAwake()内の`AppMode`を`AppModes.Training`にしてください。
タップすると画像をキャプチャし、音声入力でMouseかKeyboardと言いタグをつけます。Custom Vision APIへ学習画像がアップロードされます。アップロード完了したら、Custom Vision APIへサインインし再学習をしてみましょう。
<img width="416" alt="mrazure07.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/081cf7bd-827e-0914-dd38-2b6bb80192e6.png">


### 解析モード
ImageCaptureCustom.csのAwake()内の`AppMode`を`AppModes.Analysis`にしてください。
タップすると、解析を開始し、マウスもしくはキーボードが認識されれば結果が表示されます。
もう一度タップすると、解析を停止します。
<img width="416" alt="mrazure03.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/24f2cefd-322a-83a7-6833-cf95e3a1e2e1.png">

## [MR and Azure 303: Natural language understanding (LUIS)](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-303)
HoloLensで音声入力し、Language Understanding APIを用いて言語理解し、オブジェクトの色やサイズを変更します。

1．Language Understanding APIを作成し、Keyをメモる
2．[Language Understanding Portal](https://www.luis.ai/)へサインインし、アプリを作成
3．Entityの作成
<img width="958" alt="mrazure09.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/a99c441b-009a-0cce-f6c9-e962bc7c9a95.png">

4．Intentの作成
### ChangeObjectColor
<img width="956" alt="mrazure08.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/a229152d-13d9-0fdd-bff6-f2dc1882ace7.png">
### ChangeObjectSize
<img width="957" alt="mrazure11.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/9c569eb3-c8fb-66f5-79d6-0dc7231795fd.png">

5．Train(学習)して、Publishする
6．APIの設定
LuisManager.csの42行目`luisEndpoint`にEndpointを入れる
![mrazure10.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/83f3c4e5-d46d-a029-0884-c2890ce80bbe.png)

7．実行
Cubeに向かって「make this blue」と発音してみました。「メイクディスプレイ」...「マイクテスブルー」...
HoloLensのOSが日本語だったので失敗、LUISを日本語対応に変えましょう。（保留、しかしCustom Visionの学習はうまくいってたな...）
<img width="418" alt="mrazure12.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/6aca5998-d8c2-da26-9b35-8c3ce919673a.png">

## [MR and Azure 304: Face recognition](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-304)
HoloLensで画像をキャプチャし、Face APIを用いて、顔認識を行います。

1．Face APIを作成し、Keyをメモる
2．UWPアプリケーションの[Person Maker](https://github.com/Microsoft/HolographicAcademy/raw/Azure-MixedReality-Labs/Azure%20Mixed%20Reality%20Labs/MR%20and%20Azure%20304%20-%20Face%20recognition/PersonMaker.zip)を用いて、顔画像の学習を行う。メモったKeyはここでも使います。
<img width="819" alt="mrazure14.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/b42a9bce-ffd5-832f-8c14-1cb769a6aee9.png">

3．FaceAnalysis.csの39行目`key`にメモったKeyを入れ、`personGroupId`をPerson Makerで設定したものにします。
4．実行
タップすると画像をキャプチャし、顔認識結果(personId)が表示されます。
<img width="416" alt="mrazure15.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/49d8ac4f-62d9-4303-2bea-66ac4cd1dc21.png">


## [MR and Azure 305: Functions and storage](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-305)
Cubeに視線を合わせるとFunctionsを用いてランダムなオブジェクト（Cube、Sphere、Cylinder）を生成したり、生成したオブジェクトのリストをStorageのファイルに保存します。

1．Storageアカウントを作成し、Connection String(接続文字列)をメモる
2．Function Appを作成し、Get Function URLからURLをメモる

~~~csharp
using System.Net;
    using System.Threading.Tasks;

    public static int Run(CustomObject req, TraceWriter log)
    {
        Random rnd = new Random();
        int randomInt = rnd.Next(0, 3);
        return randomInt;
    }

    public class CustomObject
    {
        public String name {get; set;}
    }
~~~

3．APIの設定
AzureServices.csの28行目`azureFunctionEndpoint`にメモったURLを入れる
34行目`storageConnectionString`にメモったConnection Stringを入れる

4．作成したStorageのfileshare->storagedirectoryにTextShapeFile(拡張子無し)を保存する（実行したらできるカモ）

~~~
2,0,2,1,0,1,1,2,0,0,2,1,0,1
~~~

5．実行
まず、TextShapeFileが存在していると、リストを読み込み、オブジェクトが生成されます。
完了(LoadComplete)したら、上に配置しているCubeに視点を合わせると、ランダムにオブジェクトが生成されます。

<img width="598" alt="mrazure16.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/ca119190-02f7-e0c3-6b5e-6e844b17ada9.png">


## [MR and Azure 306: Streaming video](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-306)

## [MR and Azure 307: Machine learning](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-307)

## [MR and Azure 308: Cross-device notifications](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-308)

## [MR and Azure 309: Application insights](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-309)

## [Mr and Azure 310: Object detection](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-310)

## [MR and Azure 311 - Microsoft Graph](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-311)

## [MR and Azure 312: Bot integration](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-312)

## [MR and Azure 313: IoT Hub Service](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-313)

## まとめ
- MRTKを用いて、すべてのMR and Azure プロジェクトを統一、簡単にしました。
- Academyの資料はMRTKを用いていないので、スクリプトが多くなり結構大変です。
- Cognitive Servicesには様々なAPIが用意されているので使いこなしてHoloLens×Azureのマスターになってください。

## 参考文献
- [Connpass ガチラボvol.10 「Academy 3XXぜんぶやーる」](https://kumamcn.connpass.com/event/107625/?fbclid=IwAR1vT5kpINxAEpALaH5owD91t2EECc_hHGoPg6RrBxOPVPHshW4johiVYWA)
- [20181121 - ガチラボvol.10 資料](https://www.facebook.com/download/507840373049823/20181121%20-%20%E3%82%AC%E3%83%81%E3%83%A9%E3%83%9Cvol10.pdf?hash=AcrYXHEo-vyl_fve)
- [FBグループ ガチラボ](https://www.facebook.com/groups/gachilab/)