メルカリレンズβ
WebAssembly × AIのプロダクト開発
2022/02/15
PWA Night vol.36 ~WebAssembly〜
Tomohiro Kato @tkato
1
メルカリレンズβ
リアルタイムな機械学習や画像処理をWebAssemblyで実装
カメラでかざす�似ている商品の取引価格がわかる
2
Webでもネイティブに近いパフォーマンスを実現
iOS版をWebアプリに移植する形で進めた
Native app (iOS)
Web
3
Agenda
どのようにネイティブアプリをWebアプリに移植したのか?
4
Tomohiro Kato / @tkato
5
なぜWebアプリとして提供するのか
6
MediaPipeをWebで動かしたい
iOS版では、MediaPipeのObject Detection & Trackingを利用�emscriptenを使って、これをWasmとしてビルドしたい
MediaPipe
https://github.com/google/mediapipe
Object Detection and Tracking using MediaPipe — Google Developers Blog
7
MediaPipeはそのままではWebで動かせない...
…
update target
Detection
(画像から物体を見つける)
Tracking
(見つけた物体を追跡)
time
8
どのようにネイティブアプリをWebアプリに移植したか
TensorFlow.js
Tracking
Detection
Thread 2
Thread 1
Tracking
Detection
WebWorker 2
WebWorker 1
MediaPipe
MediaPipe
9
WebAssemblyを利用して達成できたこと
工事は必要だったがネイティブアプリをWebアプリに移植できた
Detection &
Tracking on Web
10
まとめ
どのようにネイティブアプリをWebアプリに移植したのか?
11
12
既存のC++ライブラリをWebAssemblyにするには?
emscriptenを利用する
13
C++
JS
#include <emscripten/bind.h>
struct Config {
string input;
string output; …
}
class Graph {
MediaPipeGraph(Config config) { ... }
void start() { ... } …
}
EMSCRIPTEN_BINDINGS(graph_binding) {
emscripten::class_<Graph>("Graph")
.constructor<Config>()
.function("start", &Graph::start) …
emscripten::value_object<Config>("Config")
.field("input", &Config::input)
.field("output", &Config::output) …
}
import Module from “./core”
const config = {
input: "...",
output: "..."
};
const graph = new Module.Graph(config});
graph.start();
Minimal example of emscripten
build
$ emcc --bind -o core.js core.cpp
14