はじめに
この記事は NCC Advent Calendar 2019の9日目の記事です
Google Colaboratory上でTensorFlow Object Detection APIを用いて学習したモデルをtfliteに変換するまでの手順を見つけ出せたので共有します。
###前提条件
アノテーションや学習をすでに済ませており、手元に.pdファイルがあることを前提としています。モデルを作成するまでの手順は下記の記事を参考にしてください。
Tensorflow Object Detection API : Google Colaboratory環境で学習を実行する(環境構築)
TensorFlowの「Object Detection API」で物体検出の自前データを学習する方法
###実行環境
学習まではColabで行っています
以下、ローカルPCでの実行環境です
OS: macOS Catalina 10.15.1
CPU: Intel Core i5 2.3GHz
GPU: Intel Iris Plus Graphics 655 1536 MB
メモリ: 16 GB 2133 MHz LPDDR3
Bazel: v0.29.1
#学習の際に用いたConfigファイルを確認する
TensorFlow Liteのモデルは、量子化されている必要があります。デフォルトではその設定がされていないはずので、まず最初に自分が学習の際に用いたConfigファイルに以下のような内容が含まれているかどうか確認してください。含まれていない場合、変換できても意味不明な認識結果になるだけなので含めてから学習をやり直してください。頑張ってね。
graph_rewriter {
quantization {
delay: 1800
activation_bits: 8
weight_bits: 8
}
}
#tfliteに変換
ここからはColab上ではなくPC上で作業を行います。ColabでGoogleドライブをマウントさせる際のディレクトリ名 /content/drive/My Drive/
にスペースが含まれており、その下で変換の際に用いるBazelというビルドツールを実行することができない問題があるためPC上での作業が必要となります。.pdファイルをドライブからPC上の任意のディレクトリに置いておいてください。
###TensorFlowをインストール
下記二つのコマンドを実行
pip install tensorflow
git clone https://github.com/tensorflow/tensorflow.git
###Bazelをインストール
以下のページを参考にしてBazelをインストールしてください。
https://docs.bazel.build/versions/master/install-os-x.html#install-with-installer-mac-os-x
###ついに変換!
tensorflow
ディレクトリに移動し、下記のコマンドで必要な箇所を変更して実行してください。
bazel run -c opt tensorflow/lite/toco:toco -- --input_file=[入力ディレクトリ]/graph.pb --output_file=[出力ディレクトリ]/detect.tflite --input_shapes=1,300,300,3 --input_arrays=normalized_input_image_tensor --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' --inference_type=QUANTIZED_UINT8 --mean_values=128 --std_values=128 --change_concat_input_ranges=false --default_ranges_min=0 --default_ranges_max=6 --allow_custom_ops
detect.tfliteというファイルが出てきたら大成功です!
#終わりに
かなりかっ飛ばした感ありますけどできました?書いてみると意外とあっさりとできる感じがしますが、この方法探し当てるまでに二ヶ月かかってるんですよねー... まあそんなもんですよね (^^)b
#参考ページ
Tensorflow Object Detection API : Google Colaboratory環境で学習を実行する(環境構築)
TensorFlowの「Object Detection API」で物体検出の自前データを学習する方法
Training and serving a realtime mobile object detector in 30 minutes with Cloud TPUs