bauhausify美大出身の
WEBエンジニアリング奮闘記
CODING

ブラウザで機械学習が実行できるml5jsを試してみる

2019.08.21
フロントエンドエンジニアは絵を描くのが苦手だけど、絵をブラウザで表示するのは得意です。それと同じことが、機械学習でも起こるのでは?そんな近未来を予感させてくれるような、ブラウザ実行型のライトウェイトな機械学習ライブラリml5jsを紹介します。

なぜかp5jsと間違えやすい、ml5jsという機械学習をブラウザ上で実行するライブラリが気なったので、その所見を書きたいと思います。
(p5jsはPtsjsによる実践ジェネラティブアートで紹介しています。)

まず機械学習について簡単に

以前私は、PythonのKerasを用いて少しだけ機械学習に触れたことがあります。
その時の、雑感を端的に説明すると、

  • 学習
  • 推論

この2つが機械学習の大きなフェーズとなり、
一番重要な、そして用意するのが難しい学習のためのデータが存在します。
開発者側はデータから学習したモデルを事前に用意し、
なんらかのサービスのユーザーはそのモデルをもとに機械学習を実行します。ここが推論です。

そのときの機械学習への印象は以下です。

  1. 学習させるためのデータが必要、より多く、正確なもの
  2. 学習にはマシンスペックが必要、お金を出せば出すほど早くできる、時間とお金の相談
  3. 学習させるノウハウは専門家レベルの習得に時間がかかる、素人はトライアンドエラー
  4. 学習したモデルをもとにインタラクティブに推論を得るにもある程度のマシンスペックがいる

1-3は到底ブラウザで実行するにはお門違いです。
ml5js は4の実行させるところに主眼をおいたものに思われます。

では実際にサンプルを触ってみます。

ml5jsのはじめのサンプルを試す

ここからの内容は公式のチュートリアルに沿っています。その簡略版です。

まず<head>内にml5jsとp5jsを読み込ませます。
なぜp5jsを使うのかというと、機械学習は画像に対してわかりやすい効果がだしやすいので、画像を取り扱いやすいp5jsが採用されたのでしょう
この記事では最低限のもののみ読み込みます。

<!-- p5 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.8.0/p5.min.js"></script>
<!-- ml5 -->
<script src="https://unpkg.com/ml5@0.3.1/dist/ml5.min.js"></script>

つぎにp5jsのみの機能を使いcanvas要素を作成し、画像を表示します。
今回は、この画像が何の画像なのかを推論します。

let img;

function preload() {
  img = loadImage('https://res.cloudinary.com/mwrote/image/upload/c_scale,w_200/v1560441316/bauhausify/_SDI0792.jpg');
}

function setup(){
  createCanvas(200, 133); // 今回読み込んでいる画像のサイズ
  image(img, 0, 0);
}

そこで、肝心のml5jsの登場です。追加しているのは4箇所です。

let classifier, img; // ここと
function preload() {
  classifier = ml5.imageClassifier('MobileNet'); // ここと
  img = loadImage('https://res.cloudinary.com/mwrote/image/upload/c_scale,w_200/v1560441316/bauhausify/_SDI0792.jpg');
}

function setup(){
  createCanvas(200, 133);
  classifier.classify(img, gotResult); // ここと
  image(img, 0, 0);
}

// ここ
function gotResult() {

}

まず、TensorFlowの提供する学習済み画像モデルMobileNetを使うと宣言し、

let classifier = ml5.imageClassifier('MobileNet');

画像を読み込ませ、callback関数のgotResult(名前なんでもOK)を指定します。

classifier.classify(img, gotResult);

すると画像解析の数秒後にgotResult関数が呼ばれます。

事前にhtmlにて簡単な受け皿を用意し、

<span id="result"></span>

gotResult関数には以下を書きましょう。

function gotResult(results) {
  console.log(results);
  document.querySelector('#result').textContent = results[0].label;
}

すると、ブラウザコンソールには画像の推論結果が表示され、
span#result要素にはそのテキストデータが表示されます。

詳しいサンプルコードは、記事冒頭のCodePenのリンク先でご覧いただけます。

雑感まとめ

冒頭の機械学習の概要と照らし合わせせつつ、雑感としてまとめます。

やはり、ブラウザ上ではなかなか現状厳しいデータですね。
しかし、ブラウザで実行できることが最大のメリットです。
そして、クライアント側でのモデルの読み込みと推論がこんなに簡単にできることが触っていて楽しいですね。

この記事を共有しよう!

前の記事
たった4ステップでVueを使う方法
次の記事
Bodymovinでサイズを拡大しても綺麗なWeb用アニメーションを作る方法
関連記事
目次

エムロート [Mwrote]

多摩美術大学
プロダクトデザイン専攻卒業 ->
GUIデザイン会社勤務 ->
現在フロントエンジニア

My site ->
www.mwrote.com