TensorFlow image classification model inception_resnet_v2 export model, with the use of freeze

1. Background

As a deep learning sprouting new project suddenly need to use the image classification model for classification, so finding a model library TensorFlow using its framework for training and follow-up operation, the project Address: https://github.com/tensorflow / Models / Tree / Master / Research, / Slim .

Before using real data set, I was the first to use a data set that provides the flowers, the model used is inception_resnet_v2, because top-5 Accuracy relatively high thing.

Then I installed the directory structure of the flowers, my data is organized in a similar structure;

Modeled download_and_convert_flowers.py increase its own data processing files convert_normal_data.py;

Modeled data sets to read the file flowers.py increased their files normal.py;

Then use the tutorial project, carried out step by step fine-tuning, up to 90 percent accuracy rate of more than stop training.

But this time when exporting the model met pit.

 

2. Export Inference Graph

In fact tutorial written very simple, it is a pilot framework model:

Saves out a GraphDef containing the architecture of the model.

Then go down to the framework of the training in good checkpoints wrote graph:

If you then want to use the resulting model with your own or pretrained checkpoints as part of a mobile model, you can run freeze_graph to get a graph def with the variables inlined

It put out a tutorial like this:

$ python export_inference_graph.py \
  --alsologtostderr \
  --model_name=inception_v3 \
  --output_file=/tmp/inception_v3_inf_graph.pb

I installed this format to change the model inception_resnet_v2, and then guided into the checkpoint, always will be reported:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [1001] rhs shape= [2]
[[{{node save/Assign_916}}]]

I found a group asked for a moment, that is the number of the last layer output model has not changed, so the idea of ​​re-Li, went to see export_inference_graph.py source code, and found a num_classes parameter is used to determine the final output layer number, so the final increase export parameters for a moment, the last command is:

python export_inference_graph.py \
  --alsologtostderr \
  --model_name=${MODEL_NAME} \
  --dataset_name=normal \
  --dataset_dir=${DATASET_DIR} \
  --output_file=/you/path/to/sava/${MODEL_NAME}_inf_graph.pb

Finally get my graph.pb.

 

3. Freeze Graph

Freeze is a pit, why, because the tutorial is given in the official use bazel to compile freeze_graph, and then use it to model freeze. Trouble come, first Ubuntu 18.04 can not be installed using apt, therefore toss, using the install script it released were installed.

Then the need for git clone TensorFlow source code compiled, and reported a lot of mistakes during this compilation, but I fail to compile, TensorFlow GPU version conda environment is not be used. . .

Finally found, or if you've been using git conda the TensorFlow installed directly

find / -name freeze_graph.py

Find out the location of this python file on the line, and finally use the command:

python tensorflow/python/tools/freeze_graph.py \
  --input_graph=/you/path/to/sava/${MODEL_NAME}_inf_graph.pb \
  --input_checkpoint=/you/trained/checkpoints/model.ckpt-10000 \
  --input_binary=true \
  --output_node_names=InceptionResnetV2/Logits/Predictions \
  --output_graph=/your/path/to/save/frozen_graph.pb

And finally export the model.

4. Use the model to predict

The main reference Bowen [deep learning - model eval +] use Tensorflow Slim model to export the model to assess training + export models , fine-tuning:

# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
 
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
 
import argparse
import os.path
import re
import sys
import tarfile
 
import numpy as np
from six.moves import urllib
import tensorflow as tf
 
FLAGS = None
 
class NodeLookup(object):
  def __init__(self, label_lookup_path=None):
    self.node_lookup = self.load(label_lookup_path)
 
  def load(self, label_lookup_path):
    node_id_to_name = {}
    with open(label_lookup_path) as f:
      for line in f:
        line_list = line.strip().split(":")
        node_id_to_name[int(line_list[0])] = line_list[1]
    return node_id_to_name
 
  def id_to_string(self, node_id):
    if node_id not in self.node_lookup:
      return ''
    return self.node_lookup[node_id]
 
 
def create_graph():
  """Creates a graph from saved GraphDef file and returns a saver."""
  # Creates graph from saved graph_def.pb.
  with tf.gfile.FastGFile(FLAGS.model_path, 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(graph_def, name='')
 
def preprocess_for_eval(image, height, width,
                        central_fraction=0.875, scope=None):
  with tf.name_scope(scope, 'eval_image', [image, height, width]):
    if image.dtype != tf.float32:
      image = tf.image.convert_image_dtype(image, dtype=tf.float32)
    # Crop the central region of the image with an area containing 87.5% of
    # the original image.
    if central_fraction:
      image = tf.image.central_crop(image, central_fraction=central_fraction)
 
    if height and width:
      # Resize the image to the specified height and width.
      image = tf.expand_dims(image, 0)
      image = tf.image.resize_bilinear(image, [height, width],
                                       align_corners=False)
      image = tf.squeeze(image, [0])
    image = tf.subtract(image, 0.5)
    image = tf.multiply(image, 2.0)
    return image
 
def run_inference_on_image(image):
  """Runs inference on an image.
  Args:
    image: Image file name.
  Returns:
    Nothing
  """
  with tf.Graph().as_default():
    image_data = tf.gfile.FastGFile(image, 'rb').read()
    image_data = tf.image.decode_jpeg(image_data)
    image_data = preprocess_for_eval(image_data, 299, 299)
    image_data = tf.expand_dims(image_data, 0)
    with tf.Session() as sess:
      image_data = sess.run(image_data)
 
  # Creates graph from saved GraphDef.
  create_graph()
 
  with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('InceptionResnetV2/Logits/Predictions:0')
    predictions = sess.run(softmax_tensor,
                           {'input:0': image_data})
    predictions = np.squeeze(predictions)
 
    # Creates node ID --> English string lookup.
    node_lookup = NodeLookup(FLAGS.label_path)
 
    top_k = predictions.argsort()[-FLAGS.num_top_predictions:][::-1]
    for node_id in top_k:
      human_string = node_lookup.id_to_string(node_id)
      score = predictions[node_id]
      print('%s (score = %.5f)' % (human_string, score))
 
 
def main(_):
  image = FLAGS.image_file
  run_inference_on_image(image)
 
 
if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument(
      '--model_path',
      type=str,
  )
  parser.add_argument(
      '--label_path',
      type=str,
  )
  parser.add_argument(
      '--image_file',
      type=str,
      default='',
      help='Absolute path to image file.'
  )
  parser.add_argument(
      '--num_top_predictions',
      type=int,
      default=5,
      help='Display this many predictions.'
  )
  FLAGS, unparsed = parser.parse_known_args()
  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

Finally, use a picture for testing:

python classify_image_inception_resnet_v2.py \
  --model_path /your/saved/path/frozen_graph.pb \
  --label_path /your/path/labels.txt \
  --image_file /your/path/test.jpg

Final output:

unsuited (score = 0.94713)
suited (score = 0.05287)

Although a bit happy, but when I look back, the heart is still very tired now and then TensorFlow GPU version conda kneeling, in need of repair.

 

5. Reference

(1) [deep learning - model eval +] model is derived using Tensorflow Slim model to assess the training of export models +

(2) [series] Tensorflow use Inception_resnet_v2 training their own data sets and monitors with Tensorboard

(Finish)

Guess you like

Origin www.cnblogs.com/harrymore/p/12149756.html