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