1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Chrome Bookでtensorflow lite動かしてみた

Last updated at Posted at 2021-06-22

エッジデバイスで動かせる画像認識ライブラリとして有名なtensorflow liteを2 in 1 のChromeBook動かしてみました。

環境

  • Chromebook(Lenovo ideapad duet)
  • Python 3.7.3

手順

予めLinuxを有効化したChromeBookで作業することを前提にしています。

以下チュートリアルを参考にしています。

numpy,pillow,tensorFlow Liteのインストール

pip install numpy
pip install Pillow
# python3.7のarm64用のtensorFlow liteをインストール
pip install https://dl.google.com/coral/python/tflite_runtime-1.14.0-cp37-cp37m-linux_aarch64.whl

model・labelのダウンロード

以下コマンドでサンプルのモデルファイルとラベルをダウンロードしてきます。

curl -O https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_1.0_224_quant_and_labels.zip
unzip mobilenet_v1_1.0_224_quant_and_labels.zip -d /tmp
rm mobilenet_v1_1.0_224_quant_and_labels.zip

上記で/tmpにモデル・ラベルファイルがダウンロードできました。

画像認識処理を実装

チュートリアルに習ってtensorFlow Liteの画像認識処理を実装していきます。
ここでは画像を引数に指定することによってその認識結果を標準出力しています。
※チュートリアルではカメラの映像にバウンディングボックスと認識結果を表示させるものでしたが、現状ChromeBookのLinuxからデバイスのカメラにはアクセスできないようです。

main.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import io
import time
import numpy as np

from PIL import Image
from tflite_runtime.interpreter import Interpreter


def load_labels(path):
  with open(path, 'r') as f:
    return {i: line.strip() for i, line in enumerate(f.readlines())}


def set_input_tensor(interpreter, image):
  tensor_index = interpreter.get_input_details()[0]['index']
  input_tensor = interpreter.tensor(tensor_index)()[0]
  input_tensor[:, :] = image


def classify_image(interpreter, image, top_k=1):
  """Returns a sorted array of classification results."""
  set_input_tensor(interpreter, image)
  interpreter.invoke()
  output_details = interpreter.get_output_details()[0]
  output = np.squeeze(interpreter.get_tensor(output_details['index']))

  if output_details['dtype'] == np.uint8:
    scale, zero_point = output_details['quantization']
    output = scale * (output - zero_point)

  ordered = np.argpartition(-output, top_k)
  return [(i, output[i]) for i in ordered[:top_k]]


def main():
  parser = argparse.ArgumentParser(
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)
  parser.add_argument(
      '--model', help='File path of .tflite file.', required=True)
  parser.add_argument(
      '--labels', help='File path of labels file.', required=True)
  parser.add_argument(
      '--image', help='File path of labels file.', required=True)
  args = parser.parse_args()
 
  labels = load_labels(args.labels)

  interpreter = Interpreter(args.model)
  interpreter.allocate_tensors()
  _, height, width, _ = interpreter.get_input_details()[0]['shape']

  image = Image.open(args.image).convert('RGB').resize((width,height),Image.ANTIALIAS)
  results = classify_image(interpreter, image)
  label_id, prob = results[0]
  print('result:::: {0} {1}'.format(labels[label_id],prob))

if __name__ == '__main__':
  main()

画像認識処理の実行

以下画像を使用

フリー写真, 食べ物(写真), 果物(フルーツ), バナナ, 白背景

python3 main.py \
  --model /tmp/mobilenet_v1_1.0_224_quant_edgetpu.tflite \
  --labels /tmp/labels_mobilenet_quant_v1_224.txt \
  --image banana.jpg

認識できたようです。

INFO: Initialized TensorFlow Lite runtime.
result:::: banana 0.99609375

何も特に考えずサクッと試せるのがいいですね。画像認識のフレームワークは敷居が高く、動かすにはハイスペックなマシンが必要だというイメージが有りましたが、3万円くらいの端末で簡単に試すことができます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?