add inception v3
Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/fc4d1ccc Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/fc4d1ccc Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/fc4d1ccc Branch: refs/heads/master Commit: fc4d1ccc8033d70dd813bddb5c041d61d3ee388a Parents: 2cdc172 Author: wang wei <[email protected]> Authored: Thu Jul 6 23:23:08 2017 +0800 Committer: wang wei <[email protected]> Committed: Thu Jul 6 23:23:08 2017 +0800 ---------------------------------------------------------------------- examples/cifar10/vgg.py | 1 + examples/imagenet/inception/README.md | 43 +++++ examples/imagenet/inception/convert.py | 117 ++++++++++++ examples/imagenet/inception/model.py | 263 ++++++++++++++++++++++++++ examples/imagenet/inception/serve.py | 121 ++++++++++++ examples/imagenet/inceptionv4/README.md | 43 ----- examples/imagenet/inceptionv4/convert.py | 117 ------------ examples/imagenet/inceptionv4/model.py | 263 -------------------------- examples/imagenet/inceptionv4/serve.py | 121 ------------ 9 files changed, 545 insertions(+), 544 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/cifar10/vgg.py ---------------------------------------------------------------------- diff --git a/examples/cifar10/vgg.py b/examples/cifar10/vgg.py index 89c6fe8..ce0c210 100644 --- a/examples/cifar10/vgg.py +++ b/examples/cifar10/vgg.py @@ -28,6 +28,7 @@ from singa import metric from singa import loss from singa import net as ffnet +ffnet.verbose=True def ConvBnReLU(net, name, nb_filers, sample_shape=None): net.add(layer.Conv2D(name + '_1', nb_filers, 3, 1, pad=1, http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inception/README.md ---------------------------------------------------------------------- diff --git a/examples/imagenet/inception/README.md b/examples/imagenet/inception/README.md new file mode 100644 index 0000000..f129edc --- /dev/null +++ b/examples/imagenet/inception/README.md @@ -0,0 +1,43 @@ +--- +name: Inception V4 on ImageNet +SINGA version: 1.1.1 +SINGA commit: +parameter_url: https://s3-ap-southeast-1.amazonaws.com/dlfile/inception_v4.tar.gz +parameter_sha1: 5fdd6f5d8af8fd10e7321d9b38bb87ef14e80d56 +license: https://github.com/tensorflow/models/tree/master/slim +--- + +# Image Classification using Inception V4 + +In this example, we convert Inception V4 trained on Tensorflow to SINGA for image classification. + +## Instructions + +* Download the parameter checkpoint file + + $ wget + $ tar xvf inception_v4.tar.gz + +* Download [synset_word.txt](https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh) file. + +* Run the program + + # use cpu + $ python serve.py -C & + # use gpu + $ python serve.py & + +* Submit images for classification + + $ curl -i -F [email protected] http://localhost:9999/api + $ curl -i -F [email protected] http://localhost:9999/api + $ curl -i -F [email protected] http://localhost:9999/api + +image1.jpg, image2.jpg and image3.jpg should be downloaded before executing the above commands. + +## Details + +We first extract the parameter values from [Tensorflow's checkpoint file](http://download.tensorflow.org/models/inception_v4_2016_09_09.tar.gz) into a pickle version. +After downloading and decompressing the checkpoint file, run the following script + + $ python convert.py --file_name=inception_v4.ckpt http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inception/convert.py ---------------------------------------------------------------------- diff --git a/examples/imagenet/inception/convert.py b/examples/imagenet/inception/convert.py new file mode 100644 index 0000000..e3f5adc --- /dev/null +++ b/examples/imagenet/inception/convert.py @@ -0,0 +1,117 @@ +# Copyright 2016 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 simple script for inspect checkpoint files.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import sys +import cPickle as pickle +import os + +import numpy as np +from tensorflow.python import pywrap_tensorflow +from tensorflow.python.platform import app +import model + + +FLAGS = None + + +def rename(name, suffix): + p = name.rfind('/') + if p == -1: + print('Bad name=%s' % name) + return name[0:p+1] + suffix + + +def convert(file_name): + net, _ = model.create_net() + params = {'SINGA_VERSION': 1101} + try: + reader = pywrap_tensorflow.NewCheckpointReader(file_name) + for pname, pval in zip(net.param_names(), net.param_values()): + if 'weight' in pname: + val = reader.get_tensor(rename(pname, 'weights')) + if 'Conv' in pname: + val = val.transpose((3, 2, 0, 1)) + val = val.reshape((val.shape[0], -1)) + elif 'bias' in pname: + val = reader.get_tensor(rename(pname, 'biases')) + elif 'mean' in pname: + val = reader.get_tensor(rename(pname, 'moving_mean')) + elif 'var' in pname: + val = reader.get_tensor(rename(pname, 'moving_variance')) + elif 'beta' in pname: + val= reader.get_tensor(pname) + elif 'gamma' in pname: + val = np.ones(pval.shape) + else: + print('not matched param %s' % pname) + assert val.shape == pval.shape, ('the shapes not match ', val.shape, pval.shape) + params[pname] = val.astype(np.float32) + print('converting:', pname, pval.shape) + var_to_shape_map = reader.get_variable_to_shape_map() + for key in var_to_shape_map: + if 'weights' in key: + key = rename(key, 'weight') + elif 'biases' in key: + key = rename(key, 'bias') + elif 'moving_mean' in key: + key = rename(key, 'mean') + elif 'moving_variance' in key: + key = rename(key, 'var') + if key not in params: + print('key=%s not in the net' % key) + ''' + for key in var_to_shape_map: + print("tensor_name: ", key, var_to_shape_map[key]) + ''' + with open(os.path.splitext(file_name)[0] + '.pickle', 'wb') as fd: + pickle.dump(params, fd) + except Exception as e: # pylint: disable=broad-except + print(str(e)) + if "corrupted compressed block contents" in str(e): + print("It's likely that your checkpoint file has been compressed " + "with SNAPPY.") + if ("Data loss" in str(e) and + (any([e in file_name for e in [".index", ".meta", ".data"]]))): + proposed_file = ".".join(file_name.split(".")[0:-1]) + v2_file_error_template = """ + It's likely that this is a V2 checkpoint and you need to provide the filename + *prefix*. Try removing the '.' and extension. Try: + inspect checkpoint --file_name = {}""" + print(v2_file_error_template.format(proposed_file)) + + + +def main(unused_argv): + if not FLAGS.file_name: + print("Usage: convert.py --file_name=checkpoint_file_name ") + sys.exit(1) + else: + convert(FLAGS.file_name) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.register("type", "bool", lambda v: v.lower() == "true") + parser.add_argument( + "--file_name", type=str, default="", help="Checkpoint filename. " + "Note, if using Checkpoint V2 format, file_name is the " + "shared prefix between all files in the checkpoint.") + FLAGS, unparsed = parser.parse_known_args() + app.run(main=main, argv=[sys.argv[0]] + unparsed) http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inception/model.py ---------------------------------------------------------------------- diff --git a/examples/imagenet/inception/model.py b/examples/imagenet/inception/model.py new file mode 100644 index 0000000..baab522 --- /dev/null +++ b/examples/imagenet/inception/model.py @@ -0,0 +1,263 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ============================================================================= + + +""" +http://arxiv.org/abs/1602.07261. + + Inception-v4, Inception-ResNet and the Impact of Residual Connections + on Learning + Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi + +Refer to +https://github.com/tensorflow/models/blob/master/slim/nets/inception_v4.py +""" + + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from singa.layer import Conv2D, Activation, MaxPooling2D, AvgPooling2D,\ + Split, Concat, Dropout, Flatten, Dense, BatchNormalization + +from singa import net as ffnet + +ffnet.verbose = True + +def conv2d(net, name, nb_filter, k, s=1, padding='SAME', src=None): + net.add(Conv2D(name, nb_filter, k, s, border_mode=padding, use_bias=False), src) + net.add(BatchNormalization('%s/BatchNorm' % name)) + return net.add(Activation(name+'/relu')) + + +def block_inception_a(name, net): + """Builds Inception-A block for Inception v4 network.""" + # By default use stride=1 and SAME padding + split = net.add(Split('%s/Split' % name, 4)) + br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 96, 1, src=split) + conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 64, 1, src=split) + br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % name, 96, 3) + conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 64, 1, src=split) + conv2d(net, '%s/Branch_2/Conv2d_0b_3x3' % name, 96, 3) + br2 = conv2d(net, '%s/Branch_2/Conv2d_0c_3x3' % name, 96, 3) + net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, stride=1), split) + br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 96, 1) + return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3]) + + +def block_reduction_a(name, net): + """Builds Reduction-A block for Inception v4 network.""" + # By default use stride=1 and SAME padding + split = net.add(Split('%s/Split' % name, 3)) + br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % name, 384, 3, 2, padding='VALID', src=split) + conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 192, 1, src=split) + conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % name, 224, 3) + br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % name, 256, 3, 2, padding='VALID') + br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), split) + return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2]) + + +def block_inception_b(name, net): + """Builds Inception-B block for Inception v4 network.""" + # By default use stride=1 and SAME padding + split = net.add(Split('%s/Split' % name, 4)) + br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 384, 1, src=split) + conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 192, 1, src=split) + conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % name, 224, (1, 7)) + br1 = conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % name, 256, (7, 1)) + conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 192, 1, src=split) + conv2d(net, '%s/Branch_2/Conv2d_0b_7x1' % name, 192, (7, 1)) + conv2d(net, '%s/Branch_2/Conv2d_0c_1x7' % name, 224, (1, 7)) + conv2d(net, '%s/Branch_2/Conv2d_0d_7x1' % name, 224, (7, 1)) + br2 = conv2d(net, '%s/Branch_2/Conv2d_0e_1x7' % name, 256, (1, 7)) + net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, 1), split) + br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 128, 1) + return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3]) + + +def block_reduction_b(name, net): + """Builds Reduction-B block for Inception v4 network.""" + # By default use stride=1 and SAME padding + split = net.add(Split('%s/Split', 3)) + conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 192, 1, src=split) + br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % name, 192, 3, 2, padding='VALID') + conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 256, 1, src=split) + conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % name, 256, (1, 7)) + conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % name, 320, (7, 1)) + br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % name, 320, 3, 2, padding='VALID') + br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), split) + return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2]) + + +def block_inception_c(name, net): + """Builds Inception-C block for Inception v4 network.""" + # By default use stride=1 and SAME padding + split = net.add(Split('%s/Split' % name, 4)) + br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 256, 1, src=split) + conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 384, 1, src=split) + br1_split = net.add(Split('%s/Branch_1/Split' % name, 2)) + br1_0 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x3' % name, 256, (1, 3), src=br1_split) + br1_1 = conv2d(net, '%s/Branch_1/Conv2d_0c_3x1' % name, 256, (3, 1), src=br1_split) + br1 = net.add(Concat('%s/Branch_1/Concat' % name, 1), [br1_0, br1_1]) + conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 384, 1, src=split) + conv2d(net, '%s/Branch_2/Conv2d_0b_3x1' % name, 448, (3, 1)) + conv2d(net, '%s/Branch_2/Conv2d_0c_1x3' % name, 512, (1, 3)) + br2_split = net.add(Split('%s/Branch_2/Split' % name, 2)) + br2_0 = conv2d(net, '%s/Branch_2/Conv2d_0d_1x3' % name, 256, (1, 3), src=br2_split) + br2_1 = conv2d(net, '%s/Branch_2/Conv2d_0e_3x1' % name, 256, (3, 1), src=br2_split) + br2 = net.add(Concat('%s/Branch_2/Concat' % name, 1), [br2_0, br2_1]) + net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, 1), split) + br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 256, 1) + return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3]) + + +def inception_v4_base(name, sample_shape, final_endpoint='Mixed_7d', aux_name=None): + """Creates the Inception V4 network up to the given final endpoint. + + Args: + inputs: a 4-D tensor of size [batch_size, height, width, 3]. + final_endpoint: specifies the endpoint to construct the network up to. + It can be one of [ 'Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'Mixed_3a', 'Mixed_4a', 'Mixed_5a', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', + 'Mixed_5e', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', 'Mixed_6e', + 'Mixed_6f', 'Mixed_6g', 'Mixed_6h', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c', + 'Mixed_7d'] + + Returns: + logits: the logits outputs of the model. + end_points: the set of end_points from the inception model. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + """ + end_points = {} + net = ffnet.FeedForwardNet() + def add_and_check_final(name, lyr): + end_points[name] = lyr + return name == final_endpoint + + # 299 x 299 x 3 + net.add(Conv2D('%s/Conv2d_1a_3x3' % name, 32, 3, 2, border_mode='VALID', use_bias=False, input_sample_shape=sample_shape)) + net.add(BatchNormalization('%s/Conv2d_1a_3x3/BatchNorm' % name)) + net.add(Activation('%s/Conv2d_1a_3x3/relu' % name)) + # 149 x 149 x 32 + conv2d(net, '%s/Conv2d_2a_3x3' % name, 32, 3, padding='VALID') + # 147 x 147 x 32 + conv2d(net, '%s/Conv2d_2b_3x3' % name, 64, 3) + # 147 x 147 x 64 + s = net.add(Split('%s/Mixed_3a/Split' % name, 2)) + br0 = net.add(MaxPooling2D('%s/Mixed_3a/Branch_0/MaxPool_0a_3x3' % name, 3, 2, border_mode='VALID'), s) + br1 = conv2d(net, '%s/Mixed_3a/Branch_1/Conv2d_0a_3x3' % name, 96, 3, 2, padding='VALID', src=s) + net.add(Concat('%s/Mixed_3a/Concat' % name, 1), [br0, br1]) + + # 73 x 73 x 160 + s = net.add(Split('%s/Mixed_4a/Split' % name, 2)) + conv2d(net, '%s/Mixed_4a/Branch_0/Conv2d_0a_1x1' % name, 64, 1, src=s) + br0 = conv2d(net, '%s/Mixed_4a/Branch_0/Conv2d_1a_3x3' % name, 96, 3, padding='VALID') + conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0a_1x1' % name, 64, 1, src=s) + conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0b_1x7' % name, 64, (1, 7)) + conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0c_7x1' % name, 64, (7, 1)) + br1 = conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_1a_3x3' % name, 96, 3, padding='VALID') + net.add(Concat('%s/Mixed_4a/Concat' % name, 1), [br0, br1]) + + # 71 x 71 x 192 + s = net.add(Split('%s/Mixed_5a/Split' % name, 2)) + br0 = conv2d(net, '%s/Mixed_5a/Branch_0/Conv2d_1a_3x3' % name, 192, 3, 2, padding='VALID', src=s) + br1 = net.add(MaxPooling2D('%s/Mixed_5a/Branch_1/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), s) + net.add(Concat('%s/Mixed_5a/Concat' % name, 1), [br0, br1]) + + # 35 x 35 x 384 + # 4 x Inception-A blocks + for idx in range(4): + block_scope = name + '/Mixed_5' + chr(ord('b') + idx) + lyr = block_inception_a(block_scope, net) + if add_and_check_final(block_scope, lyr): return net, lyr, end_points + + # 35 x 35 x 384 + # Reduction-A block + block_reduction_a(name + '/Mixed_6a', net) + + # 17 x 17 x 1024 + # 7 x Inception-B blocks + for idx in range(7): + block_scope = name + '/Mixed_6' + chr(ord('b') + idx) + lyr = block_inception_b(block_scope, net) + if add_and_check_final(block_scope, lyr): return net, lyr, end_points + if block_scope == aux_name: + end_points[aux_name] = net.add(Split('%s/Split' % block_scope, 2)) + + # 17 x 17 x 1024 + # Reduction-B block + block_reduction_b(name + '/Mixed_7a', net) + + # 8 x 8 x 1536 + # 3 x Inception-C blocks + for idx in range(3): + block_scope = name + '/Mixed_7' + chr(ord('b') + idx) + lyr = block_inception_c(block_scope, net) + if add_and_check_final(block_scope, lyr): return net, lyr, end_points + if block_scope == aux_name: + end_points[aux_name] = net.add(Split('%s/Split' % block_scope, 2)) + return net, lyr, end_points + + +def create_net(num_classes=1001, sample_shape=(3, 299, 299), is_training=True, dropout_keep_prob=0.8, create_aux_logits=True): + """Creates the Inception V4 model. + + Args: + num_classes: number of predicted classes. + is_training: whether is training or not. + dropout_keep_prob: float, the fraction to keep before final layer. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + create_aux_logits: Whether to include the auxiliary logits. + + Returns: + logits: the logits outputs of the model. + end_points: the set of end_points from the inception model. + """ + end_points = {} + name = 'InceptionV4' + if is_training and create_aux_logits: + aux_name = name + '/Mixed_6h' + else: + aux_name = None + net, last_layer, end_points = inception_v4_base(name, sample_shape, aux_name=aux_name) + # Auxiliary Head logits + if aux_name is not None: + # 17 x 17 x 1024 + aux_logits = end_points[aux_name] + net.add(AvgPooling2D('%s/AuxLogits/AvgPool_1a_5x5' % name, 5, stride=3, border_mode='VALID'), aux_logits) + t = conv2d(net, '%s/AuxLogits/Conv2d_1b_1x1' % name, 128, 1) + conv2d(net, '%s/AuxLogits/Conv2d_2a' % name, 768, t.get_output_sample_shape()[1:3], padding='VALID') + net.add(Flatten('%s/AuxLogits/flat' % name)) + end_points['AuxLogits'] = net.add(Dense('%s/AuxLogits/Aux_logits' % name, num_classes)) + + # Final pooling and prediction + # 8 x 8 x 1536 + net.add(AvgPooling2D('%s/Logits/AvgPool_1a' % name, last_layer.get_output_sample_shape()[1:3], border_mode='VALID'), last_layer) + # 1 x 1 x 1536 + net.add(Dropout('%s/Logits/Dropout_1b' % name, 1 - dropout_keep_prob)) + net.add(Flatten('%s/Logits/PreLogitsFlatten' % name)) + # 1536 + end_points['Logits'] = net.add(Dense('%s/Logits/Logits' % name, num_classes)) + return net, end_points + + +if __name__ == '__main__': + net, _ = create_net() http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inception/serve.py ---------------------------------------------------------------------- diff --git a/examples/imagenet/inception/serve.py b/examples/imagenet/inception/serve.py new file mode 100644 index 0000000..9ba099a --- /dev/null +++ b/examples/imagenet/inception/serve.py @@ -0,0 +1,121 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ============================================================================= +import model + +from singa import device +from singa import tensor +from singa import image_tool +from singa import layer +from rafiki.agent import Agent, MsgType + +import sys +import time +import traceback +from argparse import ArgumentParser +import numpy as np + + +def serve(agent, use_cpu, parameter_file, topk=5): + if use_cpu: + print('running with cpu') + dev = device.get_default_device() + layer.engine = 'singacpp' + else: + print("runing with gpu") + dev = device.create_cuda_gpu() + agent = agent + + print('Start intialization............') + net, _ = model.create_net(is_training=False) + net.load(parameter_file, use_pickle=True) + net.to_device(dev) + print('End intialization............') + + labels = np.loadtxt('synset_words.txt', str, delimiter='\t').tolist() + labels.insert(0, 'empty background') + while True: + key, val = agent.pull() + if key is None: + time.sleep(0.1) + continue + msg_type = MsgType.parse(key) + if msg_type.is_request(): + try: + response = "" + ratio = 0.875 + img = image_tool.load_img(val['image']) + height, width = img.size[0], img.size[1] + print(img.size) + crop_h, crop_w = int(height * ratio), int(width * ratio) + img = np.array(image_tool.crop(img, (crop_h, crop_w), 'center').resize((299, 299))).astype(np.float32) / float(255) + img -= 0.5 + img *= 2 + # img[:,:,[0,1,2]] = img[:,:,[2,1,0]] + img = img.transpose((2, 0, 1)) + images = np.expand_dims(img, axis=0) + x = tensor.from_numpy(images.astype(np.float32)) + x.to_device(dev) + y = net.predict(x) + prob = np.average(tensor.to_numpy(y), 0) + # sort and reverse + idx = np.argsort(-prob)[0:topk] + for i in idx: + response += "%s:%s<br/>" % (labels[i], prob[i]) + except: + traceback.print_exc() + response = "Sorry, system error during prediction." + agent.push(MsgType.kResponse, response) + elif MsgType.kCommandStop.equal(msg_type): + print('get stop command') + agent.push(MsgType.kStatus, "success") + break + else: + print('get unsupported message %s' % str(msg_type)) + agent.push(MsgType.kStatus, "Unknown command") + break + # while loop + print("server stop") + + +def main(): + try: + # Setup argument parser + parser = ArgumentParser(description="InceptionV4 for image classification") + parser.add_argument("-p", "--port", default=9999, help="listen port") + parser.add_argument("-C", "--use_cpu", action="store_true") + parser.add_argument("--parameter_file", default="inception_v4.pickle", + help="relative path") + + # Process arguments + args = parser.parse_args() + port = args.port + + # start to train + agent = Agent(port) + serve(agent, args.use_cpu, args.parameter_file) + agent.stop() + + except SystemExit: + return + except: + traceback.print_exc() + sys.stderr.write(" for help use --help \n\n") + return 2 + + +if __name__ == '__main__': + main() http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inceptionv4/README.md ---------------------------------------------------------------------- diff --git a/examples/imagenet/inceptionv4/README.md b/examples/imagenet/inceptionv4/README.md deleted file mode 100644 index f129edc..0000000 --- a/examples/imagenet/inceptionv4/README.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -name: Inception V4 on ImageNet -SINGA version: 1.1.1 -SINGA commit: -parameter_url: https://s3-ap-southeast-1.amazonaws.com/dlfile/inception_v4.tar.gz -parameter_sha1: 5fdd6f5d8af8fd10e7321d9b38bb87ef14e80d56 -license: https://github.com/tensorflow/models/tree/master/slim ---- - -# Image Classification using Inception V4 - -In this example, we convert Inception V4 trained on Tensorflow to SINGA for image classification. - -## Instructions - -* Download the parameter checkpoint file - - $ wget - $ tar xvf inception_v4.tar.gz - -* Download [synset_word.txt](https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh) file. - -* Run the program - - # use cpu - $ python serve.py -C & - # use gpu - $ python serve.py & - -* Submit images for classification - - $ curl -i -F [email protected] http://localhost:9999/api - $ curl -i -F [email protected] http://localhost:9999/api - $ curl -i -F [email protected] http://localhost:9999/api - -image1.jpg, image2.jpg and image3.jpg should be downloaded before executing the above commands. - -## Details - -We first extract the parameter values from [Tensorflow's checkpoint file](http://download.tensorflow.org/models/inception_v4_2016_09_09.tar.gz) into a pickle version. -After downloading and decompressing the checkpoint file, run the following script - - $ python convert.py --file_name=inception_v4.ckpt http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inceptionv4/convert.py ---------------------------------------------------------------------- diff --git a/examples/imagenet/inceptionv4/convert.py b/examples/imagenet/inceptionv4/convert.py deleted file mode 100644 index e3f5adc..0000000 --- a/examples/imagenet/inceptionv4/convert.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright 2016 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 simple script for inspect checkpoint files.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import argparse -import sys -import cPickle as pickle -import os - -import numpy as np -from tensorflow.python import pywrap_tensorflow -from tensorflow.python.platform import app -import model - - -FLAGS = None - - -def rename(name, suffix): - p = name.rfind('/') - if p == -1: - print('Bad name=%s' % name) - return name[0:p+1] + suffix - - -def convert(file_name): - net, _ = model.create_net() - params = {'SINGA_VERSION': 1101} - try: - reader = pywrap_tensorflow.NewCheckpointReader(file_name) - for pname, pval in zip(net.param_names(), net.param_values()): - if 'weight' in pname: - val = reader.get_tensor(rename(pname, 'weights')) - if 'Conv' in pname: - val = val.transpose((3, 2, 0, 1)) - val = val.reshape((val.shape[0], -1)) - elif 'bias' in pname: - val = reader.get_tensor(rename(pname, 'biases')) - elif 'mean' in pname: - val = reader.get_tensor(rename(pname, 'moving_mean')) - elif 'var' in pname: - val = reader.get_tensor(rename(pname, 'moving_variance')) - elif 'beta' in pname: - val= reader.get_tensor(pname) - elif 'gamma' in pname: - val = np.ones(pval.shape) - else: - print('not matched param %s' % pname) - assert val.shape == pval.shape, ('the shapes not match ', val.shape, pval.shape) - params[pname] = val.astype(np.float32) - print('converting:', pname, pval.shape) - var_to_shape_map = reader.get_variable_to_shape_map() - for key in var_to_shape_map: - if 'weights' in key: - key = rename(key, 'weight') - elif 'biases' in key: - key = rename(key, 'bias') - elif 'moving_mean' in key: - key = rename(key, 'mean') - elif 'moving_variance' in key: - key = rename(key, 'var') - if key not in params: - print('key=%s not in the net' % key) - ''' - for key in var_to_shape_map: - print("tensor_name: ", key, var_to_shape_map[key]) - ''' - with open(os.path.splitext(file_name)[0] + '.pickle', 'wb') as fd: - pickle.dump(params, fd) - except Exception as e: # pylint: disable=broad-except - print(str(e)) - if "corrupted compressed block contents" in str(e): - print("It's likely that your checkpoint file has been compressed " - "with SNAPPY.") - if ("Data loss" in str(e) and - (any([e in file_name for e in [".index", ".meta", ".data"]]))): - proposed_file = ".".join(file_name.split(".")[0:-1]) - v2_file_error_template = """ - It's likely that this is a V2 checkpoint and you need to provide the filename - *prefix*. Try removing the '.' and extension. Try: - inspect checkpoint --file_name = {}""" - print(v2_file_error_template.format(proposed_file)) - - - -def main(unused_argv): - if not FLAGS.file_name: - print("Usage: convert.py --file_name=checkpoint_file_name ") - sys.exit(1) - else: - convert(FLAGS.file_name) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.register("type", "bool", lambda v: v.lower() == "true") - parser.add_argument( - "--file_name", type=str, default="", help="Checkpoint filename. " - "Note, if using Checkpoint V2 format, file_name is the " - "shared prefix between all files in the checkpoint.") - FLAGS, unparsed = parser.parse_known_args() - app.run(main=main, argv=[sys.argv[0]] + unparsed) http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inceptionv4/model.py ---------------------------------------------------------------------- diff --git a/examples/imagenet/inceptionv4/model.py b/examples/imagenet/inceptionv4/model.py deleted file mode 100644 index baab522..0000000 --- a/examples/imagenet/inceptionv4/model.py +++ /dev/null @@ -1,263 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# ============================================================================= - - -""" -http://arxiv.org/abs/1602.07261. - - Inception-v4, Inception-ResNet and the Impact of Residual Connections - on Learning - Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi - -Refer to -https://github.com/tensorflow/models/blob/master/slim/nets/inception_v4.py -""" - - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -from singa.layer import Conv2D, Activation, MaxPooling2D, AvgPooling2D,\ - Split, Concat, Dropout, Flatten, Dense, BatchNormalization - -from singa import net as ffnet - -ffnet.verbose = True - -def conv2d(net, name, nb_filter, k, s=1, padding='SAME', src=None): - net.add(Conv2D(name, nb_filter, k, s, border_mode=padding, use_bias=False), src) - net.add(BatchNormalization('%s/BatchNorm' % name)) - return net.add(Activation(name+'/relu')) - - -def block_inception_a(name, net): - """Builds Inception-A block for Inception v4 network.""" - # By default use stride=1 and SAME padding - split = net.add(Split('%s/Split' % name, 4)) - br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 96, 1, src=split) - conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 64, 1, src=split) - br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % name, 96, 3) - conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 64, 1, src=split) - conv2d(net, '%s/Branch_2/Conv2d_0b_3x3' % name, 96, 3) - br2 = conv2d(net, '%s/Branch_2/Conv2d_0c_3x3' % name, 96, 3) - net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, stride=1), split) - br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 96, 1) - return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3]) - - -def block_reduction_a(name, net): - """Builds Reduction-A block for Inception v4 network.""" - # By default use stride=1 and SAME padding - split = net.add(Split('%s/Split' % name, 3)) - br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % name, 384, 3, 2, padding='VALID', src=split) - conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 192, 1, src=split) - conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % name, 224, 3) - br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % name, 256, 3, 2, padding='VALID') - br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), split) - return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2]) - - -def block_inception_b(name, net): - """Builds Inception-B block for Inception v4 network.""" - # By default use stride=1 and SAME padding - split = net.add(Split('%s/Split' % name, 4)) - br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 384, 1, src=split) - conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 192, 1, src=split) - conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % name, 224, (1, 7)) - br1 = conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % name, 256, (7, 1)) - conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 192, 1, src=split) - conv2d(net, '%s/Branch_2/Conv2d_0b_7x1' % name, 192, (7, 1)) - conv2d(net, '%s/Branch_2/Conv2d_0c_1x7' % name, 224, (1, 7)) - conv2d(net, '%s/Branch_2/Conv2d_0d_7x1' % name, 224, (7, 1)) - br2 = conv2d(net, '%s/Branch_2/Conv2d_0e_1x7' % name, 256, (1, 7)) - net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, 1), split) - br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 128, 1) - return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3]) - - -def block_reduction_b(name, net): - """Builds Reduction-B block for Inception v4 network.""" - # By default use stride=1 and SAME padding - split = net.add(Split('%s/Split', 3)) - conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 192, 1, src=split) - br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % name, 192, 3, 2, padding='VALID') - conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 256, 1, src=split) - conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % name, 256, (1, 7)) - conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % name, 320, (7, 1)) - br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % name, 320, 3, 2, padding='VALID') - br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), split) - return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2]) - - -def block_inception_c(name, net): - """Builds Inception-C block for Inception v4 network.""" - # By default use stride=1 and SAME padding - split = net.add(Split('%s/Split' % name, 4)) - br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 256, 1, src=split) - conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 384, 1, src=split) - br1_split = net.add(Split('%s/Branch_1/Split' % name, 2)) - br1_0 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x3' % name, 256, (1, 3), src=br1_split) - br1_1 = conv2d(net, '%s/Branch_1/Conv2d_0c_3x1' % name, 256, (3, 1), src=br1_split) - br1 = net.add(Concat('%s/Branch_1/Concat' % name, 1), [br1_0, br1_1]) - conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 384, 1, src=split) - conv2d(net, '%s/Branch_2/Conv2d_0b_3x1' % name, 448, (3, 1)) - conv2d(net, '%s/Branch_2/Conv2d_0c_1x3' % name, 512, (1, 3)) - br2_split = net.add(Split('%s/Branch_2/Split' % name, 2)) - br2_0 = conv2d(net, '%s/Branch_2/Conv2d_0d_1x3' % name, 256, (1, 3), src=br2_split) - br2_1 = conv2d(net, '%s/Branch_2/Conv2d_0e_3x1' % name, 256, (3, 1), src=br2_split) - br2 = net.add(Concat('%s/Branch_2/Concat' % name, 1), [br2_0, br2_1]) - net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, 1), split) - br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 256, 1) - return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3]) - - -def inception_v4_base(name, sample_shape, final_endpoint='Mixed_7d', aux_name=None): - """Creates the Inception V4 network up to the given final endpoint. - - Args: - inputs: a 4-D tensor of size [batch_size, height, width, 3]. - final_endpoint: specifies the endpoint to construct the network up to. - It can be one of [ 'Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', - 'Mixed_3a', 'Mixed_4a', 'Mixed_5a', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', - 'Mixed_5e', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', 'Mixed_6e', - 'Mixed_6f', 'Mixed_6g', 'Mixed_6h', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c', - 'Mixed_7d'] - - Returns: - logits: the logits outputs of the model. - end_points: the set of end_points from the inception model. - - Raises: - ValueError: if final_endpoint is not set to one of the predefined values, - """ - end_points = {} - net = ffnet.FeedForwardNet() - def add_and_check_final(name, lyr): - end_points[name] = lyr - return name == final_endpoint - - # 299 x 299 x 3 - net.add(Conv2D('%s/Conv2d_1a_3x3' % name, 32, 3, 2, border_mode='VALID', use_bias=False, input_sample_shape=sample_shape)) - net.add(BatchNormalization('%s/Conv2d_1a_3x3/BatchNorm' % name)) - net.add(Activation('%s/Conv2d_1a_3x3/relu' % name)) - # 149 x 149 x 32 - conv2d(net, '%s/Conv2d_2a_3x3' % name, 32, 3, padding='VALID') - # 147 x 147 x 32 - conv2d(net, '%s/Conv2d_2b_3x3' % name, 64, 3) - # 147 x 147 x 64 - s = net.add(Split('%s/Mixed_3a/Split' % name, 2)) - br0 = net.add(MaxPooling2D('%s/Mixed_3a/Branch_0/MaxPool_0a_3x3' % name, 3, 2, border_mode='VALID'), s) - br1 = conv2d(net, '%s/Mixed_3a/Branch_1/Conv2d_0a_3x3' % name, 96, 3, 2, padding='VALID', src=s) - net.add(Concat('%s/Mixed_3a/Concat' % name, 1), [br0, br1]) - - # 73 x 73 x 160 - s = net.add(Split('%s/Mixed_4a/Split' % name, 2)) - conv2d(net, '%s/Mixed_4a/Branch_0/Conv2d_0a_1x1' % name, 64, 1, src=s) - br0 = conv2d(net, '%s/Mixed_4a/Branch_0/Conv2d_1a_3x3' % name, 96, 3, padding='VALID') - conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0a_1x1' % name, 64, 1, src=s) - conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0b_1x7' % name, 64, (1, 7)) - conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0c_7x1' % name, 64, (7, 1)) - br1 = conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_1a_3x3' % name, 96, 3, padding='VALID') - net.add(Concat('%s/Mixed_4a/Concat' % name, 1), [br0, br1]) - - # 71 x 71 x 192 - s = net.add(Split('%s/Mixed_5a/Split' % name, 2)) - br0 = conv2d(net, '%s/Mixed_5a/Branch_0/Conv2d_1a_3x3' % name, 192, 3, 2, padding='VALID', src=s) - br1 = net.add(MaxPooling2D('%s/Mixed_5a/Branch_1/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), s) - net.add(Concat('%s/Mixed_5a/Concat' % name, 1), [br0, br1]) - - # 35 x 35 x 384 - # 4 x Inception-A blocks - for idx in range(4): - block_scope = name + '/Mixed_5' + chr(ord('b') + idx) - lyr = block_inception_a(block_scope, net) - if add_and_check_final(block_scope, lyr): return net, lyr, end_points - - # 35 x 35 x 384 - # Reduction-A block - block_reduction_a(name + '/Mixed_6a', net) - - # 17 x 17 x 1024 - # 7 x Inception-B blocks - for idx in range(7): - block_scope = name + '/Mixed_6' + chr(ord('b') + idx) - lyr = block_inception_b(block_scope, net) - if add_and_check_final(block_scope, lyr): return net, lyr, end_points - if block_scope == aux_name: - end_points[aux_name] = net.add(Split('%s/Split' % block_scope, 2)) - - # 17 x 17 x 1024 - # Reduction-B block - block_reduction_b(name + '/Mixed_7a', net) - - # 8 x 8 x 1536 - # 3 x Inception-C blocks - for idx in range(3): - block_scope = name + '/Mixed_7' + chr(ord('b') + idx) - lyr = block_inception_c(block_scope, net) - if add_and_check_final(block_scope, lyr): return net, lyr, end_points - if block_scope == aux_name: - end_points[aux_name] = net.add(Split('%s/Split' % block_scope, 2)) - return net, lyr, end_points - - -def create_net(num_classes=1001, sample_shape=(3, 299, 299), is_training=True, dropout_keep_prob=0.8, create_aux_logits=True): - """Creates the Inception V4 model. - - Args: - num_classes: number of predicted classes. - is_training: whether is training or not. - dropout_keep_prob: float, the fraction to keep before final layer. - reuse: whether or not the network and its variables should be reused. To be - able to reuse 'scope' must be given. - create_aux_logits: Whether to include the auxiliary logits. - - Returns: - logits: the logits outputs of the model. - end_points: the set of end_points from the inception model. - """ - end_points = {} - name = 'InceptionV4' - if is_training and create_aux_logits: - aux_name = name + '/Mixed_6h' - else: - aux_name = None - net, last_layer, end_points = inception_v4_base(name, sample_shape, aux_name=aux_name) - # Auxiliary Head logits - if aux_name is not None: - # 17 x 17 x 1024 - aux_logits = end_points[aux_name] - net.add(AvgPooling2D('%s/AuxLogits/AvgPool_1a_5x5' % name, 5, stride=3, border_mode='VALID'), aux_logits) - t = conv2d(net, '%s/AuxLogits/Conv2d_1b_1x1' % name, 128, 1) - conv2d(net, '%s/AuxLogits/Conv2d_2a' % name, 768, t.get_output_sample_shape()[1:3], padding='VALID') - net.add(Flatten('%s/AuxLogits/flat' % name)) - end_points['AuxLogits'] = net.add(Dense('%s/AuxLogits/Aux_logits' % name, num_classes)) - - # Final pooling and prediction - # 8 x 8 x 1536 - net.add(AvgPooling2D('%s/Logits/AvgPool_1a' % name, last_layer.get_output_sample_shape()[1:3], border_mode='VALID'), last_layer) - # 1 x 1 x 1536 - net.add(Dropout('%s/Logits/Dropout_1b' % name, 1 - dropout_keep_prob)) - net.add(Flatten('%s/Logits/PreLogitsFlatten' % name)) - # 1536 - end_points['Logits'] = net.add(Dense('%s/Logits/Logits' % name, num_classes)) - return net, end_points - - -if __name__ == '__main__': - net, _ = create_net() http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/fc4d1ccc/examples/imagenet/inceptionv4/serve.py ---------------------------------------------------------------------- diff --git a/examples/imagenet/inceptionv4/serve.py b/examples/imagenet/inceptionv4/serve.py deleted file mode 100644 index 9ba099a..0000000 --- a/examples/imagenet/inceptionv4/serve.py +++ /dev/null @@ -1,121 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# ============================================================================= -import model - -from singa import device -from singa import tensor -from singa import image_tool -from singa import layer -from rafiki.agent import Agent, MsgType - -import sys -import time -import traceback -from argparse import ArgumentParser -import numpy as np - - -def serve(agent, use_cpu, parameter_file, topk=5): - if use_cpu: - print('running with cpu') - dev = device.get_default_device() - layer.engine = 'singacpp' - else: - print("runing with gpu") - dev = device.create_cuda_gpu() - agent = agent - - print('Start intialization............') - net, _ = model.create_net(is_training=False) - net.load(parameter_file, use_pickle=True) - net.to_device(dev) - print('End intialization............') - - labels = np.loadtxt('synset_words.txt', str, delimiter='\t').tolist() - labels.insert(0, 'empty background') - while True: - key, val = agent.pull() - if key is None: - time.sleep(0.1) - continue - msg_type = MsgType.parse(key) - if msg_type.is_request(): - try: - response = "" - ratio = 0.875 - img = image_tool.load_img(val['image']) - height, width = img.size[0], img.size[1] - print(img.size) - crop_h, crop_w = int(height * ratio), int(width * ratio) - img = np.array(image_tool.crop(img, (crop_h, crop_w), 'center').resize((299, 299))).astype(np.float32) / float(255) - img -= 0.5 - img *= 2 - # img[:,:,[0,1,2]] = img[:,:,[2,1,0]] - img = img.transpose((2, 0, 1)) - images = np.expand_dims(img, axis=0) - x = tensor.from_numpy(images.astype(np.float32)) - x.to_device(dev) - y = net.predict(x) - prob = np.average(tensor.to_numpy(y), 0) - # sort and reverse - idx = np.argsort(-prob)[0:topk] - for i in idx: - response += "%s:%s<br/>" % (labels[i], prob[i]) - except: - traceback.print_exc() - response = "Sorry, system error during prediction." - agent.push(MsgType.kResponse, response) - elif MsgType.kCommandStop.equal(msg_type): - print('get stop command') - agent.push(MsgType.kStatus, "success") - break - else: - print('get unsupported message %s' % str(msg_type)) - agent.push(MsgType.kStatus, "Unknown command") - break - # while loop - print("server stop") - - -def main(): - try: - # Setup argument parser - parser = ArgumentParser(description="InceptionV4 for image classification") - parser.add_argument("-p", "--port", default=9999, help="listen port") - parser.add_argument("-C", "--use_cpu", action="store_true") - parser.add_argument("--parameter_file", default="inception_v4.pickle", - help="relative path") - - # Process arguments - args = parser.parse_args() - port = args.port - - # start to train - agent = Agent(port) - serve(agent, args.use_cpu, args.parameter_file) - agent.stop() - - except SystemExit: - return - except: - traceback.print_exc() - sys.stderr.write(" for help use --help \n\n") - return 2 - - -if __name__ == '__main__': - main()
