diff --git a/resnet/__init__.py b/resnet/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/resnet/cat.jpg b/resnet/cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4efc6c98b7e7bed698b10f4b7f06031267d52dd Binary files /dev/null and b/resnet/cat.jpg differ diff --git a/resnet/cat2.jpg b/resnet/cat2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ac86b301b0fa8f9c0d7bee2dabb2ceb38b94aae Binary files /dev/null and b/resnet/cat2.jpg differ diff --git a/resnet/config.py b/resnet/config.py new file mode 100644 index 0000000000000000000000000000000000000000..1b31c32f18f2e509c754e80c95e5d7b7f929e3a4 --- /dev/null +++ b/resnet/config.py @@ -0,0 +1,82 @@ +# This is a variable scope aware configuation object for TensorFlow + +import tensorflow as tf + +FLAGS = tf.app.flags.FLAGS + +class Config: + def __init__(self): + root = self.Scope('') + for k, v in FLAGS.__dict__['__flags'].iteritems(): + root[k] = v + self.stack = [ root ] + + def _pop_stale(self): + var_scope_name = tf.get_variable_scope().name + top = self.stack[0] + while not top.contains(var_scope_name): + # We aren't in this scope anymore + self.stack.pop(0) + top = self.stack[0] + + def __getitem__(self, name): + self._pop_stale() + # Recursively extract value + for i in range(len(self.stack)): + cs = self.stack[i] + if name in cs: + return cs[name] + + raise KeyError(name) + + def __setitem__(self, name, value): + self._pop_stale() + top = self.stack[0] + var_scope_name = tf.get_variable_scope().name + assert top.contains(var_scope_name) + + if top.name != var_scope_name: + top = self.Scope(var_scope_name) + self.stack.insert(0, top) + + top[name] = value + + class Scope(dict): + def __init__(self, name): + self.name = name + + def contains(self, var_scope_name): + return var_scope_name.startswith(self.name) + + + +# Test +if __name__ == '__main__': + + def assert_raises(exception, fn): + try: + fn() + except exception: + pass + else: + assert False, "Expected exception" + + c = Config() + + c['hello'] = 1 + assert c['hello'] == 1 + + with tf.variable_scope('foo'): + c['bar'] = 2 + assert c['bar'] == 2 + assert c['hello'] == 1 + + with tf.variable_scope('meow'): + c['dog'] = 3 + assert c['dog'] == 3 + assert c['bar'] == 2 + assert c['hello'] == 1 + + assert_raises(KeyError, lambda: c['dog']) + assert c['bar'] == 2 + assert c['hello'] == 1 diff --git a/resnet/convert.py b/resnet/convert.py new file mode 100644 index 0000000000000000000000000000000000000000..9785993a415b6f0c38a5726818d5bf89f4f1ab06 --- /dev/null +++ b/resnet/convert.py @@ -0,0 +1,333 @@ +import os +os.environ["GLOG_minloglevel"] = "2" +import sys +import re +#import caffe +import numpy as np +import tensorflow as tf +#import skimage.io +#from caffe.proto import caffe_pb2 +#from synset import * + +import inference as resnet + + +class CaffeParamProvider(): + def __init__(self, caffe_net): + self.caffe_net = caffe_net + + def conv_kernel(self, name): + k = self.caffe_net.params[name][0].data + # caffe [out_channels, in_channels, filter_height, filter_width] + # 0 1 2 3 + # tensorflow [filter_height, filter_width, in_channels, out_channels] + # 2 3 1 0 + return k.transpose((2, 3, 1, 0)) + return k + + def bn_gamma(self, name): + return self.caffe_net.params[name][0].data + + def bn_beta(self, name): + return self.caffe_net.params[name][1].data + + def bn_mean(self, name): + return self.caffe_net.params[name][0].data + + def bn_variance(self, name): + return self.caffe_net.params[name][1].data + + def fc_weights(self, name): + w = self.caffe_net.params[name][0].data + w = w.transpose((1, 0)) + return w + + def fc_biases(self, name): + b = self.caffe_net.params[name][1].data + return b + + +def preprocess(img): + """Changes RGB [0,1] valued image to BGR [0,255] with mean subtracted.""" + mean_bgr = load_mean_bgr() + print 'mean blue', np.mean(mean_bgr[:, :, 0]) + print 'mean green', np.mean(mean_bgr[:, :, 1]) + print 'mean red', np.mean(mean_bgr[:, :, 2]) + out = np.copy(img) * 255.0 + out = out[:, :, [2, 1, 0]] # swap channel from RGB to BGR + out -= mean_bgr + return out + + +def assert_almost_equal(caffe_tensor, tf_tensor): + t = tf_tensor[0] + c = caffe_tensor[0].transpose((1, 2, 0)) + + #for i in range(0, t.shape[-1]): + # print "tf", i, t[:,i] + # print "caffe", i, c[:,i] + + if t.shape != c.shape: + print "t.shape", t.shape + print "c.shape", c.shape + sys.exit(1) + + d = np.linalg.norm(t - c) + print "d", d + assert d < 500 + + +# returns image of shape [224, 224, 3] +# [height, width, depth] +def load_image(path, size=224): + img = skimage.io.imread(path) + short_edge = min(img.shape[:2]) + yy = int((img.shape[0] - short_edge) / 2) + xx = int((img.shape[1] - short_edge) / 2) + crop_img = img[yy:yy + short_edge, xx:xx + short_edge] + resized_img = skimage.transform.resize(crop_img, (size, size)) + return resized_img + + +def load_mean_bgr(): + """ bgr mean pixel value image, [0, 255]. [height, width, 3] """ + with open("data/ResNet_mean.binaryproto", mode='rb') as f: + data = f.read() + blob = caffe_pb2.BlobProto() + blob.ParseFromString(data) + + mean_bgr = caffe.io.blobproto_to_array(blob)[0] + assert mean_bgr.shape == (3, 224, 224) + + return mean_bgr.transpose((1, 2, 0)) + + +def load_caffe(img_p, layers=50): + caffe.set_mode_cpu() + + prototxt = "data/ResNet-%d-deploy.prototxt" % layers + caffemodel = "data/ResNet-%d-model.caffemodel" % layers + net = caffe.Net(prototxt, caffemodel, caffe.TEST) + + net.blobs['data'].data[0] = img_p.transpose((2, 0, 1)) + assert net.blobs['data'].data[0].shape == (3, 224, 224) + net.forward() + + caffe_prob = net.blobs['prob'].data[0] + print_prob(caffe_prob) + + return net + + +# returns the top1 string +def print_prob(prob): + #print prob + pred = np.argsort(prob)[::-1] + + # Get top1 label + top1 = synset[pred[0]] + print "Top1: ", top1 + # Get top5 label + top5 = [synset[pred[i]] for i in range(5)] + print "Top5: ", top5 + return top1 + + +def parse_tf_varnames(p, tf_varname, num_layers): + if tf_varname == 'scale1/weights': + return p.conv_kernel('conv1') + + elif tf_varname == 'scale1/gamma': + return p.bn_gamma('scale_conv1') + + elif tf_varname == 'scale1/beta': + return p.bn_beta('scale_conv1') + + elif tf_varname == 'scale1/moving_mean': + return p.bn_mean('bn_conv1') + + elif tf_varname == 'scale1/moving_variance': + return p.bn_variance('bn_conv1') + + elif tf_varname == 'fc/weights': + return p.fc_weights('fc1000') + + elif tf_varname == 'fc/biases': + return p.fc_biases('fc1000') + + # scale2/block1/shortcut/weights + # scale3/block2/c/moving_mean + # scale3/block6/c/moving_variance + # scale4/block3/c/moving_mean + # scale4/block8/a/beta + re1 = 'scale(\d+)/block(\d+)/(shortcut|a|b|c|A|B)' + m = re.search(re1, tf_varname) + + def letter(i): + return chr(ord('a') + i - 1) + + scale_num = int(m.group(1)) + + block_num = int(m.group(2)) + if scale_num == 2: + # scale 2 always uses block letters + block_str = letter(block_num) + elif scale_num == 3 or scale_num == 4: + # scale 3 uses block letters for l=50 and numbered blocks for l=101, l=151 + # scale 4 uses block letters for l=50 and numbered blocks for l=101, l=151 + if num_layers == 50: + block_str = letter(block_num) + else: + if block_num == 1: + block_str = 'a' + else: + block_str = 'b%d' % (block_num - 1) + elif scale_num == 5: + # scale 5 always block letters + block_str = letter(block_num) + else: + raise ValueError("unexpected scale_num %d" % scale_num) + + branch = m.group(3) + if branch == "shortcut": + branch_num = 1 + conv_letter = '' + else: + branch_num = 2 + conv_letter = branch.lower() + + x = (scale_num, block_str, branch_num, conv_letter) + #print x + + if 'weights' in tf_varname: + return p.conv_kernel('res%d%s_branch%d%s' % x) + + if 'gamma' in tf_varname: + return p.bn_gamma('scale%d%s_branch%d%s' % x) + + if 'beta' in tf_varname: + return p.bn_beta('scale%d%s_branch%d%s' % x) + + if 'moving_mean' in tf_varname: + return p.bn_mean('bn%d%s_branch%d%s' % x) + + if 'moving_variance' in tf_varname: + return p.bn_variance('bn%d%s_branch%d%s' % x) + + raise ValueError('unhandled var ' + tf_varname) + + +def checkpoint_fn(layers): + return 'ResNet-L%d.ckpt' % layers + + +def meta_fn(layers): + return 'ResNet-L%d.meta' % layers + + +def convert(graph, img, img_p, layers): + caffe_model = load_caffe(img_p, layers) + + #for i, n in enumerate(caffe_model.params): + # print n + + param_provider = CaffeParamProvider(caffe_model) + + if layers == 50: + num_blocks = [3, 4, 6, 3] + elif layers == 101: + num_blocks = [3, 4, 23, 3] + elif layers == 152: + num_blocks = [3, 8, 36, 3] + + with tf.device('/cpu:0'): + images = tf.placeholder("float32", [None, 224, 224, 3], name="images") + logits = resnet.inference(images, + is_training=False, + num_blocks=num_blocks, + preprocess=True, + bottleneck=True) + prob = tf.nn.softmax(logits, name='prob') + + # We write the metagraph first to avoid adding a bunch of + # assign ops that are used to set variables from caffe. + # The checkpoint is written to at the end. + tf.train.export_meta_graph(filename=meta_fn(layers)) + + vars_to_restore = tf.all_variables() + saver = tf.train.Saver(vars_to_restore) + + sess = tf.Session() + sess.run(tf.initialize_all_variables()) + + assigns = [] + for var in vars_to_restore: + #print var.op.name + data = parse_tf_varnames(param_provider, var.op.name, layers) + #print "caffe data shape", data.shape + #print "tf shape", var.get_shape() + assigns.append(var.assign(data)) + sess.run(assigns) + + #for op in tf.get_default_graph().get_operations(): + # print op.name + + i = [ + graph.get_tensor_by_name("scale1/Relu:0"), + graph.get_tensor_by_name("scale2/MaxPool:0"), + graph.get_tensor_by_name("scale2/block1/Relu:0"), + graph.get_tensor_by_name("scale2/block2/Relu:0"), + graph.get_tensor_by_name("scale2/block3/Relu:0"), + graph.get_tensor_by_name("scale3/block1/Relu:0"), + graph.get_tensor_by_name("scale5/block3/Relu:0"), + graph.get_tensor_by_name("avg_pool:0"), + graph.get_tensor_by_name("prob:0"), + ] + + o = sess.run(i, {images: img[np.newaxis, :]}) + + assert_almost_equal(caffe_model.blobs['conv1'].data, o[0]) + assert_almost_equal(caffe_model.blobs['pool1'].data, o[1]) + assert_almost_equal(caffe_model.blobs['res2a'].data, o[2]) + assert_almost_equal(caffe_model.blobs['res2b'].data, o[3]) + assert_almost_equal(caffe_model.blobs['res2c'].data, o[4]) + assert_almost_equal(caffe_model.blobs['res3a'].data, o[5]) + assert_almost_equal(caffe_model.blobs['res5c'].data, o[6]) + #assert_almost_equal(np.squeeze(caffe_model.blobs['pool5'].data), o[7]) + + print_prob(o[8][0]) + + prob_dist = np.linalg.norm(caffe_model.blobs['prob'].data - o[8]) + print 'prob_dist ', prob_dist + assert prob_dist < 0.2 # XXX can this be tightened? + + # We've already written the metagraph to avoid a bunch of assign ops. + saver.save(sess, checkpoint_fn(layers), write_meta_graph=False) + + +def save_graph(save_path): + graph = tf.get_default_graph() + graph_def = graph.as_graph_def() + print "graph_def byte size", graph_def.ByteSize() + graph_def_s = graph_def.SerializeToString() + + with open(save_path, "wb") as f: + f.write(graph_def_s) + + print "saved model to %s" % save_path + + +def main(_): + img = load_image("data/cat.jpg") + print img + img_p = preprocess(img) + + for layers in [50, 101, 152]: + g = tf.Graph() + with g.as_default(): + print "CONVERT", layers + convert(g, img, img_p, layers) + + +if __name__ == '__main__': + tf.app.run() diff --git a/resnet/dalmatian.jpg b/resnet/dalmatian.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c53adfb70065e31c2bcc503fbff99bd8434ffd0 Binary files /dev/null and b/resnet/dalmatian.jpg differ diff --git a/resnet/inference.py b/resnet/inference.py new file mode 100644 index 0000000000000000000000000000000000000000..0d04bd4dd93ed52bc6ea8412ec7828de700c1291 --- /dev/null +++ b/resnet/inference.py @@ -0,0 +1,333 @@ +# import skimage.io # bug. need to import this before tensorflow +# import skimage.transform # bug. need to import this before tensorflow +import tensorflow as tf +from tensorflow.python.ops import control_flow_ops +from tensorflow.python.training import moving_averages + +from config import Config + +# import datetime +import numpy as np +import os +import time + +MOVING_AVERAGE_DECAY = 0.9997 +BN_DECAY = MOVING_AVERAGE_DECAY +BN_EPSILON = 0.001 +CONV_WEIGHT_DECAY = 0.00004 +CONV_WEIGHT_STDDEV = 0.1 +FC_WEIGHT_DECAY = 0.00004 +FC_WEIGHT_STDDEV = 0.01 +RESNET_VARIABLES = 'resnet_variables' +UPDATE_OPS_COLLECTION = 'resnet_update_ops' # must be grouped with training op +IMAGENET_MEAN_BGR = [103.062623801, 115.902882574, 123.151630838, ] + +tf.app.flags.DEFINE_integer('input_size', 224, "input image size") + + +activation = tf.nn.relu + + +def inference(x, is_training, + num_classes=1000, + num_blocks=[3, 4, 6, 3], # defaults to 50-layer network + use_bias=False, # defaults to using batch norm + bottleneck=True): + c = Config() + c['bottleneck'] = bottleneck + c['is_training'] = tf.convert_to_tensor(is_training, + dtype='bool', + name='is_training') + c['ksize'] = 3 + c['stride'] = 1 + c['use_bias'] = use_bias + c['fc_units_out'] = num_classes + c['num_blocks'] = num_blocks + c['stack_stride'] = 2 + + with tf.variable_scope('scale1'): + c['conv_filters_out'] = 64 + c['ksize'] = 7 + c['stride'] = 2 + x = conv(x, c) + x = bn(x, c) + x = activation(x) + + with tf.variable_scope('scale2'): + x = _max_pool(x, ksize=3, stride=2) + c['num_blocks'] = num_blocks[0] + c['stack_stride'] = 1 + c['block_filters_internal'] = 64 + x = stack(x, c) + + with tf.variable_scope('scale3'): + c['num_blocks'] = num_blocks[1] + c['block_filters_internal'] = 128 + assert c['stack_stride'] == 2 + x = stack(x, c) + + with tf.variable_scope('scale4'): + c['num_blocks'] = num_blocks[2] + c['block_filters_internal'] = 256 + x = stack(x, c) + + with tf.variable_scope('scale5'): + c['num_blocks'] = num_blocks[3] + c['block_filters_internal'] = 512 + x = stack(x, c) + + # post-net + x = tf.reduce_mean(x, reduction_indices=[1, 2], name="avg_pool") + + if num_classes != None: + with tf.variable_scope('fc'): + x = fc(x, c) + + return x + + +# This is what they use for CIFAR-10 and 100. +# See Section 4.2 in http://arxiv.org/abs/1512.03385 +def inference_small(x, + is_training, + num_blocks=3, # 6n+2 total weight layers will be used. + use_bias=False, # defaults to using batch norm + num_classes=10): + c = Config() + c['is_training'] = tf.convert_to_tensor(is_training, + dtype='bool', + name='is_training') + c['use_bias'] = use_bias + c['fc_units_out'] = num_classes + c['num_blocks'] = num_blocks + c['num_classes'] = num_classes + inference_small_config(x, c) + +def inference_small_config(x, c): + c['bottleneck'] = False + c['ksize'] = 3 + c['stride'] = 1 + with tf.variable_scope('scale1'): + c['conv_filters_out'] = 16 + c['block_filters_internal'] = 16 + c['stack_stride'] = 1 + x = conv(x, c) + x = bn(x, c) + x = activation(x) + x = stack(x, c) + + with tf.variable_scope('scale2'): + c['block_filters_internal'] = 32 + c['stack_stride'] = 2 + x = stack(x, c) + + with tf.variable_scope('scale3'): + c['block_filters_internal'] = 64 + c['stack_stride'] = 2 + x = stack(x, c) + + # post-net + x = tf.reduce_mean(x, reduction_indices=[1, 2], name="avg_pool") + + if c['num_classes'] != None: + with tf.variable_scope('fc'): + x = fc(x, c) + + return x + + +def _imagenet_preprocess(rgb): + """Changes RGB [0,1] valued image to BGR [0,255] with mean subtracted.""" + red, green, blue = tf.split(3, 3, rgb * 255.0) + bgr = tf.concat(3, [blue, green, red]) + bgr -= IMAGENET_MEAN_BGR + return bgr + + +def loss(logits, labels): + cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels) + cross_entropy_mean = tf.reduce_mean(cross_entropy) + + regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + + loss_ = tf.add_n([cross_entropy_mean] + regularization_losses) + tf.scalar_summary('loss', loss_) + + return loss_ + + +def stack(x, c): + for n in range(c['num_blocks']): + s = c['stack_stride'] if n == 0 else 1 + c['block_stride'] = s + with tf.variable_scope('block%d' % (n + 1)): + x = block(x, c) + return x + + +def block(x, c): + filters_in = x.get_shape()[-1] + + # Note: filters_out isn't how many filters are outputed. + # That is the case when bottleneck=False but when bottleneck is + # True, filters_internal*4 filters are outputted. filters_internal is how many filters + # the 3x3 convs output internally. + m = 4 if c['bottleneck'] else 1 + filters_out = m * c['block_filters_internal'] + + shortcut = x # branch 1 + + c['conv_filters_out'] = c['block_filters_internal'] + + if c['bottleneck']: + with tf.variable_scope('a'): + c['ksize'] = 1 + c['stride'] = c['block_stride'] + x = conv(x, c) + x = bn(x, c) + x = activation(x) + + with tf.variable_scope('b'): + x = conv(x, c) + x = bn(x, c) + x = activation(x) + + with tf.variable_scope('c'): + c['conv_filters_out'] = filters_out + c['ksize'] = 1 + assert c['stride'] == 1 + x = conv(x, c) + x = bn(x, c) + else: + with tf.variable_scope('A'): + c['stride'] = c['block_stride'] + assert c['ksize'] == 3 + x = conv(x, c) + x = bn(x, c) + x = activation(x) + + with tf.variable_scope('B'): + c['conv_filters_out'] = filters_out + assert c['ksize'] == 3 + assert c['stride'] == 1 + x = conv(x, c) + x = bn(x, c) + + with tf.variable_scope('shortcut'): + if filters_out != filters_in or c['block_stride'] != 1: + c['ksize'] = 1 + c['stride'] = c['block_stride'] + c['conv_filters_out'] = filters_out + shortcut = conv(shortcut, c) + shortcut = bn(shortcut, c) + + return activation(x + shortcut) + + +def bn(x, c): + x_shape = x.get_shape() + params_shape = x_shape[-1:] + + if c['use_bias']: + bias = _get_variable('bias', params_shape, + initializer=tf.zeros_initializer) + return x + bias + + + axis = list(range(len(x_shape) - 1)) + + beta = _get_variable('beta', + params_shape, + initializer=tf.zeros_initializer) + gamma = _get_variable('gamma', + params_shape, + initializer=tf.ones_initializer) + + moving_mean = _get_variable('moving_mean', + params_shape, + initializer=tf.zeros_initializer, + trainable=False) + moving_variance = _get_variable('moving_variance', + params_shape, + initializer=tf.ones_initializer, + trainable=False) + + # These ops will only be preformed when training. + mean, variance = tf.nn.moments(x, axis) + update_moving_mean = moving_averages.assign_moving_average(moving_mean, + mean, BN_DECAY) + update_moving_variance = moving_averages.assign_moving_average( + moving_variance, variance, BN_DECAY) + tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_mean) + tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_variance) + + mean, variance = control_flow_ops.cond( + c['is_training'], lambda: (mean, variance), + lambda: (moving_mean, moving_variance)) + + x = tf.nn.batch_normalization(x, mean, variance, beta, gamma, BN_EPSILON) + #x.set_shape(inputs.get_shape()) ?? + + return x + + +def fc(x, c): + num_units_in = x.get_shape()[1] + num_units_out = c['fc_units_out'] + weights_initializer = tf.truncated_normal_initializer( + stddev=FC_WEIGHT_STDDEV) + + weights = _get_variable('weights', + shape=[num_units_in, num_units_out], + initializer=weights_initializer, + weight_decay=FC_WEIGHT_STDDEV) + biases = _get_variable('biases', + shape=[num_units_out], + initializer=tf.zeros_initializer) + x = tf.nn.xw_plus_b(x, weights, biases) + return x + + +def _get_variable(name, + shape, + initializer, + weight_decay=0.0, + dtype='float', + trainable=True): + "A little wrapper around tf.get_variable to do weight decay and add to" + "resnet collection" + if weight_decay > 0: + regularizer = tf.contrib.layers.l2_regularizer(weight_decay) + else: + regularizer = None + collections = [tf.GraphKeys.VARIABLES, RESNET_VARIABLES] + return tf.get_variable(name, + shape=shape, + initializer=initializer, + dtype=dtype, + regularizer=regularizer, + collections=collections, + trainable=trainable) + + +def conv(x, c): + ksize = c['ksize'] + stride = c['stride'] + filters_out = c['conv_filters_out'] + + filters_in = x.get_shape()[-1] + shape = [ksize, ksize, filters_in, filters_out] + initializer = tf.truncated_normal_initializer(stddev=CONV_WEIGHT_STDDEV) + weights = _get_variable('weights', + shape=shape, + dtype='float', + initializer=initializer, + weight_decay=CONV_WEIGHT_DECAY) + return tf.nn.conv2d(x, weights, [1, stride, stride, 1], padding='SAME') + + +def _max_pool(x, ksize=3, stride=2): + return tf.nn.max_pool(x, + ksize=[1, ksize, ksize, 1], + strides=[1, stride, stride, 1], + padding='SAME') diff --git a/resnet/schooner.jpg b/resnet/schooner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c4fc32b15b54c29de9fe5d06be4801fc4ff374d Binary files /dev/null and b/resnet/schooner.jpg differ diff --git a/resnet/synset.py b/resnet/synset.py new file mode 100644 index 0000000000000000000000000000000000000000..74fb9ecea052f0aca253d2f6878d8413dc836f67 --- /dev/null +++ b/resnet/synset.py @@ -0,0 +1,1007 @@ +synset = [ + "n01440764 tench, Tinca tinca", + "n01443537 goldfish, Carassius auratus", + "n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias", + "n01491361 tiger shark, Galeocerdo cuvieri", + "n01494475 hammerhead, hammerhead shark", + "n01496331 electric ray, crampfish, numbfish, torpedo", + "n01498041 stingray", + "n01514668 cock", + "n01514859 hen", + "n01518878 ostrich, Struthio camelus", + "n01530575 brambling, Fringilla montifringilla", + "n01531178 goldfinch, Carduelis carduelis", + "n01532829 house finch, linnet, Carpodacus mexicanus", + "n01534433 junco, snowbird", + "n01537544 indigo bunting, indigo finch, indigo bird, Passerina cyanea", + "n01558993 robin, American robin, Turdus migratorius", + "n01560419 bulbul", + "n01580077 jay", + "n01582220 magpie", + "n01592084 chickadee", + "n01601694 water ouzel, dipper", + "n01608432 kite", + "n01614925 bald eagle, American eagle, Haliaeetus leucocephalus", + "n01616318 vulture", + "n01622779 great grey owl, great gray owl, Strix nebulosa", + "n01629819 European fire salamander, Salamandra salamandra", + "n01630670 common newt, Triturus vulgaris", + "n01631663 eft", + "n01632458 spotted salamander, Ambystoma maculatum", + "n01632777 axolotl, mud puppy, Ambystoma mexicanum", + "n01641577 bullfrog, Rana catesbeiana", + "n01644373 tree frog, tree-frog", + "n01644900 tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", + "n01664065 loggerhead, loggerhead turtle, Caretta caretta", + "n01665541 leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", + "n01667114 mud turtle", + "n01667778 terrapin", + "n01669191 box turtle, box tortoise", + "n01675722 banded gecko", + "n01677366 common iguana, iguana, Iguana iguana", + "n01682714 American chameleon, anole, Anolis carolinensis", + "n01685808 whiptail, whiptail lizard", + "n01687978 agama", + "n01688243 frilled lizard, Chlamydosaurus kingi", + "n01689811 alligator lizard", + "n01692333 Gila monster, Heloderma suspectum", + "n01693334 green lizard, Lacerta viridis", + "n01694178 African chameleon, Chamaeleo chamaeleon", + "n01695060 Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis", + "n01697457 African crocodile, Nile crocodile, Crocodylus niloticus", + "n01698640 American alligator, Alligator mississipiensis", + "n01704323 triceratops", + "n01728572 thunder snake, worm snake, Carphophis amoenus", + "n01728920 ringneck snake, ring-necked snake, ring snake", + "n01729322 hognose snake, puff adder, sand viper", + "n01729977 green snake, grass snake", + "n01734418 king snake, kingsnake", + "n01735189 garter snake, grass snake", + "n01737021 water snake", + "n01739381 vine snake", + "n01740131 night snake, Hypsiglena torquata", + "n01742172 boa constrictor, Constrictor constrictor", + "n01744401 rock python, rock snake, Python sebae", + "n01748264 Indian cobra, Naja naja", + "n01749939 green mamba", + "n01751748 sea snake", + "n01753488 horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", + "n01755581 diamondback, diamondback rattlesnake, Crotalus adamanteus", + "n01756291 sidewinder, horned rattlesnake, Crotalus cerastes", + "n01768244 trilobite", + "n01770081 harvestman, daddy longlegs, Phalangium opilio", + "n01770393 scorpion", + "n01773157 black and gold garden spider, Argiope aurantia", + "n01773549 barn spider, Araneus cavaticus", + "n01773797 garden spider, Aranea diademata", + "n01774384 black widow, Latrodectus mactans", + "n01774750 tarantula", + "n01775062 wolf spider, hunting spider", + "n01776313 tick", + "n01784675 centipede", + "n01795545 black grouse", + "n01796340 ptarmigan", + "n01797886 ruffed grouse, partridge, Bonasa umbellus", + "n01798484 prairie chicken, prairie grouse, prairie fowl", + "n01806143 peacock", + "n01806567 quail", + "n01807496 partridge", + "n01817953 African grey, African gray, Psittacus erithacus", + "n01818515 macaw", + "n01819313 sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", + "n01820546 lorikeet", + "n01824575 coucal", + "n01828970 bee eater", + "n01829413 hornbill", + "n01833805 hummingbird", + "n01843065 jacamar", + "n01843383 toucan", + "n01847000 drake", + "n01855032 red-breasted merganser, Mergus serrator", + "n01855672 goose", + "n01860187 black swan, Cygnus atratus", + "n01871265 tusker", + "n01872401 echidna, spiny anteater, anteater", + "n01873310 platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus", + "n01877812 wallaby, brush kangaroo", + "n01882714 koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", + "n01883070 wombat", + "n01910747 jellyfish", + "n01914609 sea anemone, anemone", + "n01917289 brain coral", + "n01924916 flatworm, platyhelminth", + "n01930112 nematode, nematode worm, roundworm", + "n01943899 conch", + "n01944390 snail", + "n01945685 slug", + "n01950731 sea slug, nudibranch", + "n01955084 chiton, coat-of-mail shell, sea cradle, polyplacophore", + "n01968897 chambered nautilus, pearly nautilus, nautilus", + "n01978287 Dungeness crab, Cancer magister", + "n01978455 rock crab, Cancer irroratus", + "n01980166 fiddler crab", + "n01981276 king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica", + "n01983481 American lobster, Northern lobster, Maine lobster, Homarus americanus", + "n01984695 spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", + "n01985128 crayfish, crawfish, crawdad, crawdaddy", + "n01986214 hermit crab", + "n01990800 isopod", + "n02002556 white stork, Ciconia ciconia", + "n02002724 black stork, Ciconia nigra", + "n02006656 spoonbill", + "n02007558 flamingo", + "n02009229 little blue heron, Egretta caerulea", + "n02009912 American egret, great white heron, Egretta albus", + "n02011460 bittern", + "n02012849 crane", + "n02013706 limpkin, Aramus pictus", + "n02017213 European gallinule, Porphyrio porphyrio", + "n02018207 American coot, marsh hen, mud hen, water hen, Fulica americana", + "n02018795 bustard", + "n02025239 ruddy turnstone, Arenaria interpres", + "n02027492 red-backed sandpiper, dunlin, Erolia alpina", + "n02028035 redshank, Tringa totanus", + "n02033041 dowitcher", + "n02037110 oystercatcher, oyster catcher", + "n02051845 pelican", + "n02056570 king penguin, Aptenodytes patagonica", + "n02058221 albatross, mollymawk", + "n02066245 grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus", + "n02071294 killer whale, killer, orca, grampus, sea wolf, Orcinus orca", + "n02074367 dugong, Dugong dugon", + "n02077923 sea lion", + "n02085620 Chihuahua", + "n02085782 Japanese spaniel", + "n02085936 Maltese dog, Maltese terrier, Maltese", + "n02086079 Pekinese, Pekingese, Peke", + "n02086240 Shih-Tzu", + "n02086646 Blenheim spaniel", + "n02086910 papillon", + "n02087046 toy terrier", + "n02087394 Rhodesian ridgeback", + "n02088094 Afghan hound, Afghan", + "n02088238 basset, basset hound", + "n02088364 beagle", + "n02088466 bloodhound, sleuthhound", + "n02088632 bluetick", + "n02089078 black-and-tan coonhound", + "n02089867 Walker hound, Walker foxhound", + "n02089973 English foxhound", + "n02090379 redbone", + "n02090622 borzoi, Russian wolfhound", + "n02090721 Irish wolfhound", + "n02091032 Italian greyhound", + "n02091134 whippet", + "n02091244 Ibizan hound, Ibizan Podenco", + "n02091467 Norwegian elkhound, elkhound", + "n02091635 otterhound, otter hound", + "n02091831 Saluki, gazelle hound", + "n02092002 Scottish deerhound, deerhound", + "n02092339 Weimaraner", + "n02093256 Staffordshire bullterrier, Staffordshire bull terrier", + "n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier", + "n02093647 Bedlington terrier", + "n02093754 Border terrier", + "n02093859 Kerry blue terrier", + "n02093991 Irish terrier", + "n02094114 Norfolk terrier", + "n02094258 Norwich terrier", + "n02094433 Yorkshire terrier", + "n02095314 wire-haired fox terrier", + "n02095570 Lakeland terrier", + "n02095889 Sealyham terrier, Sealyham", + "n02096051 Airedale, Airedale terrier", + "n02096177 cairn, cairn terrier", + "n02096294 Australian terrier", + "n02096437 Dandie Dinmont, Dandie Dinmont terrier", + "n02096585 Boston bull, Boston terrier", + "n02097047 miniature schnauzer", + "n02097130 giant schnauzer", + "n02097209 standard schnauzer", + "n02097298 Scotch terrier, Scottish terrier, Scottie", + "n02097474 Tibetan terrier, chrysanthemum dog", + "n02097658 silky terrier, Sydney silky", + "n02098105 soft-coated wheaten terrier", + "n02098286 West Highland white terrier", + "n02098413 Lhasa, Lhasa apso", + "n02099267 flat-coated retriever", + "n02099429 curly-coated retriever", + "n02099601 golden retriever", + "n02099712 Labrador retriever", + "n02099849 Chesapeake Bay retriever", + "n02100236 German short-haired pointer", + "n02100583 vizsla, Hungarian pointer", + "n02100735 English setter", + "n02100877 Irish setter, red setter", + "n02101006 Gordon setter", + "n02101388 Brittany spaniel", + "n02101556 clumber, clumber spaniel", + "n02102040 English springer, English springer spaniel", + "n02102177 Welsh springer spaniel", + "n02102318 cocker spaniel, English cocker spaniel, cocker", + "n02102480 Sussex spaniel", + "n02102973 Irish water spaniel", + "n02104029 kuvasz", + "n02104365 schipperke", + "n02105056 groenendael", + "n02105162 malinois", + "n02105251 briard", + "n02105412 kelpie", + "n02105505 komondor", + "n02105641 Old English sheepdog, bobtail", + "n02105855 Shetland sheepdog, Shetland sheep dog, Shetland", + "n02106030 collie", + "n02106166 Border collie", + "n02106382 Bouvier des Flandres, Bouviers des Flandres", + "n02106550 Rottweiler", + "n02106662 German shepherd, German shepherd dog, German police dog, alsatian", + "n02107142 Doberman, Doberman pinscher", + "n02107312 miniature pinscher", + "n02107574 Greater Swiss Mountain dog", + "n02107683 Bernese mountain dog", + "n02107908 Appenzeller", + "n02108000 EntleBucher", + "n02108089 boxer", + "n02108422 bull mastiff", + "n02108551 Tibetan mastiff", + "n02108915 French bulldog", + "n02109047 Great Dane", + "n02109525 Saint Bernard, St Bernard", + "n02109961 Eskimo dog, husky", + "n02110063 malamute, malemute, Alaskan malamute", + "n02110185 Siberian husky", + "n02110341 dalmatian, coach dog, carriage dog", + "n02110627 affenpinscher, monkey pinscher, monkey dog", + "n02110806 basenji", + "n02110958 pug, pug-dog", + "n02111129 Leonberg", + "n02111277 Newfoundland, Newfoundland dog", + "n02111500 Great Pyrenees", + "n02111889 Samoyed, Samoyede", + "n02112018 Pomeranian", + "n02112137 chow, chow chow", + "n02112350 keeshond", + "n02112706 Brabancon griffon", + "n02113023 Pembroke, Pembroke Welsh corgi", + "n02113186 Cardigan, Cardigan Welsh corgi", + "n02113624 toy poodle", + "n02113712 miniature poodle", + "n02113799 standard poodle", + "n02113978 Mexican hairless", + "n02114367 timber wolf, grey wolf, gray wolf, Canis lupus", + "n02114548 white wolf, Arctic wolf, Canis lupus tundrarum", + "n02114712 red wolf, maned wolf, Canis rufus, Canis niger", + "n02114855 coyote, prairie wolf, brush wolf, Canis latrans", + "n02115641 dingo, warrigal, warragal, Canis dingo", + "n02115913 dhole, Cuon alpinus", + "n02116738 African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", + "n02117135 hyena, hyaena", + "n02119022 red fox, Vulpes vulpes", + "n02119789 kit fox, Vulpes macrotis", + "n02120079 Arctic fox, white fox, Alopex lagopus", + "n02120505 grey fox, gray fox, Urocyon cinereoargenteus", + "n02123045 tabby, tabby cat", + "n02123159 tiger cat", + "n02123394 Persian cat", + "n02123597 Siamese cat, Siamese", + "n02124075 Egyptian cat", + "n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", + "n02127052 lynx, catamount", + "n02128385 leopard, Panthera pardus", + "n02128757 snow leopard, ounce, Panthera uncia", + "n02128925 jaguar, panther, Panthera onca, Felis onca", + "n02129165 lion, king of beasts, Panthera leo", + "n02129604 tiger, Panthera tigris", + "n02130308 cheetah, chetah, Acinonyx jubatus", + "n02132136 brown bear, bruin, Ursus arctos", + "n02133161 American black bear, black bear, Ursus americanus, Euarctos americanus", + "n02134084 ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", + "n02134418 sloth bear, Melursus ursinus, Ursus ursinus", + "n02137549 mongoose", + "n02138441 meerkat, mierkat", + "n02165105 tiger beetle", + "n02165456 ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", + "n02167151 ground beetle, carabid beetle", + "n02168699 long-horned beetle, longicorn, longicorn beetle", + "n02169497 leaf beetle, chrysomelid", + "n02172182 dung beetle", + "n02174001 rhinoceros beetle", + "n02177972 weevil", + "n02190166 fly", + "n02206856 bee", + "n02219486 ant, emmet, pismire", + "n02226429 grasshopper, hopper", + "n02229544 cricket", + "n02231487 walking stick, walkingstick, stick insect", + "n02233338 cockroach, roach", + "n02236044 mantis, mantid", + "n02256656 cicada, cicala", + "n02259212 leafhopper", + "n02264363 lacewing, lacewing fly", + "n02268443 dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", + "n02268853 damselfly", + "n02276258 admiral", + "n02277742 ringlet, ringlet butterfly", + "n02279972 monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", + "n02280649 cabbage butterfly", + "n02281406 sulphur butterfly, sulfur butterfly", + "n02281787 lycaenid, lycaenid butterfly", + "n02317335 starfish, sea star", + "n02319095 sea urchin", + "n02321529 sea cucumber, holothurian", + "n02325366 wood rabbit, cottontail, cottontail rabbit", + "n02326432 hare", + "n02328150 Angora, Angora rabbit", + "n02342885 hamster", + "n02346627 porcupine, hedgehog", + "n02356798 fox squirrel, eastern fox squirrel, Sciurus niger", + "n02361337 marmot", + "n02363005 beaver", + "n02364673 guinea pig, Cavia cobaya", + "n02389026 sorrel", + "n02391049 zebra", + "n02395406 hog, pig, grunter, squealer, Sus scrofa", + "n02396427 wild boar, boar, Sus scrofa", + "n02397096 warthog", + "n02398521 hippopotamus, hippo, river horse, Hippopotamus amphibius", + "n02403003 ox", + "n02408429 water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", + "n02410509 bison", + "n02412080 ram, tup", + "n02415577 bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis", + "n02417914 ibex, Capra ibex", + "n02422106 hartebeest", + "n02422699 impala, Aepyceros melampus", + "n02423022 gazelle", + "n02437312 Arabian camel, dromedary, Camelus dromedarius", + "n02437616 llama", + "n02441942 weasel", + "n02442845 mink", + "n02443114 polecat, fitch, foulmart, foumart, Mustela putorius", + "n02443484 black-footed ferret, ferret, Mustela nigripes", + "n02444819 otter", + "n02445715 skunk, polecat, wood pussy", + "n02447366 badger", + "n02454379 armadillo", + "n02457408 three-toed sloth, ai, Bradypus tridactylus", + "n02480495 orangutan, orang, orangutang, Pongo pygmaeus", + "n02480855 gorilla, Gorilla gorilla", + "n02481823 chimpanzee, chimp, Pan troglodytes", + "n02483362 gibbon, Hylobates lar", + "n02483708 siamang, Hylobates syndactylus, Symphalangus syndactylus", + "n02484975 guenon, guenon monkey", + "n02486261 patas, hussar monkey, Erythrocebus patas", + "n02486410 baboon", + "n02487347 macaque", + "n02488291 langur", + "n02488702 colobus, colobus monkey", + "n02489166 proboscis monkey, Nasalis larvatus", + "n02490219 marmoset", + "n02492035 capuchin, ringtail, Cebus capucinus", + "n02492660 howler monkey, howler", + "n02493509 titi, titi monkey", + "n02493793 spider monkey, Ateles geoffroyi", + "n02494079 squirrel monkey, Saimiri sciureus", + "n02497673 Madagascar cat, ring-tailed lemur, Lemur catta", + "n02500267 indri, indris, Indri indri, Indri brevicaudatus", + "n02504013 Indian elephant, Elephas maximus", + "n02504458 African elephant, Loxodonta africana", + "n02509815 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", + "n02510455 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", + "n02514041 barracouta, snoek", + "n02526121 eel", + "n02536864 coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", + "n02606052 rock beauty, Holocanthus tricolor", + "n02607072 anemone fish", + "n02640242 sturgeon", + "n02641379 gar, garfish, garpike, billfish, Lepisosteus osseus", + "n02643566 lionfish", + "n02655020 puffer, pufferfish, blowfish, globefish", + "n02666196 abacus", + "n02667093 abaya", + "n02669723 academic gown, academic robe, judge's robe", + "n02672831 accordion, piano accordion, squeeze box", + "n02676566 acoustic guitar", + "n02687172 aircraft carrier, carrier, flattop, attack aircraft carrier", + "n02690373 airliner", + "n02692877 airship, dirigible", + "n02699494 altar", + "n02701002 ambulance", + "n02704792 amphibian, amphibious vehicle", + "n02708093 analog clock", + "n02727426 apiary, bee house", + "n02730930 apron", + "n02747177 ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin", + "n02749479 assault rifle, assault gun", + "n02769748 backpack, back pack, knapsack, packsack, rucksack, haversack", + "n02776631 bakery, bakeshop, bakehouse", + "n02777292 balance beam, beam", + "n02782093 balloon", + "n02783161 ballpoint, ballpoint pen, ballpen, Biro", + "n02786058 Band Aid", + "n02787622 banjo", + "n02788148 bannister, banister, balustrade, balusters, handrail", + "n02790996 barbell", + "n02791124 barber chair", + "n02791270 barbershop", + "n02793495 barn", + "n02794156 barometer", + "n02795169 barrel, cask", + "n02797295 barrow, garden cart, lawn cart, wheelbarrow", + "n02799071 baseball", + "n02802426 basketball", + "n02804414 bassinet", + "n02804610 bassoon", + "n02807133 bathing cap, swimming cap", + "n02808304 bath towel", + "n02808440 bathtub, bathing tub, bath, tub", + "n02814533 beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon", + "n02814860 beacon, lighthouse, beacon light, pharos", + "n02815834 beaker", + "n02817516 bearskin, busby, shako", + "n02823428 beer bottle", + "n02823750 beer glass", + "n02825657 bell cote, bell cot", + "n02834397 bib", + "n02835271 bicycle-built-for-two, tandem bicycle, tandem", + "n02837789 bikini, two-piece", + "n02840245 binder, ring-binder", + "n02841315 binoculars, field glasses, opera glasses", + "n02843684 birdhouse", + "n02859443 boathouse", + "n02860847 bobsled, bobsleigh, bob", + "n02865351 bolo tie, bolo, bola tie, bola", + "n02869837 bonnet, poke bonnet", + "n02870880 bookcase", + "n02871525 bookshop, bookstore, bookstall", + "n02877765 bottlecap", + "n02879718 bow", + "n02883205 bow tie, bow-tie, bowtie", + "n02892201 brass, memorial tablet, plaque", + "n02892767 brassiere, bra, bandeau", + "n02894605 breakwater, groin, groyne, mole, bulwark, seawall, jetty", + "n02895154 breastplate, aegis, egis", + "n02906734 broom", + "n02909870 bucket, pail", + "n02910353 buckle", + "n02916936 bulletproof vest", + "n02917067 bullet train, bullet", + "n02927161 butcher shop, meat market", + "n02930766 cab, hack, taxi, taxicab", + "n02939185 caldron, cauldron", + "n02948072 candle, taper, wax light", + "n02950826 cannon", + "n02951358 canoe", + "n02951585 can opener, tin opener", + "n02963159 cardigan", + "n02965783 car mirror", + "n02966193 carousel, carrousel, merry-go-round, roundabout, whirligig", + "n02966687 carpenter's kit, tool kit", + "n02971356 carton", + "n02974003 car wheel", + "n02977058 cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM", + "n02978881 cassette", + "n02979186 cassette player", + "n02980441 castle", + "n02981792 catamaran", + "n02988304 CD player", + "n02992211 cello, violoncello", + "n02992529 cellular telephone, cellular phone, cellphone, cell, mobile phone", + "n02999410 chain", + "n03000134 chainlink fence", + "n03000247 chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour", + "n03000684 chain saw, chainsaw", + "n03014705 chest", + "n03016953 chiffonier, commode", + "n03017168 chime, bell, gong", + "n03018349 china cabinet, china closet", + "n03026506 Christmas stocking", + "n03028079 church, church building", + "n03032252 cinema, movie theater, movie theatre, movie house, picture palace", + "n03041632 cleaver, meat cleaver, chopper", + "n03042490 cliff dwelling", + "n03045698 cloak", + "n03047690 clog, geta, patten, sabot", + "n03062245 cocktail shaker", + "n03063599 coffee mug", + "n03063689 coffeepot", + "n03065424 coil, spiral, volute, whorl, helix", + "n03075370 combination lock", + "n03085013 computer keyboard, keypad", + "n03089624 confectionery, confectionary, candy store", + "n03095699 container ship, containership, container vessel", + "n03100240 convertible", + "n03109150 corkscrew, bottle screw", + "n03110669 cornet, horn, trumpet, trump", + "n03124043 cowboy boot", + "n03124170 cowboy hat, ten-gallon hat", + "n03125729 cradle", + "n03126707 crane", + "n03127747 crash helmet", + "n03127925 crate", + "n03131574 crib, cot", + "n03133878 Crock Pot", + "n03134739 croquet ball", + "n03141823 crutch", + "n03146219 cuirass", + "n03160309 dam, dike, dyke", + "n03179701 desk", + "n03180011 desktop computer", + "n03187595 dial telephone, dial phone", + "n03188531 diaper, nappy, napkin", + "n03196217 digital clock", + "n03197337 digital watch", + "n03201208 dining table, board", + "n03207743 dishrag, dishcloth", + "n03207941 dishwasher, dish washer, dishwashing machine", + "n03208938 disk brake, disc brake", + "n03216828 dock, dockage, docking facility", + "n03218198 dogsled, dog sled, dog sleigh", + "n03220513 dome", + "n03223299 doormat, welcome mat", + "n03240683 drilling platform, offshore rig", + "n03249569 drum, membranophone, tympan", + "n03250847 drumstick", + "n03255030 dumbbell", + "n03259280 Dutch oven", + "n03271574 electric fan, blower", + "n03272010 electric guitar", + "n03272562 electric locomotive", + "n03290653 entertainment center", + "n03291819 envelope", + "n03297495 espresso maker", + "n03314780 face powder", + "n03325584 feather boa, boa", + "n03337140 file, file cabinet, filing cabinet", + "n03344393 fireboat", + "n03345487 fire engine, fire truck", + "n03347037 fire screen, fireguard", + "n03355925 flagpole, flagstaff", + "n03372029 flute, transverse flute", + "n03376595 folding chair", + "n03379051 football helmet", + "n03384352 forklift", + "n03388043 fountain", + "n03388183 fountain pen", + "n03388549 four-poster", + "n03393912 freight car", + "n03394916 French horn, horn", + "n03400231 frying pan, frypan, skillet", + "n03404251 fur coat", + "n03417042 garbage truck, dustcart", + "n03424325 gasmask, respirator, gas helmet", + "n03425413 gas pump, gasoline pump, petrol pump, island dispenser", + "n03443371 goblet", + "n03444034 go-kart", + "n03445777 golf ball", + "n03445924 golfcart, golf cart", + "n03447447 gondola", + "n03447721 gong, tam-tam", + "n03450230 gown", + "n03452741 grand piano, grand", + "n03457902 greenhouse, nursery, glasshouse", + "n03459775 grille, radiator grille", + "n03461385 grocery store, grocery, food market, market", + "n03467068 guillotine", + "n03476684 hair slide", + "n03476991 hair spray", + "n03478589 half track", + "n03481172 hammer", + "n03482405 hamper", + "n03483316 hand blower, blow dryer, blow drier, hair dryer, hair drier", + "n03485407 hand-held computer, hand-held microcomputer", + "n03485794 handkerchief, hankie, hanky, hankey", + "n03492542 hard disc, hard disk, fixed disk", + "n03494278 harmonica, mouth organ, harp, mouth harp", + "n03495258 harp", + "n03496892 harvester, reaper", + "n03498962 hatchet", + "n03527444 holster", + "n03529860 home theater, home theatre", + "n03530642 honeycomb", + "n03532672 hook, claw", + "n03534580 hoopskirt, crinoline", + "n03535780 horizontal bar, high bar", + "n03538406 horse cart, horse-cart", + "n03544143 hourglass", + "n03584254 iPod", + "n03584829 iron, smoothing iron", + "n03590841 jack-o'-lantern", + "n03594734 jean, blue jean, denim", + "n03594945 jeep, landrover", + "n03595614 jersey, T-shirt, tee shirt", + "n03598930 jigsaw puzzle", + "n03599486 jinrikisha, ricksha, rickshaw", + "n03602883 joystick", + "n03617480 kimono", + "n03623198 knee pad", + "n03627232 knot", + "n03630383 lab coat, laboratory coat", + "n03633091 ladle", + "n03637318 lampshade, lamp shade", + "n03642806 laptop, laptop computer", + "n03649909 lawn mower, mower", + "n03657121 lens cap, lens cover", + "n03658185 letter opener, paper knife, paperknife", + "n03661043 library", + "n03662601 lifeboat", + "n03666591 lighter, light, igniter, ignitor", + "n03670208 limousine, limo", + "n03673027 liner, ocean liner", + "n03676483 lipstick, lip rouge", + "n03680355 Loafer", + "n03690938 lotion", + "n03691459 loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", + "n03692522 loupe, jeweler's loupe", + "n03697007 lumbermill, sawmill", + "n03706229 magnetic compass", + "n03709823 mailbag, postbag", + "n03710193 mailbox, letter box", + "n03710637 maillot", + "n03710721 maillot, tank suit", + "n03717622 manhole cover", + "n03720891 maraca", + "n03721384 marimba, xylophone", + "n03724870 mask", + "n03729826 matchstick", + "n03733131 maypole", + "n03733281 maze, labyrinth", + "n03733805 measuring cup", + "n03742115 medicine chest, medicine cabinet", + "n03743016 megalith, megalithic structure", + "n03759954 microphone, mike", + "n03761084 microwave, microwave oven", + "n03763968 military uniform", + "n03764736 milk can", + "n03769881 minibus", + "n03770439 miniskirt, mini", + "n03770679 minivan", + "n03773504 missile", + "n03775071 mitten", + "n03775546 mixing bowl", + "n03776460 mobile home, manufactured home", + "n03777568 Model T", + "n03777754 modem", + "n03781244 monastery", + "n03782006 monitor", + "n03785016 moped", + "n03786901 mortar", + "n03787032 mortarboard", + "n03788195 mosque", + "n03788365 mosquito net", + "n03791053 motor scooter, scooter", + "n03792782 mountain bike, all-terrain bike, off-roader", + "n03792972 mountain tent", + "n03793489 mouse, computer mouse", + "n03794056 mousetrap", + "n03796401 moving van", + "n03803284 muzzle", + "n03804744 nail", + "n03814639 neck brace", + "n03814906 necklace", + "n03825788 nipple", + "n03832673 notebook, notebook computer", + "n03837869 obelisk", + "n03838899 oboe, hautboy, hautbois", + "n03840681 ocarina, sweet potato", + "n03841143 odometer, hodometer, mileometer, milometer", + "n03843555 oil filter", + "n03854065 organ, pipe organ", + "n03857828 oscilloscope, scope, cathode-ray oscilloscope, CRO", + "n03866082 overskirt", + "n03868242 oxcart", + "n03868863 oxygen mask", + "n03871628 packet", + "n03873416 paddle, boat paddle", + "n03874293 paddlewheel, paddle wheel", + "n03874599 padlock", + "n03876231 paintbrush", + "n03877472 pajama, pyjama, pj's, jammies", + "n03877845 palace", + "n03884397 panpipe, pandean pipe, syrinx", + "n03887697 paper towel", + "n03888257 parachute, chute", + "n03888605 parallel bars, bars", + "n03891251 park bench", + "n03891332 parking meter", + "n03895866 passenger car, coach, carriage", + "n03899768 patio, terrace", + "n03902125 pay-phone, pay-station", + "n03903868 pedestal, plinth, footstall", + "n03908618 pencil box, pencil case", + "n03908714 pencil sharpener", + "n03916031 perfume, essence", + "n03920288 Petri dish", + "n03924679 photocopier", + "n03929660 pick, plectrum, plectron", + "n03929855 pickelhaube", + "n03930313 picket fence, paling", + "n03930630 pickup, pickup truck", + "n03933933 pier", + "n03935335 piggy bank, penny bank", + "n03937543 pill bottle", + "n03938244 pillow", + "n03942813 ping-pong ball", + "n03944341 pinwheel", + "n03947888 pirate, pirate ship", + "n03950228 pitcher, ewer", + "n03954731 plane, carpenter's plane, woodworking plane", + "n03956157 planetarium", + "n03958227 plastic bag", + "n03961711 plate rack", + "n03967562 plow, plough", + "n03970156 plunger, plumber's helper", + "n03976467 Polaroid camera, Polaroid Land camera", + "n03976657 pole", + "n03977966 police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", + "n03980874 poncho", + "n03982430 pool table, billiard table, snooker table", + "n03983396 pop bottle, soda bottle", + "n03991062 pot, flowerpot", + "n03992509 potter's wheel", + "n03995372 power drill", + "n03998194 prayer rug, prayer mat", + "n04004767 printer", + "n04005630 prison, prison house", + "n04008634 projectile, missile", + "n04009552 projector", + "n04019541 puck, hockey puck", + "n04023962 punching bag, punch bag, punching ball, punchball", + "n04026417 purse", + "n04033901 quill, quill pen", + "n04033995 quilt, comforter, comfort, puff", + "n04037443 racer, race car, racing car", + "n04039381 racket, racquet", + "n04040759 radiator", + "n04041544 radio, wireless", + "n04044716 radio telescope, radio reflector", + "n04049303 rain barrel", + "n04065272 recreational vehicle, RV, R.V.", + "n04067472 reel", + "n04069434 reflex camera", + "n04070727 refrigerator, icebox", + "n04074963 remote control, remote", + "n04081281 restaurant, eating house, eating place, eatery", + "n04086273 revolver, six-gun, six-shooter", + "n04090263 rifle", + "n04099969 rocking chair, rocker", + "n04111531 rotisserie", + "n04116512 rubber eraser, rubber, pencil eraser", + "n04118538 rugby ball", + "n04118776 rule, ruler", + "n04120489 running shoe", + "n04125021 safe", + "n04127249 safety pin", + "n04131690 saltshaker, salt shaker", + "n04133789 sandal", + "n04136333 sarong", + "n04141076 sax, saxophone", + "n04141327 scabbard", + "n04141975 scale, weighing machine", + "n04146614 school bus", + "n04147183 schooner", + "n04149813 scoreboard", + "n04152593 screen, CRT screen", + "n04153751 screw", + "n04154565 screwdriver", + "n04162706 seat belt, seatbelt", + "n04179913 sewing machine", + "n04192698 shield, buckler", + "n04200800 shoe shop, shoe-shop, shoe store", + "n04201297 shoji", + "n04204238 shopping basket", + "n04204347 shopping cart", + "n04208210 shovel", + "n04209133 shower cap", + "n04209239 shower curtain", + "n04228054 ski", + "n04229816 ski mask", + "n04235860 sleeping bag", + "n04238763 slide rule, slipstick", + "n04239074 sliding door", + "n04243546 slot, one-armed bandit", + "n04251144 snorkel", + "n04252077 snowmobile", + "n04252225 snowplow, snowplough", + "n04254120 soap dispenser", + "n04254680 soccer ball", + "n04254777 sock", + "n04258138 solar dish, solar collector, solar furnace", + "n04259630 sombrero", + "n04263257 soup bowl", + "n04264628 space bar", + "n04265275 space heater", + "n04266014 space shuttle", + "n04270147 spatula", + "n04273569 speedboat", + "n04275548 spider web, spider's web", + "n04277352 spindle", + "n04285008 sports car, sport car", + "n04286575 spotlight, spot", + "n04296562 stage", + "n04310018 steam locomotive", + "n04311004 steel arch bridge", + "n04311174 steel drum", + "n04317175 stethoscope", + "n04325704 stole", + "n04326547 stone wall", + "n04328186 stopwatch, stop watch", + "n04330267 stove", + "n04332243 strainer", + "n04335435 streetcar, tram, tramcar, trolley, trolley car", + "n04336792 stretcher", + "n04344873 studio couch, day bed", + "n04346328 stupa, tope", + "n04347754 submarine, pigboat, sub, U-boat", + "n04350905 suit, suit of clothes", + "n04355338 sundial", + "n04355933 sunglass", + "n04356056 sunglasses, dark glasses, shades", + "n04357314 sunscreen, sunblock, sun blocker", + "n04366367 suspension bridge", + "n04367480 swab, swob, mop", + "n04370456 sweatshirt", + "n04371430 swimming trunks, bathing trunks", + "n04371774 swing", + "n04372370 switch, electric switch, electrical switch", + "n04376876 syringe", + "n04380533 table lamp", + "n04389033 tank, army tank, armored combat vehicle, armoured combat vehicle", + "n04392985 tape player", + "n04398044 teapot", + "n04399382 teddy, teddy bear", + "n04404412 television, television system", + "n04409515 tennis ball", + "n04417672 thatch, thatched roof", + "n04418357 theater curtain, theatre curtain", + "n04423845 thimble", + "n04428191 thresher, thrasher, threshing machine", + "n04429376 throne", + "n04435653 tile roof", + "n04442312 toaster", + "n04443257 tobacco shop, tobacconist shop, tobacconist", + "n04447861 toilet seat", + "n04456115 torch", + "n04458633 totem pole", + "n04461696 tow truck, tow car, wrecker", + "n04462240 toyshop", + "n04465501 tractor", + "n04467665 trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi", + "n04476259 tray", + "n04479046 trench coat", + "n04482393 tricycle, trike, velocipede", + "n04483307 trimaran", + "n04485082 tripod", + "n04486054 triumphal arch", + "n04487081 trolleybus, trolley coach, trackless trolley", + "n04487394 trombone", + "n04493381 tub, vat", + "n04501370 turnstile", + "n04505470 typewriter keyboard", + "n04507155 umbrella", + "n04509417 unicycle, monocycle", + "n04515003 upright, upright piano", + "n04517823 vacuum, vacuum cleaner", + "n04522168 vase", + "n04523525 vault", + "n04525038 velvet", + "n04525305 vending machine", + "n04532106 vestment", + "n04532670 viaduct", + "n04536866 violin, fiddle", + "n04540053 volleyball", + "n04542943 waffle iron", + "n04548280 wall clock", + "n04548362 wallet, billfold, notecase, pocketbook", + "n04550184 wardrobe, closet, press", + "n04552348 warplane, military plane", + "n04553703 washbasin, handbasin, washbowl, lavabo, wash-hand basin", + "n04554684 washer, automatic washer, washing machine", + "n04557648 water bottle", + "n04560804 water jug", + "n04562935 water tower", + "n04579145 whiskey jug", + "n04579432 whistle", + "n04584207 wig", + "n04589890 window screen", + "n04590129 window shade", + "n04591157 Windsor tie", + "n04591713 wine bottle", + "n04592741 wing", + "n04596742 wok", + "n04597913 wooden spoon", + "n04599235 wool, woolen, woollen", + "n04604644 worm fence, snake fence, snake-rail fence, Virginia fence", + "n04606251 wreck", + "n04612504 yawl", + "n04613696 yurt", + "n06359193 web site, website, internet site, site", + "n06596364 comic book", + "n06785654 crossword puzzle, crossword", + "n06794110 street sign", + "n06874185 traffic light, traffic signal, stoplight", + "n07248320 book jacket, dust cover, dust jacket, dust wrapper", + "n07565083 menu", + "n07579787 plate", + "n07583066 guacamole", + "n07584110 consomme", + "n07590611 hot pot, hotpot", + "n07613480 trifle", + "n07614500 ice cream, icecream", + "n07615774 ice lolly, lolly, lollipop, popsicle", + "n07684084 French loaf", + "n07693725 bagel, beigel", + "n07695742 pretzel", + "n07697313 cheeseburger", + "n07697537 hotdog, hot dog, red hot", + "n07711569 mashed potato", + "n07714571 head cabbage", + "n07714990 broccoli", + "n07715103 cauliflower", + "n07716358 zucchini, courgette", + "n07716906 spaghetti squash", + "n07717410 acorn squash", + "n07717556 butternut squash", + "n07718472 cucumber, cuke", + "n07718747 artichoke, globe artichoke", + "n07720875 bell pepper", + "n07730033 cardoon", + "n07734744 mushroom", + "n07742313 Granny Smith", + "n07745940 strawberry", + "n07747607 orange", + "n07749582 lemon", + "n07753113 fig", + "n07753275 pineapple, ananas", + "n07753592 banana", + "n07754684 jackfruit, jak, jack", + "n07760859 custard apple", + "n07768694 pomegranate", + "n07802026 hay", + "n07831146 carbonara", + "n07836838 chocolate sauce, chocolate syrup", + "n07860988 dough", + "n07871810 meat loaf, meatloaf", + "n07873807 pizza, pizza pie", + "n07875152 potpie", + "n07880968 burrito", + "n07892512 red wine", + "n07920052 espresso", + "n07930864 cup", + "n07932039 eggnog", + "n09193705 alp", + "n09229709 bubble", + "n09246464 cliff, drop, drop-off", + "n09256479 coral reef", + "n09288635 geyser", + "n09332890 lakeside, lakeshore", + "n09399592 promontory, headland, head, foreland", + "n09421951 sandbar, sand bar", + "n09428293 seashore, coast, seacoast, sea-coast", + "n09468604 valley, vale", + "n09472597 volcano", + "n09835506 ballplayer, baseball player", + "n10148035 groom, bridegroom", + "n10565667 scuba diver", + "n11879895 rapeseed", + "n11939491 daisy", + "n12057211 yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", + "n12144580 corn", + "n12267677 acorn", + "n12620546 hip, rose hip, rosehip", + "n12768682 buckeye, horse chestnut, conker", + "n12985857 coral fungus", + "n12998815 agaric", + "n13037406 gyromitra", + "n13040303 stinkhorn, carrion fungus", + "n13044778 earthstar", + "n13052670 hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", + "n13054560 bolete", + "n13133613 ear, spike, capitulum", + "n15075141 toilet tissue, toilet paper, bathroom tissue", +] + +synset_map = {} +for i, l in enumerate(synset): + label, desc = l.split(' ', 1) + synset_map[label] = {"index": i, "desc": desc, } diff --git a/test_resnet_inference.py b/test_resnet_inference.py new file mode 100644 index 0000000000000000000000000000000000000000..763ecbe2b1161ac25ed8a902917e2e2979522ce7 --- /dev/null +++ b/test_resnet_inference.py @@ -0,0 +1,59 @@ +import os +import json +import image_io +import numpy as np +from resnet.synset import * +import resnet.inference as resnet_inference +import tftools.var_collect as var_collect + +import tensorflow as tf + + +def print_prob(prob): + #print prob + pred = np.argsort(prob)[::-1] + + # Get top1 label + top1 = synset[pred[0]] + print "Top1: ", top1 + # Get top5 label + top5 = [synset[pred[i]] for i in range(5)] + print "Top5: ", top5 + return top1 + + +if __name__=='__main__': + model_dir = '/home/tanmay/Downloads/pretrained_networks/' + \ + 'Resnet/tensorflow-resnet-pretrained-20160509' + ckpt_filename = os.path.join(model_dir, 'ResNet-L50.ckpt') + + img = image_io.imread("/home/tanmay/Code/GenVQA/GenVQA/resnet/dalmatian.jpg") + img = image_io.imresize(img, output_size=(224,224)) + img = img.astype(np.float32) + + sess = tf.Session() + + images = tf.placeholder(tf.float32, shape=[1, 224, 224, 3], name='images') + logits = resnet_inference.inference(images, False) + prob_tensor = tf.nn.softmax(logits, name='prob') + + vars_to_restore = [] + for s in xrange(5): + vars_to_restore += var_collect.collect_scope('scale'+str(s+1)) + vars_to_restore += var_collect.collect_scope('fc') + + saver = tf.train.Saver(vars_to_restore) + saver.restore(sess, ckpt_filename) + + all_vars = var_collect.collect_all() + vars_to_init = [var for var in all_vars if var not in vars_to_restore] + + init = tf.initialize_variables(vars_to_init) + sess.run(init) + + print "graph restored" + + batch = img.reshape((1, 224, 224, 3)) + feed_dict = {images: batch} + prob = sess.run(prob_tensor, feed_dict=feed_dict) + print_prob(prob[0]) diff --git a/tftools/var_collect.py b/tftools/var_collect.py new file mode 100644 index 0000000000000000000000000000000000000000..3900633460f05e8cb1d9896fce78715b4c7f90a6 --- /dev/null +++ b/tftools/var_collect.py @@ -0,0 +1,50 @@ +import tensorflow as tf + + +def print_var_list(var_list, name='Variables'): + print name + ': \n' + '[' + ', '.join([var.name for var in var_list]) + ']' + + +def collect_name(var_name, graph=None): + if graph == None: + graph = tf.get_default_graph() + + var_list = graph.get_collection(tf.GraphKeys.VARIABLES, scope=var_name) + + assert_str = "No variable exists with name '{}'".format(var_name) + assert len(var_list) != 0, assert_str + + assert_str = \ + "Multiple variables exist with name_scope '{}'".format(var_name) + assert len(var_list) == 1, assert_str + + return var_list[0] + + +def collect_scope(name_scope, graph=None): + if graph == None: + graph = tf.get_default_graph() + + var_list = graph.get_collection(tf.GraphKeys.VARIABLES, scope=name_scope) + + assert_str = "No variable exists with name_scope '{}'".format(name_scope) + assert len(var_list) != 0, assert_str + + return var_list + + +def collect_all(graph=None): + if graph == None: + graph = tf.get_default_graph() + + var_list = graph.get_collection(tf.GraphKeys.VARIABLES) + + return var_list + + +def collect_list(var_name_list, graph=None): + var_dict = dict() + for var_name in var_name_list: + var_dict[var_name] = collect_name(var_name, graph=graph) + + return var_dict