Intel® Distribution of OpenVINO™ Toolkit
Community assistance about the Intel® Distribution of OpenVINO™ toolkit, OpenCV, and all aspects of computer vision-related on Intel® platforms.
6392 Discussions

Is there a tutorial or documentation for running custom tensorflow network in movidius ?

idata
Employee
1,784 Views

Hello,

 

I am trying to run facenet (Inception Resnet V1 on movidius). Please point me towards any tutorial as to how to start compiling for tensorflow. I tried mvCCompile on mnist softmax.py example from the tensorflow website and got the following error. Please help. I am also attaching the softmax.py which I used to create a frozen graph.

 

mvNCCompile mnist_output/mnist_default.meta -in=input -s12 -o=mnist_graph -on=output mvNCCompile v02.00, Copyright @ Movidius Ltd 2016 /usr/local/lib/python3.5/dist-packages/tensorflow/python/util/tf_inspect.py:45: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead if d.decorator_argspec is not None), _inspect.getargspec(target)) [Error 34] Setup Error: Values for input contain placeholder. Pass an absolute value.

 

softmax.py code below:

 

from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import sys import tempfile from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf FLAGS = None def deepnn(x): """deepnn builds the graph for a deep net for classifying digits. Args: x: an input tensor with the dimensions (N_examples, 784), where 784 is the number of pixels in a standard MNIST image. Returns: A tuple (y, keep_prob). y is a tensor of shape (N_examples, 10), with values equal to the logits of classifying the digit into one of 10 classes (the digits 0-9). keep_prob is a scalar placeholder for the probability of dropout. """ # Reshape to use within a convolutional neural net. # Last dimension is for "features" - there is only one here, since images are # grayscale -- it would be 3 for an RGB image, 4 for RGBA, etc. with tf.name_scope('reshape'): x_image = tf.reshape(x, [-1, 28, 28, 1]) # First convolutional layer - maps one grayscale image to 32 feature maps. with tf.name_scope('conv1'): W_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bias_variable([32]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # Pooling layer - downsamples by 2X. with tf.name_scope('pool1'): h_pool1 = max_pool_2x2(h_conv1) # Second convolutional layer -- maps 32 feature maps to 64. with tf.name_scope('conv2'): W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) # Second pooling layer. with tf.name_scope('pool2'): h_pool2 = max_pool_2x2(h_conv2) # Fully connected layer 1 -- after 2 round of downsampling, our 28x28 image # is down to 7x7x64 feature maps -- maps this to 1024 features. with tf.name_scope('fc1'): W_fc1 = weight_variable([7 * 7 * 64, 1024]) b_fc1 = bias_variable([1024]) h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) # Dropout - controls the complexity of the model, prevents co-adaptation of # features. with tf.name_scope('dropout'): keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) # Map the 1024 features to 10 classes, one for each digit with tf.name_scope('fc2'): W_fc2 = weight_variable([1024, 10]) b_fc2 = bias_variable([10]) y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 return y_conv, keep_prob def conv2d(x, W): """conv2d returns a 2d convolution layer with full stride.""" return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') def max_pool_2x2(x): """max_pool_2x2 downsamples a feature map by 2X.""" return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') def weight_variable(shape): """weight_variable generates a weight variable of a given shape.""" initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) def bias_variable(shape): """bias_variable generates a bias variable of a given shape.""" initial = tf.constant(0.1, shape=shape) return tf.Variable(initial) def main(_): # Import data mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) # Create the model x = tf.placeholder(tf.float32, [None, 784], name ="input") # Define loss and optimizer y_ = tf.placeholder(tf.float32, [None, 10], name = "output") # Build the graph for the deep net y_conv, keep_prob = deepnn(x) with tf.name_scope('loss'): cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv) cross_entropy = tf.reduce_mean(cross_entropy) with tf.name_scope('adam_optimizer'): train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) with tf.name_scope('accuracy'): correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) correct_prediction = tf.cast(correct_prediction, tf.float32) accuracy = tf.reduce_mean(correct_prediction) graph_location = tempfile.mkdtemp() print('Saving graph to: %s' % graph_location) train_writer = tf.summary.FileWriter(graph_location) train_writer.add_graph(tf.get_default_graph()) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(20000): batch = mnist.train.next_batch(50) if i % 100 == 0: train_accuracy = accuracy.eval(feed_dict={ x: batch[0], y_: batch[1], keep_prob: 1.0}) print('step %d, training accuracy %g' % (i, train_accuracy)) train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) saver = tf.train.Saver(tf.global_variables()) saver.save(sess, "mnist_output/"+'mnist_default') print('test accuracy %g' % accuracy.eval(feed_dict={ x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data', help='Directory for storing input data') FLAGS, unparsed = parser.parse_known_args() tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
0 Kudos
42 Replies
idata
Employee
886 Views

