前回、画像認識の仕組みについて解説しましたが、今回は実際にプログラムを動かして画像認識(識別)をやってみようと思います。
最近は手順も簡素化されたり軽量化されたりして、エッジデバイスでも簡単に実装できるようになってきました。
今回はTensorflow-liteを使って画像の識別を行っていきます。

いろいろ、解説サイトが存在しますが、どれも情報が古かったりわかりにくかったりしたので、結局正規サイトを参考にしました。

TensorFlow-Lite Python クイックスタート

環境作成

OSは、RaspberryPiでも同じ手順で実施できるようにUbuntu-Mate20.10を使用します。
VirturalBoxの仮想環境にUbuntuをインストールして環境を作ります。
VirturalBoxの設定は以下の通り。

OS:Ubuntu-Mate 20.10
CPU:2CPU
MEMORY:4GB
STRAGE:32GB
OSユーザ:pi

※今回はOSセットアップ手順は飛ばします。

OSのセットアップが終わったら、お約束のアップデート後、Pythonなど必要なライブラリをインストールしていきます。

sudo apt update -y
sudo apt upgrade -y
sudo apt -y install python3-pip python3-distutils python3-dev protobuf-compiler python3-pil python3-lxml python3-pip python3-dev git curl

サンプルデータのダウンロード

今回使うデータをダウンロードします。

参考(TensorFlow Lite Python image classification demo

今回の識別対象となる写真

curl https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp > /tmp/grace_hopper.bmp

サンプルの学習済みモデル

curl https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_224.tgz | tar xzv -C /tmp

学習済みモデルのラベル定義

curl https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_1.0_224_frozen.tgz  | tar xzv -C /tmp  mobilenet_v1_1.0_224/labels.txt
mv /tmp/mobilenet_v1_1.0_224/labels.txt /tmp/

サンプルモデルは服の種類に関する分類器のようです。
labels.txtを見ると何百の種類が分類できるのがわかります。
サンプルの画像はおじいちゃんの軍服姿です。

これを画像認識して「軍服」と出れば正解ということになります。

Pythonライブラリインストール

特に必要というわけではありませんが、念のためvenv環境で実装していきます。
Pythonライブラリのインストールはpipenvで行います。
※不要な場合は飛ばして構いません。

sudo pip3 install pipenv
mkdir tensorflow-lite-tutorial
cd tensorflow-lite-tutorial
pipenv --python 3.8
pipenv shell

Pythonライブラリをインストールしていきます。

pip install matplotlib
pip install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp38-cp38-linux_x86_64.whl

今回はUbuntu-Mateを使用しているため「」ですが、使用するOSなどによってWHLファイルを選ぶ必要があります。
それぞれのWHLのURLは正規サイトにありますので、必要なものに書き換えてください。

テストプログラムダウンロード

テスト用のプログラムをダウンロードします。

wget https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/examples/python/label_image.py

正規サイトのチュートリアルにある通り修正しますが、64行目も修正しないと動かないので合わせて修正します。

26: # import tensorflow as tf
    import tflite_runtime.interpreter as tflite

63: #   interpreter = tf.lite.Interpreter(
64: #       model_path=args.model_file, num_threads=args.num_threads)
      interpreter = tflite.Interpreter(
          model_path=args.model_file)

画像認識実行

label_image.pyを実行してみます。

python label_image.py \
  --model_file /tmp/mobilenet_v1_1.0_224.tflite \
  --label_file /tmp/labels.txt \
  --image /tmp/grace_hopper.bmp

結果はこんな感じ

0.919721: 653:military uniform
0.017762: 907:Windsor tie
0.007507: 668:mortarboard
0.005419: 466:bulletproof vest
0.003828: 458:bow tie, bow-tie, bowtie
time: 110.053ms

結果、「military uniform」となりました。
ちゃんと識別できてますね。

まとめ

今回はサンプルの分類器を使って画像認識(識別)を行いました。
サンプルプログラム(label_image.py)で分類器を読み込んで処理を行っていますが、意外と汎用的に使えるサンプルプログラムとなってます。
次回は、 tensorflow-lite の model-maker を使って分類器を自作してみようと思います。