Keras YOLO v3 学習済モデルを、Tensorflow Lite に変換して動かす。

今回は、Keras YOLO v3 学習済モデルを、Tensorflow Lite に変換して動かす所迄、試してみます。

Keras YOLO v3 は、下記になります。
https://github.com/qqwweee/keras-yolo3

開発環境
OS: Windwos10
GPU: GeForece GTX 1070 8GB
Anaconda
Python3.6
TensorFlow 1.15.0 GPU
Keras 2.3.1

注1) 今回は、TensorFlow 1.15.0 を使いました。
TensorFlow 1.14.0 では、Tensoflow Liteへの変換が上手く行きませんでした。
注2)  Keras は、オリジナルを使っています。
tensorflow.keras を敢えて使っていません。但し、Tensorflow Lite へ変換するには、
基本は、tensorflow.keras の様ですが?

1.  お決まりの、git clone を行います。

>git clone https://github.com/qqwweee/keras-yolo3.git
>cd keras-yolo3

2. 説明に従って、COCO 学習済 h5  ファイルを作成します。

>wget https://pjreddie.com/media/files/yolov3.weights
>python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

これで、 model_data\yolo.h5 の COCO学習データで学習したモデルが出来ます。

3. 後は、実際に判定出来る事を確認します。

>python yolo_video.py --image
Input image filename: xxxx.jpg    <--- 適当な画像ファアイルを指定します。

Object Detect された画像が表示されれば、OK です。

さてここからが本題です。


4. model_data/yolo.h5 ファイルを、TensorFlow Lite 形式のファイル(xxx.tflite) に変換します。

yolo3_h5toTF.py

>python yolo3_h5toTF.py
これで、カレントディレクトリに、 xxx.tflite ファイルが作成されます。

5. Tensorflow Lite での実行です。
その前に、Keras VOLO v3 の モデルの出力形式について触れて置きます。

model_data/yolo.h5 の model.summary() を実行してみれば分かりますが。
3個の畳み込みレイヤーで、終わっています。

ここから先は、model 外で、自分で boxes, scores, classes を求めないといけない、との事です。

それは、yolo.py の中の class YOLO(object): の def generate(self): メソッドの中の最後の
箇所で、yolo_eval() をコールして、boxes, scores, classes 計算しています。
つまり、yolo_eval() をコールすれば、良いと言う事の様です。
 

yolo_eval() は、 yolo3\moddel.py の中にあります。

TensorFlow Lite では、Numpyに変換した画像を、model に入力して、予測の実行を、下記で行います。

      interpreter.set_tensor(input_details[0]['index'], image_data)
      interpreter.invoke()

その後、予測結果を下記コードで取出して
interpreter.get_output_details()

得られる、3つのNumpy 配列 (前述の、yolo v3 model 出力の3個の畳み込みレイヤーに該当) を
yolo_eval() へ渡してあげると、boxes, scores, classes が計算されます。
但し、 yolo_eval() の処理は、Tensorflow 空間 になります。

その後は、得られた boxes, scores, classes から、入力画像上に、検出ボックスを描画します。

入力画像を取り込んで、Model へ渡して、出力されたboxes, scores, classes から、ボックスを描画
するところは、yolo.py の中の def detect_image(self, image): が参考になります。

但し、入力画像の resize は、
https://github.com/peace195/tensorflow-lite-YOLOv3
の中の、tflite_example.py の def letter_box_image(): が使えます。

入力画像は、 416 x 416 にリサイズして、 / 255 して正規化します。
また、def letter_box_image(): で算出した、 fit_ratio, pad_top, pad_left は、
後の、ボックスの描画で必要になるので、コール元に一緒に返します。

プログラムは、下記となります。

yolo_video_tflite.py

カレントディレクトリに、image1.jpg を置いておいて、

>python yolo_video_tflite.py 


今回は、model の実行は、Tensorflow Lite で、その後は、Tensorflow での後処理のコンボになります。

この後は、Tensorflow Lite への変換で、UINT8 に quantized 出来るか試してみて、
それが出来れば、Coral Edge TPU USB で試してみたいです。 

このブログ記事について

このページは、おんちゃんが2020年7月11日 16:46に書いたブログ記事です。

ひとつ前のブログ記事は「Keras CNN Sound Classify #7」です。

次のブログ記事は「Coral Edge TPU USB のサンプルの Object Detection を試す。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