【Edge TPU】Edge TPUモデルを作成して、Edge TPU + Raspberry Piで実行させる

はじめに

こんにちは、がんがんです。
Edge TPUのアップデートが行われて新しいモデルが追加されていました。
デモはいろいろ試してみたので次は自作モデルでの推論を行っていきたいものです。
そこで公式サイトを参考にしながら転移学習を行っていこうと思います。

目的

  • 公式サイトを参考にして花の転移学習モデルを作成してみる
  • ラズパイにて再学習モデルを実行してみる

環境

学習環境

  • ローカルOS:Ubuntu 18.04
  • 学習環境:Docker

実行環境

実験(コンテナ準備〜コンテナ実行)

基本的には公式サイトを参考してもらえればと思います。

1. Docker環境の準備

まずは転移学習を行うためにDockerの環境を準備します。準備はこちらにまとめておきました。
gangannikki.hatenadiary.jp

2. ディレクトリを作成し、Docker buildを行う

次にディレクトリおよびコンテナの準備を行います。

$ CLASSIFY_DIR=${HOME}/edgetpu/classify && mkdir -p $CLASSIFY_DIR
$ cd $CLASSIFY_DIR
$ wget -O Dockerfile "https://storage.googleapis.com/cloud-iot-edge-pretrained-models/docker/classify_docker"
$ sudo docker build - < Dockerfile --tag classify-tutorial

以下のコマンドでDocker runを行います。

$ docker run --name edgetpu-classify \
--rm -it --privileged -p 6006:6006 \
--mount type=bind,src=${CLASSIFY_DIR},dst=/tensorflow/models/research/slim/transfer_learn \
classify-tutorial

試しにDockerコンテナを確認してみます。2つのリポジトリが出来ています。

$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
classify-tutorial
tensorflow/tensorflow

3. データセットの準備を行う

$ ./prepare_checkpoint_and_dataset.sh --network_type mobilenet_v1

4. モデルのトレーニング(今回は最終層のみ)を行います

以下のコマンドで転移学習を行います。今回は最終層のみを再学習しています。

$ ./start_training.sh --network_type mobilenet_v1

レーニングが終了したら評価スクリプトを実行してみます。

$ ./run_evaluation.sh --network_type mobilenet_v1
# 出力のうちAccuracy部分のみを掲載
To construct input pipelines, use the `tf.data` module.
INFO:tensorflow:Evaluation [1/4]
INFO:tensorflow:Evaluation [2/4]
INFO:tensorflow:Evaluation [3/4]
INFO:tensorflow:Evaluation [4/4]
eval/Recall_5[1]eval/Accuracy[0.745]

5. 出力モデルをtfliteモデルに変更する

$ ./convert_checkpoint_to_edgetpu_tflite.sh --network_type mobilenet_v1 --checkpoint_num 300

実験(Ubuntu上)

次にターミナル上でEdge TPU Compilerを用いてコンパイルを行います。すでにedgetpuを導入済みであれば以下のコマンドはスルーしてください。

$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
$ sudo apt update
$ sudo apt install edgetpu

edgetpu_compilerを用いてコンパイルを行います。
公式ではcd $HOME/edgetpu/classify/modelsで実行するように書いていますが、ここで実行するとInternal compiler error. Aborting! が表示されました。

$ cd edgetpu/classify
$ edgetpu_compiler models/output_tflite_graph.tflite

モデルのテストを行ってみる

花の写真をダウンロードし、ラズパイ側で実行してみます。

# ダウンロード
$ wget https://c2.staticflickr.com/9/8374/8519435096_45e27efd0d_o.jpg -O ${CLASSIFY_DIR}/flower.jpg
# scpコマンドで移行
$ scp ${CLASSIFY_DIR}/output_tflite_graph_edgetpu.tflite ${CLASSIFY_DIR}/models/labels.txt ${CLASSIFY_DIR}/flower.jpg pi@xxx.xxx.xxx.xxx:~/edgetpu_transfer

edgetpu/demoに移動して実行してみます。本家との差分としては--input--imageにしないといけない点です。

$ python3 classify_image.py \
--model ~/edgetpu_transfer/output_tflite_graph_edgetpu.tflite \
--label ~/edgetpu_transfer/labels.txt \
--image ~/edgetpu_transfer/flower.jpg

実行結果はこんな感じです。75%くらいのモデルでもある程度は精度が出てますね。

---------------------------
sunflowers
Score :  0.585938
---------------------------
tulips
Score :  0.25
---------------------------
dandelion
Score :  0.128906

試しに別の画像でも試してみます。以前転移学習の回で使用したひまわりの画像を使用してみます。実行結果はこんな感じでした。

$ python3 classify_image.py --model ~/edgetpu_transfer/output_tflite_graph_edgetpu.tflite --label ~/edgetpu_transfer/labels.txt --image ~/edgetpu_transfer/sunflower.jpg
---------------------------
sunflowers
Score :  0.792969
---------------------------
dandelion
Score :  0.1875

おわりに

今回は公式サイトに沿ってEdge TPUのモデルを作成してみました。初めてのDockerだったので少し苦戦しましたが意外と手順通りに行うことが出来ました。

次回は公式のGitHubに公開されているimprinting_learning.pyを用いて再学習を試してみます。