一昨日メルカリさんのオフィスで開催された iOSDC Reject Conference days2 で、「iOSとディープラーニング」というタイトルで登壇させていただきました。
大層なタイトルですが、僕はディープラーニングや機械学習について詳しいわけではなく、「これから勉強したい」だけの素人です。iOSDCのCFPではLT枠の場合はトーク概要を書く必要がなかったので、タイトルは大きめにしておいて、内容は勉強の進捗に応じて、という算段でした。
で、先週あたりから夜な夜なこのへんの勉強をしていて、
この次に「自分でモデルをつくる」というステップに進みたかったのですが、次から次へとわからないことがでてきて、結局「誰かがつくったサンプルを動かす」「拾ってきたモデルを使う」止まりの発表になってしまいました。
そこは引き続き精進してまいります、ということで、以下補足を。
iPhoneでInception-v3モデルによるリアルタイム物体認識を動かす
TensorFlowのInception-v3を使った一般物体認識のデモをiPhoneで動かしたときの動画がこちらです。
最初 [Notebook] [Laptop] を認識していて、カメラが下の方にいくと [Computer Keyboard] の順位が上がり、リモコンを映すと [Remote Control]、メガネを映すと [Sunglasses] が候補の上に上がってきます。*1
パフォーマンスもなかなかではないでしょうか。(用いたデバイスがiPhone 6sなので、ちょっとずるいですが。。)
サンプルを試す手順の詳細は下記記事にあります。
iOS 10で追加されたニューラルネットワーク機能群
LT5分だったのでここまで話せなかったのですが、iOS 10では2つのフレームワークにニューラルネットワークを高速計算するための機能群が追加されました。
ひとつは BNNS (Basic Neural Network Subroutines) と呼ばれていて、Accelerate Framework に新規追加されました。Accelerate は CPUで高速計算を行うためのフレームワークです。
そしてもうひとつは CNN(Convolutional neural network) で、MetalPerformanceShaders Frameworkに新規追加されました。Metal Performance Shaders はGPUで高速計算を行うためのフレームワークです。
で、どちらも同じような用途の機能が用意されていて、素人からするとGPUで処理するほうが良さそう、と思うのですが、わざわざ2種類出してきたからにはきっと一長一短あるのでしょう。もっと詳しい方が書いた記事があり、その記事ではこれらの比較についてこう述べられています。
AccelerateとMetalは、非常によく似たニューラルネットワーク関数群を提供しているので、どちらを選択するかは、各アプリケーションに依存します。GPUは、通常、機械学習に必要な種類の計算には望ましい反面、データの局所性によって、Metal CNNのパフォーマンスが、Accelerate BNNSバージョンより劣る場合があります。GPUにロードされた画像上でニューラルネットワークを動かす場合、例えば、MPSImageと新しいMPSTemporaryImageを使うと、Metalの方が明らかにパフォーマンスが上です。
- iOS 10とMac OSにおけるニューラルネットワーク | プログラミング | POSTD
- Neural Networks in iOS 10 and macOS | Big Nerd Ranch (元記事)
MPSCNNのサンプル
BNNSの方も公式サンプルはあるのですが、今のところMac OS X用のものしかありません。MPSCNNの方はメリットやパフォーマンスを把握するのに最適なiOS向け公式サンプルが2つ出ています。
- MPSCNNHelloWorld・・・MPSCNNで手書き数字認識
- MetalImageRecognition・・・MPSCNN+Inceptionモデルで物体認識
ちなみに"MPS"は MetalPerformanceShaders のプレフィックスで、CNN関連の機能にはMPSCNNというプレフィックスが付いています。
で、上の手書き文字認識の方(MPSCNNHelloWorld)がシンプルで非常に理解しやすく、最初の一歩にすごく良いです。ベータ期間中につきサンプルのスクショは控えます。
上の画像(発表資料p35)はWWDC16のセッションスライド内にあった多層ネットワークの概念図に、該当するMPSCNNのクラス名を書いたものですが、わりとそのまんまで、CNNの概念を理解していれば非常に使いやすそうです。
- Convolution Layer(特徴量の畳み込みを行う層): MPSCNNConvolution
- Pooling Layer(レイヤの縮小を行い、扱いやすくするための層): MPSCNNPooling
- Fully Connected Layer(特徴量から、最終的な判定を行う層): MPSCNNFullyConnected
(参考:Convolutional Neural Networkとは何なのか - Qiita)
iOS 9以下でも使えるオープンソースのDL/NNライブラリ
iOS 10の話ばかりしても現実感がないかもしれませんが、"ios deep learning" とか "ios neural" とか "swift neural" とかでGitHub検索するとOSSがざくざく出てきます。
そのうち、100スター以上ついているものをピックアップしてみました。
TensorFlowがサンプル含めObjC、C++であるのに対して、Swiftで書かれているものも多いですし、Metal or Acceleratedフレームワークで高速化してあるものも多く、充実している印象です。
が、いざ試してみようとすると、サンプルもなかったり、最近はメンテされてなさそうだったりで、実際に使えるのは実はあまり多くないのかも、とも思いました。
もっともスターが多くついている「Swift-AI」については下記記事で紹介しています。
ディープラーニングの基本概念を学ぶのに良かった本
発表内では触れてないのですが、ディープラーニングというか人工知能というかそういう系の話はWebに解説記事も多く、逆にどこから手を付けていいかわからない、という状態に長らく陥っていました。で、とある機会に会ったこの分野でゴリゴリやってる人に教えてもらったのが下の書籍です。
売り上げランキング: 6,089
人間の脳のしくみから読みやすい文章で紹介してあって、いきなり数式ベースの解説があると「また今度にしよう」となってしまう自分には入り口として最適でした。
今後の展望
TensorFlowにしろiOSのBNNS/CNNにしろ、学習済みモデルの中身というかフォーマットがよくわかってないので、次はそのあたりを調べたいと思ってます。
*1:このとき食べていたアイスクリームも見事に認識してくれたのですが、食べかけだったのでカットしました