YOLOv4 を tflite に convert する
https://medium.com/@nobilearn/264be244e7af
にて利用した convert_tflite.py のコードに気になる所があったので、検証してみました。
当該の箇所
_
問題を発見したのは、converter を生成する前の箇所です。
def save_tflite():
NUM_CLASS = len(utils.read_class_names(cfg.YOLO.CLASSES))
input_layer = tf.keras.layers.Input([FLAGS.input_size, FLAGS.input_size, 3])
if FLAGS.tiny:
( omit )
else:
if FLAGS.model == 'yolov3':
feature_maps = YOLOv3(input_layer, NUM_CLASS)
bbox_tensors = []
for i, fm in enumerate(feature_maps):
bbox_tensor = decode(fm, NUM_CLASS, i)
bbox_tensors.append(bbox_tensor)
model = tf.keras.Model(input_layer, bbox_tensors)
utils.load_weights_v3(model, FLAGS.weights)
elif FLAGS.model == 'yolov4':
( omit ) model = tf.keras.Model(input_layer, bbox_tensors)
model.summary()
utils.load_weights(model, FLAGS.weights)converter = tf.lite.TFLiteConverter.from_keras_model(model)
FLAGS.model が 'yolov3' か 'yolov4' かを判定している if - elif 文の scope を出た後、model が再度生成されています。
しかも yolov3 の場合、初回は
utils.load_weights_v3( model, FLAGS.weights)
なのに、上書き箇所は
utils.load_weights( model, FLAGS.weights)
です。これはまずそうです。
検証してみました
_
実行環境は前回と同様 Google Colab. を利用します。
まずは Darknet と YOLO の開発者である pjreddie さんの yolov3.weights を Colab. 上に準備します。
download には結構時間がかかりましたので、mirror をご存知の方は URL を差し替えた方が良いかもしれません。
(私は代わりに手持ちのファイルを upload しましたが、そちらでも結構かかりました。)
!wget -c -t 0 https://pjreddie.com/media/files/yolov3.weights
続いて hunglc007 さんのリポジトリを git clone します。
!git clone https://github.com/hunglc007/tensorflow-yolov4-tflite.git
%cd /content/tensorflow-yolov4-tflite/
本日時点の Colab. の tensorflow-addons が requirement に満たないため upgrade します。
!pip3 install -U tensorflow-addons
yolov3.weights の convert を試してみます。
!time python3 convert_tflite.py --model yolov3 --weights /content/yolov3.weights --output /content/yolov3-int8.tflite
ValueError: You called `set_weights(weights)` on layer "conv2d_58" with a weight list of length 1, but the layer was expecting 2 weights. Provided weights: ...
やっぱりエラーになってしまいました
当該箇所を上書きが起こらないように修正します。
diff --git a/convert_tflite.py b/convert_tflite.py
index d36c5bc..4d7e08b 100644
--- a/convert_tflite.py
+++ b/convert_tflite.py
@@ -58,9 +58,7 @@ def save_tflite():
model = tf.keras.Model(input_layer, bbox_tensors)
utils.load_weights(model, FLAGS.weights)
- model = tf.keras.Model(input_layer, bbox_tensors)
- model.summary()
- utils.load_weights(model, FLAGS.weights)
+ model.summary()
converter = tf.lite.TFLiteConverter.from_keras_model(model)
if FLAGS.quantize_mode == 'int8':
ついでに、yolov3-tiny の時にも model.summary() を通るように indent を調整しました。
Colab. に upload し、ファイルを置き換えます。
%mv /content/convert_tflite.py /content/tensorflow-yolov4-tflite/
再度実行してみます。
!time python3 convert_tflite.py --model yolov3 --weights /content/yolov3.weights --output /content/yolov3-int8.tflite
今度はきちんと処理が完了し、yolov3-int8.tflite ファイルが生成されました。
修正内容を pull request してみます
_
些細な修正なので accept されるか分かりませんが、せっかく直したので pull request してみます。
リクエストする先の開発者と同じリポジトリを共有しているのでない場合、以下のような手順で pull request します。
- 修正対象のリポジトリを fork する
- 新しく branch を作る
- コードを修正し commit, push する
- fork 元リポジトリで pull request する
ここからのコマンドは Colab. ではなくローカル PC のターミナルです。
まずは GitHub にログインし、元リポジトリの Fork ボタンを押して fork し、git clone します。
$ git clone https://github.com/nobilearn/tensorflow-yolov4-tflite.git
~/.gitconfig と user.name 及び user.email が異なる場合は設定します。
(以下は私の場合の例なので、このまま入力しないでくださいね。)
$ git config user.name 'nobi'
$ git config user.email 'nobilearn@users.noreply.github.com'$ git config -l | grep ^user | tail -n 2
user.name=nobi
user.email=nobilearn@users.noreply.github.com
新しく branch を作ります。
ここでは fix_yolov3_convert とします。
$ git checkout -b fix_yolov3_convert$ git branch -a
* fix_yolov3_convert
master
remotes/origin/HEAD -> origin/master
remotes/origin/fix_yolov3_convert
remotes/origin/master
修正し commit します。(割愛)
以下、コミットログです。
$ git log -2
commit bbecd37d374503529bf46cdb867091532b9b9084 (HEAD -> fix_yolov3_convert)
Author: nobi <nobilearn@users.noreply.github.com>
Date: Thu May 14 23:35:22 2020 +0900fix error on TF 2.2.0 : 'tf.ResizeNearestNeighbor' op is neither a custom op nor a flex op.commit a80abc4f6424b5eb34d6b51ef07b4913f8aa96a1
Author: nobi <nobilearn@users.noreply.github.com>
Date: Thu May 14 23:26:38 2020 +0900fix override in the case of yolov3 model; committed as a2903f7e6fe6e780bdd430e02d6a87f75db69513.
修正を push します。
新しい branch なので、--set-upstream します。
$ git push --set-upstream origin fix_yolov3_convert
push したら fork 元の hunglc007 さんのリポジトリに移動し、Compare & pull request のボタンを押します
コメントを記載して Create pull request のボタンを押します。
以下の例ではスペルミスが多発していますが、きちんと赤の破線で指摘してくれていますね。ボタンを押す前に、よく確認した方が良いですね…。
これで無事に pull request が生成されました。
Commits のタブで commit の内容が確認できますので、もう一度内容を確認しておきましょう。
owner の hunglc007 さんに LGTM されれば、merge される運びとなります。
今回の内容は以上です。
ご精読頂き、まことにありがとうございます。
幸いこの pull request は無事に merge されましたので、次回は pull request が merge された後、fork したリポジトリの片付けについてです。
https://medium.com/@nobilearn/6fa138921c93