ENGINEER BLOG

ENGINEER BLOG

TensorFlow Liteを使って、オブジェクト検出モデルをAndroidスマホ上で動かす!

こんにちは。イノベーション本部の樋口です。

今回は、エッジデバイス上でAIモデルを動かす、エッジAIについて触れていきたいと思います。

はじめに

エッジAIとは

スマホや車、カメラなどのIoTデバイス自体にAIを搭載し、学習・推論させる技術です。
クラウドAIと比較して、リアルタイムな判断ができたり、通信コストを削減することができます。

エッジAIの実装

機械学習をモバイル上で行うためのフレームワークには、TensorFlow LiteやPytorch Mobileなどいくつかありますが、
基本的には同じ流れで実装をしていくようです。


軽量化には量子化や枝狩り、蒸留などの手段があります。
軽量化することにより、リアルタイムに近いスピードで推論結果が得られ、
また、モデルサイズの削減により、限られた計算資源で推論が可能になります。

実装してみる

それでは実装していきます。

内容をざっくり説明すると、TensorFlow LiteのModel Makerライブラリを使用して、モバイルデバイス上に映っているサラダを検出するモデルを構築してスマホ上で動かします。

TensorFlowのGithubに物体検出のAndroidアプリのサンプルコードがあるので、それをスマホで動かせば一発ですが、
今回は理解を深めるという意味でもエッジAIの基本的な実装の流れをTensorFlowの公式ドキュメントを参考に進めていきます。

環境

  • Google colab
  • TensorFlow Lite
  • android studio
  • Galaxy S8

機械学習のモデルを学習

必要なパッケージをインストール

!pip install -q tflite-model-maker
!pip install -q pycocotools
!pip install -q tflite-support

必要なパッケージをインポート

import numpy as np
import os

from tflite_model_maker.config import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import object_detector

import tensorflow as tf
assert tf.__version__.startswith('2')

tf.get_logger().setLevel('ERROR')
from absl import logging

データセットをgs://cloud-ml-data/img/openimage/csv/salads_ml_use.csvから入手。

# トレーニング用の画像175枚、検証用の画像25枚、テスト用の画像25枚
# サラダ, シーフード, トマト, パン類, チーズの5つのクラス
train_data, validation_data, test_data = object_detector.DataLoader.from_csv('gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv')

このデータセットには、トレーニング用の画像175枚、検証用の画像25枚、テスト用の画像25枚が含まれ、サラダ, シーフード, トマト, パン類, チーズの5つのクラスがあります。

データセットには、オブジェクトのラベルとともに、各オブジェクトの場所を指定するバウンディングボックスが含まれています。


物体検出モデルのアーキテクチャを選択。
モバイル/IoTに適したEfficientDet-Liteモデルを使用します。

spec = model_spec.get('efficientdet_lite2')

学習データを用いてTensorFlowモデルを学習させます。

model = object_detector.create(train_data, model_spec=spec, batch_size=8, train_whole_model=True, validation_data=validation_data)

モデルの軽量化とtflite形式への変換

学習したモデルをそのままAndroid上で推論できないので、TensorFlow Liteモデルへの変換をしてエクスポートします。

この時に量子化が行われます。デフォルトは完全整数量子化です。
ユースケースによって最適な量子化手法がTensorFlowのサイトに載っています。

今回はデフォルトのままいきます。

model.export(export_dir='.',tflite_filename='model.tflite')

デバイス上で実行する

Androidアプリをビルドしていきます。まずはAndroid Studioをインストールします。

TensorFlowのサンプルソースコードをコンピュータの任意の場所にcloneします。

git clone https://github.com/tensorflow/examples

Android Studioを開き、File > open から先ほどcloneしたソースコードフォルダの
examples/lite/examples/object_detection/android を開きます。
※読み込みに少し時間がかかります。



次に、android/app/src/main/assetsフォルダに変換したtfliteファイルを配置して、
※なければFile > New > Folder > Assets > Folderで作成。



ObjectDetectorHelper.ktで指定しているモデルのファイル名を先ほど配置したファイル名に書き換えます。

val modelName =
    when (currentModel) {
        MODEL_MOBILENETV2 -> "model.tflite"
//        MODEL_EFFICIENTDETV0 -> "efficientdet-lite0.tflite"
//        MODEL_EFFICIENTDETV1 -> "efficientdet-lite1.tflite"
//        MODEL_EFFICIENTDETV2 -> "efficientdet-lite2.tflite"
        else -> "model.tflite"
    }

あとは、Androidデバイスをコンピュータに接続して、アプリを実行します。

結果はこちら↓



無事、サラダ検出モデルをAndroidデバイスで動かすことができました!

まとめ

なんとか、学習モデルをエッジデバイス上で動かすことができました。
今回はTensorFlow LiteのModel Makerというライブラリを使いましたが、調べていくと別の実装方法などもあるようなので、さらに知識を深めていきたいです。
あと、Androidアプリの部分も丸々サンプルコードを使ったりしたので、もう少し理解を深めていきたいと思います。

最後までご覧いただき、ありがとうございました!