Please look at this page https://movidius.github.io/ncsdk/TensorFlow.html especially the section "Save Session with graph and checkpoint information".

 

Looks like you need to do something like this to save the session with specific values for input placeholders such as image size etc.

 

import numpy as np import tensorflow as tf from tensorflow.contrib.slim.nets import inception slim = tf.contrib.slim def run(name, image_size, num_classes): with tf.Graph().as_default(): image = tf.placeholder("float", [1, image_size, image_size, 3], name="input") with slim.arg_scope(inception.inception_v1_arg_scope()): logits, _ = inception.inception_v1(image, num_classes, is_training=False, spatial_squeeze=False) probabilities = tf.nn.softmax(logits) init_fn = slim.assign_from_checkpoint_fn('inception_v1.ckpt', slim.get_model_variables('InceptionV1')) with tf.Session() as sess: init_fn(sess) saver = tf.train.Saver(tf.global_variables()) saver.save(sess, "output/"+name) run('inception-v1', 224, 1001)
0 Kudos
idata
Employee
886 Views

@aboggaram ,

 

i am also getting same error, please let me know if you find the solution.

 

my detail question is here

 

https://stackoverflow.com/questions/47012711/how-to-test-custom-created-model-of-tensorflow-on-movidius
0 Kudos
idata
Employee
886 Views

@ramana.rachakonda I have gone through that tutorial and followed the exact same steps but still ending up with the error given mnist example. The documentation given here is not sufficient. @AshwinVijayakumar and Intel team, can you please provide a solid example to compile a custom network rather than those from the tf.contrib.slim module? Thanks a lot,

 

Achyut
0 Kudos
idata
Employee
886 Views

@Tome_at_Intel Please help me here. Thanks

0 Kudos
idata
Employee
886 Views

@aboggaram we are writing an article about this, and I expect to publish it sometime next week, will let you know as soon as it goes LIVE.

0 Kudos
idata
Employee
886 Views

Awesome, thanks so much!

0 Kudos
idata
Employee
886 Views

@AshwinVijayakumar When can we expect the article?

0 Kudos
idata
Employee
886 Views

Waiting for it too!

0 Kudos
idata
Employee
886 Views

Similarly interested in this article.

0 Kudos
idata
Employee
886 Views

Also waiting for this..

0 Kudos
idata
Employee
886 Views

I'm very interested in this topic,too.

0 Kudos
idata
Employee
886 Views

Hi everyone, I am running a little behind on putting this article together. I was tied up putting the first 2 articles on https://movidius.github.io/blog/, please watch out for the tensorflow article on this blog site.

0 Kudos
idata
Employee
886 Views

Will you be at CES if so whats the booth number?

0 Kudos
idata
Employee
886 Views

@AshwinVijayakumar i am wondering about multiple feature support, it can be built by us somehow or overcome this?

0 Kudos
idata
Employee
886 Views

@chicagobob123 , We will be at the Intel NTG, Movidius Group booth - https://ces18.mapyourshow.com/7_0/exhibitor/exhibitor-details.cfm?ExhID=T0007775

0 Kudos
idata
Employee
886 Views

@GoldenWings, not sure I understand. Can you please clarify what you mean by 'multiple feature support'?

0 Kudos
idata
Employee
886 Views

@AshwinVijayakumar i mean multiple input currently the sdk supports single input i was wondering if there is away to ocercome this

0 Kudos
idata
Employee
886 Views

Also waiting for this.

0 Kudos
idata
Employee
886 Views

@AshwinVijayakumar : Where exactly is the example for custom tensor flow network in the blog? I am having a custom object detection tensor flow .meta file. I want to run that on Movidius neural stick.

 

I am using following command:

 

mvNCCompile -s 12 models/model.meta -in=input_1 -on=conv2_1/bias

 

and I am getting the following error:

 

[Error 34] Setup Error: Values for input contain placeholder. Pass an absolute value.
0 Kudos
idata
Employee
709 Views

I also look forward to the blog post. Any update on how to compile a tf network using mvNCCompile is highly appreciated as well.

0 Kudos
Reply