IT実験のブログ

IT関連のツールの使い方など

Tensorflowのinceptionという画像認識のexampleを試す(実際に花の画像を認識させる)(失敗2)

今回は、先日(2020/2/15)生成したflowersを認識するDNNモデルを使って、実際に花の画像を認識させてみたいと思います。

先日生成したものは、チェックポイントなので、FrozenGraphDefという形式(pbファイル)に変換する必要があります。

まず、GraphDefをエクスポートするために、訓練処理のプログラムを書き換えて訓練処理をすると同時にGraphDef(pbファイル)のエクスポートもするように修正します。

~/AI/models/research/inception/inception の inception_train.py の335行目に下のコードを挿入します。

    graph_def = sess.graph.as_graph_def()
    tf.train.write_graph(graph_def,"/tmp/","flowers_graph_def.pb",as_text=False)
    tf.train.write_graph(graph_def,"/tmp/","flowers_graph_def_txt.pbtxt",as_text=True)

f:id:itlab7:20200222144154p:plain

訓練処理をする際に GraphDefを /tmp/flowers_graph_def.pb に保存するようにしました。 ついでにテキスト形式のファイルも保存してみます。

すぐ終わるようにmax_stepsを1にして訓練処理を走らせます。

cd ~/AI/models/research/inception
bazel-bin/inception/flowers_train \
   --train_dir="/tmp/flowers_train10/" \
   --data_dir="${HOME}/AI/inception/flowers-data/" \
   --pretrained_model_checkpoint_path="${HOME}/AI/inception-v3-model/inception-v3/model.ckpt-157585" \
   --fine_tune=True \
   --initial_learning_rate=0.001 \
   --input_queue_memory_factor=1 \
   --max_steps=1

f:id:itlab7:20200222145136p:plain

訓練処理が終わりました。

f:id:itlab7:20200222145232p:plain

/tmp にGraphDefファイルが生成されています。 テキスト形式のものもあります。

f:id:itlab7:20200222181057p:plain

今後使うかもしれないので、~/AI/inception にコピーして取っておきました。

FrozenGraphDefを作成するためのツールを実行します。

cd ~/.local/lib/python3.6/site-packages/tensorflow_core/
python3 python/tools/freeze_graph.py \
   --input_graph=/tmp/flowers_graph_def.pb \
   --input_checkpoint=${HOME}/AI/inception/flowers_train/model.ckpt-499 \
   --input_binary=true \
   --output_graph=${HOME}/AI/inception/flowers_frozen_graph_def.pb \
   --output_node_names=save_1/control_dependency

※output_node_namesに指定したsave_1/control_dependency

Tensorflowのinceptionという画像認識のexampleを試す(実際に花の画像を認識させる)(失敗) - IT実験のブログ

こちらのブログでビルドしたsummarize_graphというツールを使って調べました。 このツールを使って一番最後に表示されたノード名を指定しています。

f:id:itlab7:20200222181221p:plain

FrozenGraphDefが作成されました。

f:id:itlab7:20200222181808p:plain

~/AI/models/tutorials/image/imagenet の classify_image.py を ~/AI/inception にコピーして、名前をflowers_classify_image.py に変更しておきます。

そして、このプログラムの内容を下記のように修正します。

main関数の1行目をコメントアウトします。

def main(_):
#  maybe_download_and_extract()
  image = (FLAGS.image_file if FLAGS.image_file else
           os.path.join(FLAGS.model_dir, 'cropped_panda.jpg'))
  run_inference_on_image(image)

63行目を下のように変更します。

          FLAGS.model_dir, 'imagenet_2012_challenge_label_map_proto.pbtxt')
          ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
          FLAGS.model_dir, 'flowers_label_map_proto.pbtxt')

66行目を下のように変更します。

          FLAGS.model_dir, 'imagenet_synset_to_human_label_map.txt')
          ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
          FLAGS.model_dir, 'flowers_label_map.txt')

124行目を下のように変更します。

      FLAGS.model_dir, 'classify_image_graph_def.pb'), 'rb') as f:
          ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
      FLAGS.model_dir, 'flowers_frozen_graph_def.pb'), 'rb') as f:

~/AI/inception に下記の2つのファイルを作成します。

flowers_label_map_proto.pbtxt

# -*- protobuffer -*-
# LabelMap
entry {
  target_class: 1
  target_class_string: "n00000001"
}
entry {
  target_class: 2
  target_class_string: "n00000002"
}
entry {
  target_class: 3
  target_class_string: "n00000003"
}
entry {
  target_class: 4
  target_class_string: "n00000004"
}
entry {
  target_class: 5
  target_class_string: "n00000005"
}

flowers_label_map.txt

n00000001    daisy
n00000002   dandelion
n00000003   roses
n00000004   sunflowers
n00000005   tulips

f:id:itlab7:20200222190244p:plain

花の画像を認識するためのプログラムを実行します。

cd ~/AI/inception
python3 flowers_classify_image.py --model_dir=${HOME}/AI/inception --image_file=${HOME}/AI/imagenet/sunflower.jpg

f:id:itlab7:20200222193859p:plain

エラーが出ました。 残念ながら、またしても失敗です。 ちょっと良くわからなくなってきました。 まだまだTensorflowについて勉強不足かもしれません。 また何か進展がありましたら、書きたいと思います。

今回はここまでです。