diff options
author | 2016-12-10 02:22:18 -0800 | |
---|---|---|
committer | 2016-12-10 02:22:18 -0800 | |
commit | fda8c18ac7c0ed24c0cf03fd5e336bd1a3fd9521 (patch) | |
tree | 0c37c0439da7ca0e189405de35d5eea7cc5f4069 /tensorflow/models/image | |
parent | f64495cacf154e94743df795acfeb0d97a807924 (diff) |
Moving example models from github.com/tensorflow/tensorflow to github.com/tensorflow/models
Diffstat (limited to 'tensorflow/models/image')
-rw-r--r-- | tensorflow/models/image/cifar10/cifar10_input.py | 253 | ||||
-rw-r--r-- | tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py | 273 | ||||
-rw-r--r-- | tensorflow/models/image/imagenet/classify_image.py | 227 |
3 files changed, 0 insertions, 753 deletions
diff --git a/tensorflow/models/image/cifar10/cifar10_input.py b/tensorflow/models/image/cifar10/cifar10_input.py deleted file mode 100644 index 7bfcb2e054..0000000000 --- a/tensorflow/models/image/cifar10/cifar10_input.py +++ /dev/null @@ -1,253 +0,0 @@ -# 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. -# ============================================================================== - -"""Routine for decoding the CIFAR-10 binary file format.""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import os - -from six.moves import xrange # pylint: disable=redefined-builtin -import tensorflow as tf - -# Process images of this size. Note that this differs from the original CIFAR -# image size of 32 x 32. If one alters this number, then the entire model -# architecture will change and any model would need to be retrained. -IMAGE_SIZE = 24 - -# Global constants describing the CIFAR-10 data set. -NUM_CLASSES = 10 -NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN = 50000 -NUM_EXAMPLES_PER_EPOCH_FOR_EVAL = 10000 - - -def read_cifar10(filename_queue): - """Reads and parses examples from CIFAR10 data files. - - Recommendation: if you want N-way read parallelism, call this function - N times. This will give you N independent Readers reading different - files & positions within those files, which will give better mixing of - examples. - - Args: - filename_queue: A queue of strings with the filenames to read from. - - Returns: - An object representing a single example, with the following fields: - height: number of rows in the result (32) - width: number of columns in the result (32) - depth: number of color channels in the result (3) - key: a scalar string Tensor describing the filename & record number - for this example. - label: an int32 Tensor with the label in the range 0..9. - uint8image: a [height, width, depth] uint8 Tensor with the image data - """ - - class CIFAR10Record(object): - pass - result = CIFAR10Record() - - # Dimensions of the images in the CIFAR-10 dataset. - # See http://www.cs.toronto.edu/~kriz/cifar.html for a description of the - # input format. - label_bytes = 1 # 2 for CIFAR-100 - result.height = 32 - result.width = 32 - result.depth = 3 - image_bytes = result.height * result.width * result.depth - # Every record consists of a label followed by the image, with a - # fixed number of bytes for each. - record_bytes = label_bytes + image_bytes - - # Read a record, getting filenames from the filename_queue. No - # header or footer in the CIFAR-10 format, so we leave header_bytes - # and footer_bytes at their default of 0. - reader = tf.FixedLengthRecordReader(record_bytes=record_bytes) - result.key, value = reader.read(filename_queue) - - # Convert from a string to a vector of uint8 that is record_bytes long. - record_bytes = tf.decode_raw(value, tf.uint8) - - # The first bytes represent the label, which we convert from uint8->int32. - result.label = tf.cast( - tf.strided_slice(record_bytes, [0], [label_bytes]), tf.int32) - - # The remaining bytes after the label represent the image, which we reshape - # from [depth * height * width] to [depth, height, width]. - depth_major = tf.reshape( - tf.strided_slice(record_bytes, [label_bytes], - [label_bytes + image_bytes]), - [result.depth, result.height, result.width]) - # Convert from [depth, height, width] to [height, width, depth]. - result.uint8image = tf.transpose(depth_major, [1, 2, 0]) - - return result - - -def _generate_image_and_label_batch(image, label, min_queue_examples, - batch_size, shuffle): - """Construct a queued batch of images and labels. - - Args: - image: 3-D Tensor of [height, width, 3] of type.float32. - label: 1-D Tensor of type.int32 - min_queue_examples: int32, minimum number of samples to retain - in the queue that provides of batches of examples. - batch_size: Number of images per batch. - shuffle: boolean indicating whether to use a shuffling queue. - - Returns: - images: Images. 4D tensor of [batch_size, height, width, 3] size. - labels: Labels. 1D tensor of [batch_size] size. - """ - # Create a queue that shuffles the examples, and then - # read 'batch_size' images + labels from the example queue. - num_preprocess_threads = 16 - if shuffle: - images, label_batch = tf.train.shuffle_batch( - [image, label], - batch_size=batch_size, - num_threads=num_preprocess_threads, - capacity=min_queue_examples + 3 * batch_size, - min_after_dequeue=min_queue_examples) - else: - images, label_batch = tf.train.batch( - [image, label], - batch_size=batch_size, - num_threads=num_preprocess_threads, - capacity=min_queue_examples + 3 * batch_size) - - # Display the training images in the visualizer. - tf.contrib.deprecated.image_summary('images', images) - - return images, tf.reshape(label_batch, [batch_size]) - - -def distorted_inputs(data_dir, batch_size): - """Construct distorted input for CIFAR training using the Reader ops. - - Args: - data_dir: Path to the CIFAR-10 data directory. - batch_size: Number of images per batch. - - Returns: - images: Images. 4D tensor of [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3] size. - labels: Labels. 1D tensor of [batch_size] size. - """ - filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i) - for i in xrange(1, 6)] - for f in filenames: - if not tf.gfile.Exists(f): - raise ValueError('Failed to find file: ' + f) - - # Create a queue that produces the filenames to read. - filename_queue = tf.train.string_input_producer(filenames) - - # Read examples from files in the filename queue. - read_input = read_cifar10(filename_queue) - reshaped_image = tf.cast(read_input.uint8image, tf.float32) - - height = IMAGE_SIZE - width = IMAGE_SIZE - - # Image processing for training the network. Note the many random - # distortions applied to the image. - - # Randomly crop a [height, width] section of the image. - distorted_image = tf.random_crop(reshaped_image, [height, width, 3]) - - # Randomly flip the image horizontally. - distorted_image = tf.image.random_flip_left_right(distorted_image) - - # Because these operations are not commutative, consider randomizing - # the order their operation. - distorted_image = tf.image.random_brightness(distorted_image, - max_delta=63) - distorted_image = tf.image.random_contrast(distorted_image, - lower=0.2, upper=1.8) - - # Subtract off the mean and divide by the variance of the pixels. - float_image = tf.image.per_image_standardization(distorted_image) - - # Set the shapes of tensors. - float_image.set_shape([height, width, 3]) - read_input.label.set_shape([1]) - - # Ensure that the random shuffling has good mixing properties. - min_fraction_of_examples_in_queue = 0.4 - min_queue_examples = int(NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN * - min_fraction_of_examples_in_queue) - print ('Filling queue with %d CIFAR images before starting to train. ' - 'This will take a few minutes.' % min_queue_examples) - - # Generate a batch of images and labels by building up a queue of examples. - return _generate_image_and_label_batch(float_image, read_input.label, - min_queue_examples, batch_size, - shuffle=True) - - -def inputs(eval_data, data_dir, batch_size): - """Construct input for CIFAR evaluation using the Reader ops. - - Args: - eval_data: bool, indicating if one should use the train or eval data set. - data_dir: Path to the CIFAR-10 data directory. - batch_size: Number of images per batch. - - Returns: - images: Images. 4D tensor of [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3] size. - labels: Labels. 1D tensor of [batch_size] size. - """ - if not eval_data: - filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i) - for i in xrange(1, 6)] - num_examples_per_epoch = NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN - else: - filenames = [os.path.join(data_dir, 'test_batch.bin')] - num_examples_per_epoch = NUM_EXAMPLES_PER_EPOCH_FOR_EVAL - - for f in filenames: - if not tf.gfile.Exists(f): - raise ValueError('Failed to find file: ' + f) - - # Create a queue that produces the filenames to read. - filename_queue = tf.train.string_input_producer(filenames) - - # Read examples from files in the filename queue. - read_input = read_cifar10(filename_queue) - reshaped_image = tf.cast(read_input.uint8image, tf.float32) - - height = IMAGE_SIZE - width = IMAGE_SIZE - - # Image processing for evaluation. - # Crop the central [height, width] of the image. - resized_image = tf.image.resize_image_with_crop_or_pad(reshaped_image, - width, height) - - # Subtract off the mean and divide by the variance of the pixels. - float_image = tf.image.per_image_standardization(resized_image) - - # Ensure that the random shuffling has good mixing properties. - min_fraction_of_examples_in_queue = 0.4 - min_queue_examples = int(num_examples_per_epoch * - min_fraction_of_examples_in_queue) - - # Generate a batch of images and labels by building up a queue of examples. - return _generate_image_and_label_batch(float_image, read_input.label, - min_queue_examples, batch_size, - shuffle=False) diff --git a/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py b/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py deleted file mode 100644 index c2d1e73f87..0000000000 --- a/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py +++ /dev/null @@ -1,273 +0,0 @@ -# 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. -# ============================================================================== - -"""A binary to train CIFAR-10 using multiple GPU's with synchronous updates. - -Accuracy: -cifar10_multi_gpu_train.py achieves ~86% accuracy after 100K steps (256 -epochs of data) as judged by cifar10_eval.py. - -Speed: With batch_size 128. - -System | Step Time (sec/batch) | Accuracy --------------------------------------------------------------------- -1 Tesla K20m | 0.35-0.60 | ~86% at 60K steps (5 hours) -1 Tesla K40m | 0.25-0.35 | ~86% at 100K steps (4 hours) -2 Tesla K20m | 0.13-0.20 | ~84% at 30K steps (2.5 hours) -3 Tesla K20m | 0.13-0.18 | ~84% at 30K steps -4 Tesla K20m | ~0.10 | ~84% at 30K steps - -Usage: -Please see the tutorial and website for how to download the CIFAR-10 -data set, compile the program and train the model. - -http://tensorflow.org/tutorials/deep_cnn/ -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -from datetime import datetime -import os.path -import re -import time - -import numpy as np -from six.moves import xrange # pylint: disable=redefined-builtin -import tensorflow as tf -from tensorflow.models.image.cifar10 import cifar10 - -FLAGS = tf.app.flags.FLAGS - -tf.app.flags.DEFINE_string('train_dir', '/tmp/cifar10_train', - """Directory where to write event logs """ - """and checkpoint.""") -tf.app.flags.DEFINE_integer('max_steps', 1000000, - """Number of batches to run.""") -tf.app.flags.DEFINE_integer('num_gpus', 1, - """How many GPUs to use.""") -tf.app.flags.DEFINE_boolean('log_device_placement', False, - """Whether to log device placement.""") - - -def tower_loss(scope): - """Calculate the total loss on a single tower running the CIFAR model. - - Args: - scope: unique prefix string identifying the CIFAR tower, e.g. 'tower_0' - - Returns: - Tensor of shape [] containing the total loss for a batch of data - """ - # Get images and labels for CIFAR-10. - images, labels = cifar10.distorted_inputs() - - # Build inference Graph. - logits = cifar10.inference(images) - - # Build the portion of the Graph calculating the losses. Note that we will - # assemble the total_loss using a custom function below. - _ = cifar10.loss(logits, labels) - - # Assemble all of the losses for the current tower only. - losses = tf.get_collection('losses', scope) - - # Calculate the total loss for the current tower. - total_loss = tf.add_n(losses, name='total_loss') - - # Attach a scalar summary to all individual losses and the total loss; do the - # same for the averaged version of the losses. - for l in losses + [total_loss]: - # Remove 'tower_[0-9]/' from the name in case this is a multi-GPU training - # session. This helps the clarity of presentation on tensorboard. - loss_name = re.sub('%s_[0-9]*/' % cifar10.TOWER_NAME, '', l.op.name) - tf.contrib.deprecated.scalar_summary(loss_name, l) - - return total_loss - - -def average_gradients(tower_grads): - """Calculate the average gradient for each shared variable across all towers. - - Note that this function provides a synchronization point across all towers. - - Args: - tower_grads: List of lists of (gradient, variable) tuples. The outer list - is over individual gradients. The inner list is over the gradient - calculation for each tower. - Returns: - List of pairs of (gradient, variable) where the gradient has been averaged - across all towers. - """ - average_grads = [] - for grad_and_vars in zip(*tower_grads): - # Note that each grad_and_vars looks like the following: - # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) - grads = [] - for g, _ in grad_and_vars: - # Add 0 dimension to the gradients to represent the tower. - expanded_g = tf.expand_dims(g, 0) - - # Append on a 'tower' dimension which we will average over below. - grads.append(expanded_g) - - # Average over the 'tower' dimension. - grad = tf.concat(0, grads) - grad = tf.reduce_mean(grad, 0) - - # Keep in mind that the Variables are redundant because they are shared - # across towers. So .. we will just return the first tower's pointer to - # the Variable. - v = grad_and_vars[0][1] - grad_and_var = (grad, v) - average_grads.append(grad_and_var) - return average_grads - - -def train(): - """Train CIFAR-10 for a number of steps.""" - with tf.Graph().as_default(), tf.device('/cpu:0'): - # Create a variable to count the number of train() calls. This equals the - # number of batches processed * FLAGS.num_gpus. - global_step = tf.get_variable( - 'global_step', [], - initializer=tf.constant_initializer(0), trainable=False) - - # Calculate the learning rate schedule. - num_batches_per_epoch = (cifar10.NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN / - FLAGS.batch_size) - decay_steps = int(num_batches_per_epoch * cifar10.NUM_EPOCHS_PER_DECAY) - - # Decay the learning rate exponentially based on the number of steps. - lr = tf.train.exponential_decay(cifar10.INITIAL_LEARNING_RATE, - global_step, - decay_steps, - cifar10.LEARNING_RATE_DECAY_FACTOR, - staircase=True) - - # Create an optimizer that performs gradient descent. - opt = tf.train.GradientDescentOptimizer(lr) - - # Calculate the gradients for each model tower. - tower_grads = [] - for i in xrange(FLAGS.num_gpus): - with tf.device('/gpu:%d' % i): - with tf.name_scope('%s_%d' % (cifar10.TOWER_NAME, i)) as scope: - # Calculate the loss for one tower of the CIFAR model. This function - # constructs the entire CIFAR model but shares the variables across - # all towers. - loss = tower_loss(scope) - - # Reuse variables for the next tower. - tf.get_variable_scope().reuse_variables() - - # Retain the summaries from the final tower. - summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, scope) - - # Calculate the gradients for the batch of data on this CIFAR tower. - grads = opt.compute_gradients(loss) - - # Keep track of the gradients across all towers. - tower_grads.append(grads) - - # We must calculate the mean of each gradient. Note that this is the - # synchronization point across all towers. - grads = average_gradients(tower_grads) - - # Add a summary to track the learning rate. - summaries.append(tf.contrib.deprecated.scalar_summary('learning_rate', lr)) - - # Add histograms for gradients. - for grad, var in grads: - if grad is not None: - summaries.append( - tf.contrib.deprecated.histogram_summary(var.op.name + '/gradients', - grad)) - - # Apply the gradients to adjust the shared variables. - apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) - - # Add histograms for trainable variables. - for var in tf.trainable_variables(): - summaries.append( - tf.contrib.deprecated.histogram_summary(var.op.name, var)) - - # Track the moving averages of all trainable variables. - variable_averages = tf.train.ExponentialMovingAverage( - cifar10.MOVING_AVERAGE_DECAY, global_step) - variables_averages_op = variable_averages.apply(tf.trainable_variables()) - - # Group all updates to into a single train op. - train_op = tf.group(apply_gradient_op, variables_averages_op) - - # Create a saver. - saver = tf.train.Saver(tf.global_variables()) - - # Build the summary operation from the last tower summaries. - summary_op = tf.contrib.deprecated.merge_summary(summaries) - - # Build an initialization operation to run below. - init = tf.global_variables_initializer() - - # Start running operations on the Graph. allow_soft_placement must be set to - # True to build towers on GPU, as some of the ops do not have GPU - # implementations. - sess = tf.Session(config=tf.ConfigProto( - allow_soft_placement=True, - log_device_placement=FLAGS.log_device_placement)) - sess.run(init) - - # Start the queue runners. - tf.train.start_queue_runners(sess=sess) - - summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph) - - for step in xrange(FLAGS.max_steps): - start_time = time.time() - _, loss_value = sess.run([train_op, loss]) - duration = time.time() - start_time - - assert not np.isnan(loss_value), 'Model diverged with loss = NaN' - - if step % 10 == 0: - num_examples_per_step = FLAGS.batch_size * FLAGS.num_gpus - examples_per_sec = num_examples_per_step / duration - sec_per_batch = duration / FLAGS.num_gpus - - format_str = ('%s: step %d, loss = %.2f (%.1f examples/sec; %.3f ' - 'sec/batch)') - print (format_str % (datetime.now(), step, loss_value, - examples_per_sec, sec_per_batch)) - - if step % 100 == 0: - summary_str = sess.run(summary_op) - summary_writer.add_summary(summary_str, step) - - # Save the model checkpoint periodically. - if step % 1000 == 0 or (step + 1) == FLAGS.max_steps: - checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt') - saver.save(sess, checkpoint_path, global_step=step) - - -def main(argv=None): # pylint: disable=unused-argument - cifar10.maybe_download_and_extract() - if tf.gfile.Exists(FLAGS.train_dir): - tf.gfile.DeleteRecursively(FLAGS.train_dir) - tf.gfile.MakeDirs(FLAGS.train_dir) - train() - - -if __name__ == '__main__': - tf.app.run() diff --git a/tensorflow/models/image/imagenet/classify_image.py b/tensorflow/models/image/imagenet/classify_image.py deleted file mode 100644 index c2850f58ea..0000000000 --- a/tensorflow/models/image/imagenet/classify_image.py +++ /dev/null @@ -1,227 +0,0 @@ -# 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. -# ============================================================================== - -"""Simple image classification with Inception. - -Run image classification with Inception trained on ImageNet 2012 Challenge data -set. - -This program creates a graph from a saved GraphDef protocol buffer, -and runs inference on an input JPEG image. It outputs human readable -strings of the top 5 predictions along with their probabilities. - -Change the --image_file argument to any jpg image to compute a -classification of that image. - -Please see the tutorial and website for a detailed description of how -to use this script to perform image recognition. - -https://tensorflow.org/tutorials/image_recognition/ -""" - -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 - -# pylint: disable=line-too-long -DATA_URL = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz' -# pylint: enable=line-too-long - - -class NodeLookup(object): - """Converts integer node ID's to human readable labels.""" - - def __init__(self, - label_lookup_path=None, - uid_lookup_path=None): - if not label_lookup_path: - label_lookup_path = os.path.join( - FLAGS.model_dir, 'imagenet_2012_challenge_label_map_proto.pbtxt') - if not uid_lookup_path: - uid_lookup_path = os.path.join( - FLAGS.model_dir, 'imagenet_synset_to_human_label_map.txt') - self.node_lookup = self.load(label_lookup_path, uid_lookup_path) - - def load(self, label_lookup_path, uid_lookup_path): - """Loads a human readable English name for each softmax node. - - Args: - label_lookup_path: string UID to integer node ID. - uid_lookup_path: string UID to human-readable string. - - Returns: - dict from integer node ID to human-readable string. - """ - if not tf.gfile.Exists(uid_lookup_path): - tf.logging.fatal('File does not exist %s', uid_lookup_path) - if not tf.gfile.Exists(label_lookup_path): - tf.logging.fatal('File does not exist %s', label_lookup_path) - - # Loads mapping from string UID to human-readable string - proto_as_ascii_lines = tf.gfile.GFile(uid_lookup_path).readlines() - uid_to_human = {} - p = re.compile(r'[n\d]*[ \S,]*') - for line in proto_as_ascii_lines: - parsed_items = p.findall(line) - uid = parsed_items[0] - human_string = parsed_items[2] - uid_to_human[uid] = human_string - - # Loads mapping from string UID to integer node ID. - node_id_to_uid = {} - proto_as_ascii = tf.gfile.GFile(label_lookup_path).readlines() - for line in proto_as_ascii: - if line.startswith(' target_class:'): - target_class = int(line.split(': ')[1]) - if line.startswith(' target_class_string:'): - target_class_string = line.split(': ')[1] - node_id_to_uid[target_class] = target_class_string[1:-2] - - # Loads the final mapping of integer node ID to human-readable string - node_id_to_name = {} - for key, val in node_id_to_uid.items(): - if val not in uid_to_human: - tf.logging.fatal('Failed to locate: %s', val) - name = uid_to_human[val] - node_id_to_name[key] = name - - 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(os.path.join( - FLAGS.model_dir, 'classify_image_graph_def.pb'), 'rb') as f: - graph_def = tf.GraphDef() - graph_def.ParseFromString(f.read()) - _ = tf.import_graph_def(graph_def, name='') - - -def run_inference_on_image(image): - """Runs inference on an image. - - Args: - image: Image file name. - - Returns: - Nothing - """ - if not tf.gfile.Exists(image): - tf.logging.fatal('File does not exist %s', image) - image_data = tf.gfile.FastGFile(image, 'rb').read() - - # Creates graph from saved GraphDef. - create_graph() - - with tf.Session() as sess: - # Some useful tensors: - # 'softmax:0': A tensor containing the normalized prediction across - # 1000 labels. - # 'pool_3:0': A tensor containing the next-to-last layer containing 2048 - # float description of the image. - # 'DecodeJpeg/contents:0': A tensor containing a string providing JPEG - # encoding of the image. - # Runs the softmax tensor by feeding the image_data as input to the graph. - softmax_tensor = sess.graph.get_tensor_by_name('softmax:0') - predictions = sess.run(softmax_tensor, - {'DecodeJpeg/contents:0': image_data}) - predictions = np.squeeze(predictions) - - # Creates node ID --> English string lookup. - node_lookup = NodeLookup() - - 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 maybe_download_and_extract(): - """Download and extract model tar file.""" - dest_directory = FLAGS.model_dir - if not os.path.exists(dest_directory): - os.makedirs(dest_directory) - filename = DATA_URL.split('/')[-1] - filepath = os.path.join(dest_directory, filename) - if not os.path.exists(filepath): - def _progress(count, block_size, total_size): - sys.stdout.write('\r>> Downloading %s %.1f%%' % ( - filename, float(count * block_size) / float(total_size) * 100.0)) - sys.stdout.flush() - filepath, _ = urllib.request.urlretrieve(DATA_URL, filepath, _progress) - print() - statinfo = os.stat(filepath) - print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') - tarfile.open(filepath, 'r:gz').extractall(dest_directory) - - -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) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - # classify_image_graph_def.pb: - # Binary representation of the GraphDef protocol buffer. - # imagenet_synset_to_human_label_map.txt: - # Map from synset ID to a human readable string. - # imagenet_2012_challenge_label_map_proto.pbtxt: - # Text representation of a protocol buffer mapping a label to synset ID. - parser.add_argument( - '--model_dir', - type=str, - default='/tmp/imagenet', - help="""\ - Path to classify_image_graph_def.pb, - imagenet_synset_to_human_label_map.txt, and - imagenet_2012_challenge_label_map_proto.pbtxt.\ - """ - ) - 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) |