【Edge TPU】Edge TPUモデルを作成して、Edge TPU + Raspberry Piで実行させる
目次
はじめに
こんにちは、がんがんです。
Edge TPUのアップデートが行われて新しいモデルが追加されていました。
デモはいろいろ試してみたので次は自作モデルでの推論を行っていきたいものです。
そこで公式サイトを参考にしながら転移学習を行っていこうと思います。
目的
- 公式サイトを参考にして花の転移学習モデルを作成してみる
- ラズパイにて再学習モデルを実行してみる
実験(コンテナ準備〜コンテナ実行)
基本的には公式サイトを参考してもらえればと思います。
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
を用いて再学習を試してみます。