HoloLensで勝手にブルームするなよ

[HoloLens Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hololens) 7日目の記事です。
今日は、今年流行った？ **「勝手にブルームするなよ」** についてです。

## 「勝手にブルームするなよ」とは？
AI・人工知能EXPO2018で[HoloLensを展示](https://youtu.be/RlcKwomZ4XU
)していたときのことです。
外国人の方がいらっしゃって、デモを体験したいとおっしゃったので、どうぞどうぞと準備をし、HoloLensを被せました。
すると、慣れた手つきでブルームされて、デモが終了しました( ;∀;) ちょ、おまｗ
その後、はーたんが来てくれてこの話をした時に、生まれた言葉が「勝手にブルームするなよ」です。
![勝手にブルーム01.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/dfae7e88-f43c-37f5-2cbd-a343646ad295.png)

## 「勝手にブルームするなよ」Tシャツの作成
ちょうどUTme!が流行っていたので、「勝手にブルームするなよ」Tシャツを作りました。モデルは僕の手です。
前本さんがUniteTokyo2018に着ていったことで広がりました！（前本さんが作ったみたいｗ）
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">勝手にブルームするなよ。 <a href="https://twitter.com/hashtag/unitetokyo2018?src=hash&amp;ref_src=twsrc%5Etfw">#unitetokyo2018</a> <a href="https://t.co/SuDtJOnmIT">pic.twitter.com/SuDtJOnmIT</a></p>&mdash; Satoshi Maemoto (@peugeot106s16) <a href="https://twitter.com/peugeot106s16/status/993657879939837952?ref_src=twsrc%5Etfw">2018年5月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

de:code2018ではこんな感じで、勝手にブルームするなよ団ができるほどに！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">勝手にブルームするなよ団 <a href="https://twitter.com/hashtag/decode18?src=hash&amp;ref_src=twsrc%5Etfw">#decode18</a> <a href="https://t.co/AOr1GFJXJA">pic.twitter.com/AOr1GFJXJA</a></p>&mdash; Satoshi Maemoto (@peugeot106s16) <a href="https://twitter.com/peugeot106s16/status/998886787421421568?ref_src=twsrc%5Etfw">2018年5月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 勝手にブルームできない
そんな中で、RS5が発表されてしまいました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あ，ありのまま起こったことを話すぜ？ブルームしても一発でアプリが落ちなくなりました！！！ホームボタンを押すことでアプリが落ちます。あとは時刻やボリュームも確認できるようになったのも地味にうれしい… <a href="https://twitter.com/hashtag/HoloLens?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens</a> <a href="https://t.co/aLqjMwJtee">pic.twitter.com/aLqjMwJtee</a></p>&mdash; デコシ (@Ash_Yin) <a href="https://twitter.com/Ash_Yin/status/1021697153133998081?ref_src=twsrc%5Etfw">2018年7月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まだブルームで消耗してるの？と言われるようになりました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">まだブルームで消耗してるの？ <a href="https://t.co/XMo9PCHSZl">pic.twitter.com/XMo9PCHSZl</a></p>&mdash; デコシ (@Ash_Yin) <a href="https://twitter.com/Ash_Yin/status/1021710672348897281?ref_src=twsrc%5Etfw">2018年7月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

最近のアップデート、本当に大変なことに...
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">大変です！RS5は勝手にブルームされてもアプリが終わりません！ <a href="https://t.co/rmNzXucQb8">pic.twitter.com/rmNzXucQb8</a></p>&mdash; Satoshi Maemoto (@peugeot106s16) <a href="https://twitter.com/peugeot106s16/status/1062560464998035456?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

悔しい...

## 勝手にブルームさせろよ
ということで、今回Azure Cognitive ServicesのCustom Visionを使って、勝手にブルームできるようにしてみました。

