スターティアラボ WebVR+AI入門勉強会 Part1
目次
全3回の勉強会をやり切りました!
7月〜9月にかけて月1回勉強会を開催し、全3回やりきりました。
第一回 https://startialab.connpass.com/event/180157/
第二回 https://startialab.connpass.com/event/184941/
第三回 https://startialab.connpass.com/event/188450/
回を重ねるに連れて、参加者の数も10人→20人→24人と増えていき、
プレッシャーを感じつつもやりがいのある勉強会になりました。
今回は3回目の勉強会内容をBlogに投稿します。
作成したもの
パソコンのカメラに映る手を認識して、VR内に表示します。
ピンチジェスチャーを認識し、親指と人差し指をつまむことで、BOXを出力し掴みます。
指をはなすとBOXも離します。
https://startialab-webvr-handpose-handson.glitch.me/
最初の読み込みが遅いため、左下の黒枠にカメラの画像が出るまでお待ちください。
AI概要
AIについてどのようなものかイメージを掴むため、簡単に説明します。
最近話題になっているAIといえば、ディープラーニングのことを指すことが多いです。
このディープラーニングは何なのかを、誤解を恐れずに言うと
1. 大量のデータをニューラルネットワークモデルに入力し
2. データに含まれる特徴を抽出し、学習することで
3. 精度の高い判定機(モデル)を作ることができる
というものです。
この判定機(モデル)を作成する過程を学習といい、学習済み判定機を利用することを推論といいます。
この勉強会では、手の形状を学習済みの判定機を使います。
開発環境設定
今回のハンズオンでは、https://glitch.com/ を利用します。glitch.comとは、Webブラウザ上でコーディング及び外部公開できるWebサービスです。利用する際はアカウントを作成しておきましょう。
glitch.comを詳しく知りたい方は、https://laboradian.com/glitch/ のblogがお勧めです。
基本サンプルコードをGlitchへ
https://aframe.io/ へアクセスし、右側の「GET STARTED」をクリックします。クリックすると、A-Frameのドキュメントサイトへ移動します。
A-frameのドキュメントサイトへ移動後、本文中の「remix the starter example on Glitch」をクリックします。クリックすると、glitch.com上のA-Frameサンプルサイトへ移動します。
ログインしてない場合はここでログインします。ログイン後、右下の「Remix Your Own」をクリックすることで、A-Frameのソースコードを自分のGlitchプロジェクトとしてRemixします。
PCブラウザでの動作確認
Remixしたプロジェクトから、左上のShow→「In a New Window」を選択し、動作確認します。カメラ画像の取得
WebVRやAIに関係のない処理について、scriptとcssについて事前に用意しています。ダウンロードしてGlitch.comへ取り込みましょう。
script.js
style.css
ソースコード説明
まずはカメラ画像を表示するvideoタグを用意します。
パソコンのWebカメラから画像を取得するためのスクリプトを記載します。
Webカメラの画像は「navigator.mediaDevice.getUserMedia」を使って
Streamを取得し、ビデオタグのsrcに設定しています。
作成したloadCameraメソッドで、Webカメラから取得した画像を反映したビデオタグを取得しています。
この後のAI推論処理のインプットとして利用します。
動作確認
左下の黒枠にWebカメラの画像が表示されています。
黒枠をクリックすると拡大縮小できるようにしています。デバッグ時にご利用ください。
AIモデルを使った手の検出
今回利用する学習済みの推論モデルである、Mediapipe Handposeについて簡単に説明します。
Mediapipe Handposeとは?
Mediapipeとは
ビデオ、オーディオ、時系列データを処理するパイプラインフレームワークのことで、主にエッジデバイス上での快適な推論処理を目的としたものです。ここでは詳細説明は割愛しますので、詳しく知りたい方は以下URLを確認ください。
https://github.com/google/mediapipe
handposeとは?
Mediapipeで用意されている手の3D位置情報を認識する推論モデルです。元々はJavascriptで利用できる形では提供されていなかったのですが、tensowflow.jsチームによってjsで扱える形で提供されています。
https://developers-jp.googleblog.com/2020/04/mediapipe-tensorflowjs.html
https://github.com/tensorflow/tfjs-models/tree/master/handpose
ソースコード説明
まずは、推論モデルを処理するライブラリであるtensorflow.jsと、handposeライブラリを読み込みます。
handposeライブラリより推論モデルデータを取得します。
GPUの強いパソコンの場合は、「await tf.setBackend("webgl")」のコメントを外すとすこし処理が軽くなると思います。
ビデオタグ情報をインプットとして、取得したhandposeモデルの推論メソッドを実行しています。これにより、Webカメラの画像に写っている手の3D位置情報を判定して、手の3D位置情報データをアウトプットします。
requestAnimationFrameを利用することで、パソコンの処理能力に応じた負荷で、推論処理し続けます。
動作確認
推論モデルからアウトプットしたデータは、コンソールに出力しています。
F12を押して開発ツールを表示し、コンソールに出力されたデータを確認します。
今回利用するのは、landmarksデータです。データについてはPart2で説明いたします。
Part2に続く
ここまでで、Webカメラから画像を取得して、AI推論モデルを使って手の3D形状を取得する流れの実装を行いました。
Part2では、取得した手の形状データより、2Dおよび3Dへの表示とジェスチャー認識による簡単なインタラクションの実装を行います。