TensorFlow LiteがGPUをサポートしたらしいのでiOSで試してみた

TensorFlow LiteがAndroidやiOSデバイスのGPUをサポートしたようです[^dev]。

[^dev]: とはいえまだDeveloper Preview

- [TensorFlow Lite Now Faster with Mobile GPUs (Developer Preview)](https://medium.com/tensorflow/tensorflow-lite-now-faster-with-mobile-gpus-developer-preview-e15797e6dee7)

バックエンドはAndroidではOpenGL ES 3.1、iOSではMetal。

> This new backend leverages:

> - OpenGL ES 3.1 Compute Shaders on Android devices
> - Metal Compute Shaders on iOS devices

iPhone 7では最大6倍の高速化が見られたようです。

> By leveraging the new GPU backend in the future, inference can be sped up from ~4x on Pixel 3 and Samsung S9 to ~6x on iPhone7.


というわけで以下のチュートリアルページに従って試してみました。

- [TensorFlow Lite GPU Delegate Tutorial  |  TensorFlow Lite  |  TensorFlow](https://www.tensorflow.org/lite/performance/gpu)

## 試すまでの最小手順

TFリポジトリには[昔から](http://d.hatena.ne.jp/shu223/20160720/1468969711)iOSでリアルタイム物体認識を行うサンプルが同梱されているのですが、これをGPUで処理するように変更していきます。

チュートリアルページでは実行速度を最大化するように細かい設定も書いてますが（Releaseビルドしろとか）、**動かすために必要なものだけ抜粋**して書いていきます。

### 1. モデルをダウンロード

スクリプトを走らせてサンプルで利用するモデルをダウンロードします。

```console
$ cd tensorflow/lite/examples/ios
$ sh ./download_models.sh
```

### 2. GPUサポート版TF Liteを使うようPodfileを変更

```ruby
# pod 'TensorFlowLite', '1.12.0'
pod 'TensorFlowLiteGpuExperimental'
```

で、`pod install`します。

### 3. コードの修正

`CameraExampleViewController.h`の、`TFLITE_USE_CONTRIB_LITE`の値を`1`から`0`に、

```objc
// #define TFLITE_USE_CONTRIB_LITE 1
#define TFLITE_USE_CONTRIB_LITE 0
```

`TFLITE_USE_GPU_DELEGATE`の値を`0`から`1`に変更します。

```objc
// #define TFLITE_USE_GPU_DELEGATE 0
#define TFLITE_USE_GPU_DELEGATE 1
```


### 4. Build & Run!

`tflite_camera_example.xcworkspace`をXcodeで開いて実機で実行します。

![tflite.2019-01-19 20_02_02.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/7702ec81-3ce5-aec2-b892-1b2a8085df44.gif)

### GPUで動いていることを確認する

よく見る物体認識デモなので、これだけだとGPUで動いている実感がないかもしれません。

XcodeのGPU Reportで見てみるとちゃんとGPUが働いていました。

<img width="860" alt="Screen Shot 2019-01-19 at 19.28.31 copy.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3180/2d843a58-3934-e422-831f-8e31c60f4a51.jpeg">

ちなみにこのときCPUの負荷は60%前後。（iPhone XS / iOS 12.1.2）


## 他の公式配布モデル

物体認識以外にも、魅力的なモデルが既に配布されています。以下のモデルはモバイルデバイスGPUで利用可能です。

### DeepLab segmentation

セグメンテーション（領域分割）用のモデル。

> image segmentation model that assigns semantic labels (e.g., dog, cat, car) to every pixel in the input image


![image1.png](https://qiita-image-store.s3.amazonaws.com/0/3180/f06efef0-af76-1398-adb2-7f1e3e3e49cb.png)

（画像は[Google AI Blogの記事](https://ai.googleblog.com/2018/03/semantic-image-segmentation-with.html)より）


- https://storage.googleapis.com/download.tensorflow.org/models/tflite/gpu/deeplabv3_257_mv_gpu.tflite


### PoseNet

ポーズ（姿勢）推定用のモデル。

> vision model that estimates the poses of a person(s) in image or video


![camera.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/c5f58766-cc2f-3fe1-9aa1-671288555e60.gif)

（画像は[こちら](https://github.com/tensorflow/tfjs-models/tree/master/posenet)から）

- https://storage.googleapis.com/download.tensorflow.org/models/tflite/gpu/multi_person_mobilenet_v1_075_float.tflite


### MobileNet SSD object detection

物体認識モデル。**複数のオブジェクトをバウンディングボックスつきで検出**してくれます。

> image classification model that detects multiple objects with bounding boxes


![ssd_at_big_table_compressed.2019-01-19 20_28_35.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/0a43f32a-0144-56ff-2b46-9821c0eee5ba.gif)

（画像は[こちら](https://ai.googleblog.com/2018/07/accelerated-training-and-inference-with.html)から）

- https://storage.googleapis.com/download.tensorflow.org/models/tflite/gpu/mobile_ssd_v2_float_coco.tflite

## まとめ

TensorFlow LiteがAndroid/iOSのGPUを利用するようになったとのことで、iOSで試してみました。姿勢推定、セグメンテーション、バウンディングボックス付き物体認識と魅力的なモデル群が既に利用可能なので、そちらも試してみたいと思います。

## TensorFlow x iOS関連記事

- [TensorFlowで作ったモデルをCore MLで利用する](https://qiita.com/shu223/items/b4fc288f7c45d2504f7f)
- [TensorFlowをiOSで動かしてみる](http://d.hatena.ne.jp/shu223/20160720/1468969711)
- [TensorFlow for iOS のモデルについて - Qiita](https://qiita.com/shu223/items/99c39d914c32fafd4d8e)
- [TensorFlowの学習済みモデルを拾ってきてiOSで利用する - Qiita](https://qiita.com/shu223/items/a2808e9dfccbd23387ff)

## iOS x 機械学習 関連記事

- [Core ML＋Visionを用いた物体認識の最小実装 - Qiita](https://qiita.com/shu223/items/e200e379e34629018dca)
- [iOSの機械学習フレームワークの比較 - Core ML / Metal Performance Shaders (MPSCNN) / BNNS - Qiita](https://qiita.com/shu223/items/33774d896b7142fcfc1c)
- [iOSのMPSCNNに渡すモデルパラメータのフォーマット / TensorFlowからの書き出し - Qiita](https://qiita.com/shu223/items/c735ab888a83f214f89a)
- [iOSのMetalで畳み込みニューラルネットワーク - MPSCNNを用いた手書き数字認識の実装 - Qiita](https://qiita.com/shu223/items/bdd537f38872a5af4e4c)
- [ドラッグ＆ドロップで機械学習のモデルがつくれる「Create ML」の使い方 #WWDC18 ](http://shu223.hatenablog.com/entry/2018/06/06/071642)
- [Visionなしで、Core ML単体で使う - Qiita](https://qiita.com/shu223/items/5440060a4f5a9da4f331)
- [Core MLの公式配布モデル6種の比較 - Qiita](https://qiita.com/shu223/items/53f0dd423a9d5271bc2a)