### Bloomを学習させる
まずは、手をつぼみにした状態（Bloom前）の画像と、手を開いた状態（Bloom後）の画像をそれぞれ10枚用意しました。
Bloom前を `0` に、Bloom後を `1` としてラベリングしています。
![勝手にブルーム02-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/8b9826f4-632a-aa52-a338-e78711e24fd0.png)

学習した結果がこちらです。まずまずな結果になりました。
![勝手にブルーム02.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/2e00e3c6-a173-6db8-5541-16b05ec6e9da.png)

テストしてみた結果がこちらです。99%以上、区別できています。
![勝手にブルーム04.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/c134ef47-4466-7199-287f-b2989f3ccae7.png)
![勝手にブルーム03.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/a4980004-6aaf-a8c5-3047-0963c6e529ab.png)

### ソースコード
開発環境は以下です。
- Unity 2017.4.11f1
- HoloToolkit 2017.4.3.0
- Visual Studio 2017 (15.9.2)

ソースコードは[こちら](https://github.com/SatoshiRobatoFujimoto/HoloLensBloom)。[MR and Azure 302b のCustomVision](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-302b)を参考にしています。

下記ファイルのAPIに関する部分を変更してください。
- CustomVisionTrainer.cs の `trainingKey` , `projectId` 
- CustomVisionAnalyser.cs の `predictionKey` , `predictionEndpoint` 
![勝手にブルーム02-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/ae702a10-27c4-9f3f-1091-27509db604de.png)
![勝手にブルーム05.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/e2adac42-e445-7caf-b0e5-9dd2ddfefda6.png)

### 実行結果
タップしたらキャプチャを開始します。
10秒おきに、キャプチャしてCustom Vision APIをたたいて、結果を表示します。
これを繰り返して、結果が0（Bloom前）から1（Bloom後）になったときにアプリケーションを終了します。[1]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="et" dir="ltr">20181207 - HoloLensBloom: <a href="https://t.co/r87HiKGzIm">https://t.co/r87HiKGzIm</a> via <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a></p>&mdash; 藤本賢志(ガチ本) (@sotongshi) <a href="https://twitter.com/sotongshi/status/1071024865690509317?ref_src=twsrc%5Etfw">2018年12月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**めっちゃゆっくり** です。スロモブルーム。
10秒おきにキャプチャしているので、しょうがないですね。
ImageCaptureCustom.csの`secondsBetweenCaptures`を変えると速くなるかもしれません。
学習モデルをWinMLに実装するとか。[2][3]
もっと速くするにはOpenCVでハンドトラッキングして、バリバリやったほうがいいと思います。
RS5のブルームが先に反応してうまくいかないかもしれませんね。（二回ブルームしないといけないとか？）

## まとめ
- 「勝手にブルームするなよ」とは、HoloLensのデモ中にお客さんが勝手にブルームして、デモを終了させられたときに使う言葉です。
- RS5になってからブルームしても良くなったため、「勝手にブルームさせろよ」が誕生しました。
- Custom Visionを用いて、ブルームするとアプリが終わるように実装してみました。
- ブルームTシャツは期間限定で[再出品中](https://utme.uniqlo.com/jp/t/hENiAw=)ですので、クリスマスプレゼントにいかがでしょうか？
- 「勝手にブルームするなよ」は[KumaMCN選 新語・流行語大賞 第２回 2018年 ノミネート語](https://kumade.blue/singo/93/?fbclid=IwAR17F6xF5SV1XaXIUt7DaTNdx3i5JSQmDfoCmOrd1AZfqbxx12-Z1XOqQrE)にも選ばれております。

## 参考文献
[1] [HoloLensアプリの終了処理](http://akihiro-document.azurewebsites.net/post/hololens_exitapp/)
[2] [HoloLensとWindowsMLとCustomVisionを使って手書き認識をしてみる(データ収集編)](http://akihiro-document.azurewebsites.net/post/hololens_windowsmachinelearningpaint1/)
[3] [CustomVisionを使って手書き認識をしてみる(学習データ利用編)](http://akihiro-document.azurewebsites.net/post/hololens_windowsmachinelearningpaint2/)