Blueoilを使って物体検出プログラムをWebブラウザで動かしてみよう 😋

新年あけましておめでとうございます。徳永です。LeapMindは数ヶ月前にBlueoilという量子化ニューラルネットワークの実装をOSSをリリースしましたが、FPGAで動くと言われても正直、趣味プログラマにはちょっと敷居が高いですよね。実際にはARM用のバイナリとかx86-64用のバイナリも吐くので、FPGAボードを持ってなくても動かせるんですが、FPGAを強く押し出していることもあり、めんどくさそうな印象がついてしまっていることと思います。

この「めんどくさそう」という印象をぬぐうためには、単にPCでも動くだけじゃ、ダメなんじゃない? 超お手軽にためせる環境が、必要なんじゃない? そう思って、こないだの社内のハッカソンイベントでがんばりました。BlueoilはC++のコードを生成しますが、ちょっと手を加えて、emscriptenを使ってweb assemblyに変換して、ブラウザで実行できるようにしてみました。

https://leapmind.io/demo/blueoil-browser-preview/

上記のURLに飛ぶと、カメラアクセスの許可を求められますので、許可すると、カメラで画像を撮りはじめて、その場で顔検出プログラムが動き出します。(このデモプログラムはブラウザ上で動作するだけなので、撮影したカメラ画像データはどこにも送信しません。)ブラウザはGoogle Chrome推奨です。手元の環境では、Firefoxだとまともな速度が出ませんでした。あと、カメラがついてないと全然使い物にならないので、その辺りもすみません。

このデモはemscriptenで作ったwasmバイナリとJSで動いていて、最初にデータをダウンロードしてきた後は、特にネットワークアクセスもしないし、GPUも使ってません。wasmバイナリのサイズは938KBです。このサイズでまともな物体検出のネットワークが動くのって、けっこうすごくない? もっとほめてもいいんだよ?

x86 CPUってめちゃくちゃ速いので、そこそこ新しいCore i7とかでこのデモを動かすとCyclone Vより余裕で速かったりするんですが、その辺りは深く追求しないでください。開発チームは、FPGA版に関してももっと速い実装を鋭意開発中です。1ヶ月後に来てください、もっと速いFPGA実装をお見せしますよ!

技術的なポイントを説明すると、このデモの(というか、Blueoilの)いちばん重要な技術としては、ニューラルネットワークの量子化が挙げられます。量子化しない場合、このデモのスピードは2FPS程度しか出ないのですが、量子化することによって、だいたい20FPS程度のパフォーマンスが実現できています。量子化によって、概ね10倍程度のスピード向上が得られていることがわかります。ニューラルネットワークの量子化については、ス社の開発者ブログに解説記事があるので、詳しく知りたい方はそちらをご参照ください。

ニューラルネットの量子化に関する論文はたくさんありますが、実際にCPUで実行して速くなる実装を公開しているOSSは、我々の知る限りではBlueoilのみです。

作ってみての感想ですが、JSとのインターフェースの部分がめんどくさかった(コンストラクタのオーバーロードがあるとなんかemscriptenのC++ラッパクラスがうまく動いてくれなかったのでC APIとそのラッパを手作りしたのと、C++側で確保したfloat配列をJS側から読む方法が分からなかったので、その辺りもラッパを書いた)のと、スレッド未対応の環境だと謎のエラー吐いて落ちる辺りがちょっとつらかったけど、基本的にはコンパイルしたら素直に動いたので、ビックリしました。emscriptenの内部の詳細は全然わかってないけど、JS側で確保した大きな1本の配列をメモリ空間だとみなして動作するようになってるみたいですね。面白いです。

この機能は順調に行けばBlueoilの次のリリース (version 0.3になる予定です) に取り込まれて、簡単に使えるようになる予定です。今どうしても動かしてみたい、という人はこちらのブランチで試すことができます。

このデモ自体はLeapMindの技術力を示すためのもので、今のところブラウザ上でニューラルネットワークを動かしてなにか商売をする気は特にないのですが、これを見て、BlueoilやLeapMindにみんなが興味を持ってくれたらうれしいです。お仕事のお問合わせは business@leapmind.io まで、LeapMindで働きたい人は careers@leapmind.io まで、ご連絡をお待ちしております。CPUで良ければWindowsで動かしたりもできますよ!

最後になりましたが、このデモはイベントで3人で作ったもので、カメラからの画像取得やCanvasでの描画は@suttang, blueoilで作ったニューラルネットとデモUIのつなぎ込みなどは @rui_mashita の手によるものです。

Posted by tkng

カレーを愛するプログラマ

Leave a reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です