【機械学習】”にんじん”みじん切りチェックアプリ～Chopped Carrots Challenge🥕～

## 料理アプリのプロトタイプ作り
料理に関するアプリを作ろうと思っており、
その一環として「料理の過程をチェックする」アプリのプロトタイプを作ってみることにした。

アプリをそれっぽく作ってみたい人は参考になるかも。

料理の工程をチェックするアプリを作ろうと思っているので、今回は、”にんじん”のみじん切りがきちんと出来ているかということに焦点を絞って作ってみる。

前にミートソースパスタを作るときに、”にんじん”のみじん切りが大量に必要だったのだが、どこまでいったら”みじん切り”なのか分かったら案外役立つのではないかと思ったからだ。

名付けて、『Chopped Carrots Challenge』。

↓前に投稿した、LINE×TeachableMachineで作ったアプリ風のもの↓

https://qiita.com/long66tail/items/5a91304007cfa383fdb6


↓料理コーチングアプリ的なものが欲しいと書いたnote記事↓

https://note.com/long66tail/n/n0393de56f5dd

## 動作イメージ
https://twitter.com/longtail6666/status/1534769697119666176

## 完成作品
ぜひ挑戦してみてください🥕

https://chopped-carrots-29ec8c.netlify.app/

## 使ったものたち
**機械学習**
[TeachableMachine](https://teachablemachine.withgoogle.com/)
**ライブラリ**
[Vanta](https://www.vantajs.com/)　参考 https://b-moon.net/vanda-js-options/
[ml5.js](https://ml5js.org/)
[bootstrap](https://getbootstrap.jp/)
[jQuery](https://jquery.com/)
**アプリ**
[CodePen](https://codepen.io/)
[Netlify](https://www.netlify.com/)


## ソースコード
似たようなアプリを作ってみたい人は、Codepenの内容をそのままコピーどうぞ。（そしてLGTMもお願いします）
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="KKQxLmg" data-user="long66tail" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/long66tail/pen/KKQxLmg">
  Check chopped Teachable Machine + ml5.js</a> by long66tail (<a href="https://codepen.io/long66tail">@long66tail</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


## 作り方

### 1-1.機械学習（TeachableMachine）で”にんじん”のみじん切りを学習
使い方は多くのサイトに書いてあるため、ここでは割愛する。

今回は作業負荷軽減も兼ねて、にんじんに特化させた。
前に使用したプロジェクトを流用して、モデルを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607557/68f0a220-0686-9279-d91d-e8a2fc4ad836.png)

出来たら、エクスポートして、リンクを取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607557/b024e386-935f-bf18-8d66-a25dd59f0176.png)


### 1-2.Codepen（環境整備）
歯車マークのSettingsから、CSS、JSライブラリを設定する。
*Vanta*は、3次元でアニメーション背景を作れるJSライブラリ。
[Vanta](https://www.vantajs.com/)
[bootstrap](https://getbootstrap.jp/)
[jQuery](https://jquery.com/)

### 1-3.Codepen（HTML）
*Vanta*を適用するために`id="my-background"`と定義している。
その他、文字の大きさ、ボタンなどは*bootstrap*などで遊びを入れた。
`id="webcam"`でビデオの準備をしている。サイズは重くなければ良いと思うがこだわりはなく、16：9にした。
~~~HTML
<body>  
  <div id="my-background">
    <div class="row my-3" class="col-sm-6"><h1>Chopped Carrots Challenge</h1></div>
    <div class="row my-1" class="col-sm-6"><h4>使い方</h4></div>
～中略～
    <button class="btn btn-primary" onclick="start()">開始</button><br>
    <video id="webcam" width="480" height="270" muted autoplay playsinline></video>
    <div class="col-sm-6"><h5><p class="text-black-70">▼判定結果▼</p></h5></div>
    <h4><p id="result"></p></h4>
  </div>
</body>
~~~

### 1-4.Codepen（CSS）
装飾なし。
スマートフォンを使用する前提だったが、インカメなどの内側を取る場合には、反転させると良いそう。
~~~CSS
#webcam {
  transform: scaleX(-1);
}
~~~

### 1-5.Codepen（Javascript）
まず、TeachableMachineで作成した学習モデルを、ml5を使って読み込んで使えるように定義している。
~~~javascript
const imageModelURL = 'https://teachablemachine.withgoogle.com/models/pI-FNA6Y1/';
~~~

*Vanta*は、[公式ページ](https://www.vantajs.com/)を見れば分かるのだが、今回はFog（霧）にした。

サイトの右上でカーソルをいじると、好みのFogを作ることが出来る。ここで作ったものを、実際に張り付けた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607557/2631b12d-4b90-41d0-ae83-f0c5bc8144b0.png)
~~~javascript
VANTA.FOG({
  el: "#my-background",
  mouseControls: true,
  touchControls: true,
  gyroControls: false,
  minHeight: 800.00,
  minWidth: 200.00,
  highlightColor: 0xffe19b,
  midtoneColor: 0xff5f3f,
  lowlightColor: 0xc9beff,
  blurFactor: 0.37
})
~~~

以降は、各種ビデオの定義を準備したり、TeachableMachineから返却された結果に応じてコメントを表示している。

## ちょっと気になるところ
自分のスマートフォンはカメラが3つ付いているのだが、たぶん広角レンズを使ってしまっており、映像が引き延ばされてしまう。
機械学習の結果返却に影響がないかが心配。

## 組み合わせでアジャイル的な開発が出来る
何を作りたいのかをカッチリ決めなくてもCodepenなら修正が即座に画面に反映されて、
ml5などのライブラリを使えばやりたいことも実現簡単で、
TeachableMachineは機械学習をさくっと学びなおせて、
Vantaとか後から追加できる。
素早くそれっぽく出来るのは便利！