efficientnetで推論させてみる

学習部分についてはこちらに書いた。

efficientnetで学習させてみる - MEMOcho-

今回はその続きとして学習したモデルで推論を行ってみたのでメモ

推論

学習済みモデルをローカルに落として使う 学習時のコマンドで指定した--model_dirに生成物が出力される。以下のように指定したとすると

--model_dir=gs://<bucket name>/dataset/model

学習済みモデルは以下のようにして落とせる

gsutil -m cp gs://<bucket name>/dataset/model/archive ./

archiveの中には最もvalidationスコアの良かった時点のモデルパラメータが保存されている

ローカルで使う際に必要なのは以下の2点

  1. archive/checkpointに書いてあるモデルファイルへのpathを修正
  2. labels_map.txtを作成(label idとlabel nameのmap)

1.について、archive/checkpointの中を見ると以下のようになっているので、カレントディレクトリのモデルファイルを指すように修正する

- model_checkpoint_path: "../../../../../model.ckpt-39916"
- all_model_checkpoint_paths: "../../../../../model.ckpt-39916"
+ model_checkpoint_path: "model.ckpt-39916"
+ all_model_checkpoint_paths: "model.ckpt-39916"

2.については以下のようなjson形式のファイルが必要になる

{"0": "label name 0",  "1": "label name 1", ...}

jsonのkeyとなるインデックスはデータセット作成時に決まるものであり、以下のように処理されているためlabel nameの辞書順になる

https://github.com/tensorflow/tpu/blob/7e0ad3aabe888ce25599c5d9cbd804e99714f060/tools/datasets/imagenet_to_gcs.py#L394,L395

評価はこちらのスクリプトを使う

https://github.com/tensorflow/tpu/blob/7e0ad3aabe888ce25599c5d9cbd804e99714f060/models/official/efficientnet/eval_ckpt_main.py#L126

runmodeがexamplesなら渡した画像のラベルを推論、imagenetであれば指定したディレクトリにある画像でaccuracyを計算できる。

cd <tpu repo>
# 指定したjpgの推論結果top5を出力
python models/official/efficientnet/eval_ckpt_main.py --model_name efficientnet-b0 --runmode examples --ckpt_dir ./archive --example_img /tmp/test.jpg --labels_map_file ./labels_map.txt
# 指定したディレクトリのjpgでaccuracyを計算
python models/official/efficientnet/eval_ckpt_main.py --model_name efficientnet-b0 --runmode imagenet --ckpt_dir ./archive --imagenet_eval_glob /tmp/test_images/*.jpg --imagenet_eval_label /tmp/test_images/eval_label

--imagenet_eval_labelに指定するファイルはtest用画像のlabel idのリスト(label nameで辞書順sortしたもの)