A neural network object describes how input data should be preprocessed to be able to perform a simple inference and get raw output features from any layer.
Parameter
Type
Attributes
Description
Once the network has been created, you cannot modify the preprocessing field anymore.
Pre-processing object
This object describes how data should be preprocessed for each input of the network.
Parameter
Type
Description
Input pre-processing
Image pre-processing
Post-processing object
This object maps output tensors to a specific function in order to interpret them thanks to recognition versions.
You must specify exactly one of the tensors_output or standard_output fields. When we specify an expected tensor size in the description of those fields, we omit the first dimension of the tensor (i.e. the batch size).
Default post-processing
Standard post-processing (deprecated)
Create a network
Definition
Creates a new custom network after you have trained a model of your own on your infrastructure.
Once the network has been created, you cannot modify the preprocessing field anymore.
Code sample
# We download the Caffe a GoogleNet pre-trained networkcurl-o/tmp/deploy.prototxthttps://raw.githubusercontent.com/BVLC/caffe/master/models/bvlc_googlenet/deploy.prototxtcurl-o/tmp/snapshot.caffemodelhttp://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodelcurl-o/tmp/caffe_ilsvrc12.tar.gzhttp://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gztar-zxvf/tmp/caffe_ilsvrc12.tar.gz-C/tmp# Now proceed to uploadcurlhttps://api.deepomatic.com/v0.7/networks \-H "X-API-KEY: ${DEEPOMATIC_API_KEY}" \-F name='my new network' \-F description='trained with more images' \-F metadata='{"author": "me", "project": "Go to mars"}' \-F framework='nv-caffe-0.x-mod' \-F preprocessing='{"inputs": [{"tensor_name": "data","image": {"dimension_order":"NCHW", "target_size":"224x224", "resize_type":"SQUASH", "mean_file": "mean_file_1.binaryproto", "color_channels": "BGR", "pixel_scaling": 255.0, "data_type": "FLOAT32"}}], "batched_output": true}' \
-F deploy.prototxt=@/tmp/deploy.prototxt \-F snapshot.caffemodel=@/tmp/snapshot.caffemodel \-F mean_file_1.binaryproto=@/tmp/imagenet_mean.binaryproto
import osimport sysimport tempfileimport shutilimport hashlibimport requestsimport zipfilefrom deepomatic.api.client import Clientif sys.version_info >= (3,0):from urllib.request import urlretrieveelse:from urllib import urlretrieve# Initialize the clientclient =Client(api_key=os.getenv('DEEPOMATIC_API_KEY'))# Helper function to download demo resources for the Caffe pre-trained networksdefdownload_file(url): _, ext = os.path.splitext(url) filename = os.path.join(tempfile.gettempdir(), hashlib.sha1(url.encode()).hexdigest() + ext)print("Downloading {} to {}".format(url, filename))if os.path.exists(filename):# avoid redownloadingreturn filename r = requests.get(url, stream=True) r.raise_for_status()withopen(filename, 'wb')as f: r.raw.decode_content =True shutil.copyfileobj(r.raw, f)return filename# We download the Tensorflow Inception v3 pre-trained networkextract_dir = tempfile.gettempdir()net_zip = download_file('https://s3-eu-west-1.amazonaws.com/deepo-public/run-demo-networks/imagenet-inception-v3/network.zip')
preproc_zip = download_file('https://s3-eu-west-1.amazonaws.com/deepo-public/run-demo-networks/imagenet-inception-v3/preprocessing.zip')
model_file_name ='saved_model.pb'variables_file_name ='variables.index'variables_data_file_name ='variables.data-00000-of-00001'mean_file_name ='mean.proto.bin'model_file = os.path.join(extract_dir, model_file_name)mean_file = os.path.join(extract_dir, mean_file_name)variables_file = os.path.join(extract_dir +'/variables/', variables_file_name)variables_data_file = os.path.join(extract_dir +'/variables/', variables_data_file_name)print("Extracting archive...")ifnot os.path.exists(model_file):with zipfile.ZipFile(net_zip)as f: f.extractall(extract_dir)ifnot os.path.exists(mean_file):with zipfile.ZipFile(preproc_zip)as f: f.extractall(extract_dir)"""Here, we specify the network preprocessing. Please refer to the documentation to see what eachfield is used for."""preprocessing ={"inputs": [{"tensor_name":"map/TensorArrayStack/TensorArrayGatherV3:0","image":{"dimension_order":"NHWC","target_size":"299x299","resize_type":"CROP","mean_file": mean_file_name,"color_channels":"BGR","pixel_scaling":2.0,"data_type":"FLOAT32"}} ],"batched_output":True}"""We now register the three files needed by our network"""files ={ model_file_name:open(model_file, 'rb'), variables_file_name:open(variables_file, 'rb'), variables_data_file_name:open(variables_data_file, 'rb'), mean_file_name:open(mean_file, 'rb')}"""We now upload our new network via the 'client.Network().create(...)' network.Please refere to the documentation for a description of each parameter."""print("Uploading model to API...")network = client.Network.create(name="My first network", framework='tensorflow-1.x', preprocessing=preprocessing, files=files)network_id = network['id']print("Network ID = {}".format(network_id))
Network files
You will need to provide several additional files to create the network.
TensorFlow files
You need to specify at least one of those files for the tensorflow-1.x framework:
saved_model.pb: the file that specifies the the network architecture.
saved_model.pbtxt: same as above but serialised in it text format.
If the saved model does not embed the variables weights, you will need to specify additional files:
variables.data-00000-of-00001: the file that specifies variables' weights. It is usually located in a variables directory. Numbers can change but must respect those of your original file.
variables.index: the index of variables. It is usually located in a variables directory.
Pre-processing files
You might also include any additional file as required by you various input types, for exemple any mean file named as you like and whose name is referred by the mean_file parameter field of a pre-processing object as long it has one of the supported extensions, see the documentation.
Please refer to the Saving mean files code sample bellow to find out how to save you mean files before sending them to the API.
Saving mean files
In order to save numpy tensor means to files before sending them to the API, please proceed like this:
Python
import numpy as np# example mean file when `dimension_order == "HWC"` and H = 1, W = 1 and C = 3# typically, your mean image as been compute on the training images and you already# have this tensor available.example_mean_file = np.ones((1, 1, 3))# Save this mean to 'mean.npy'withopen('mean.npy', 'wb')as f: np.save(f, mean, allow_pickle=False)# You can now use `"mean_file": "mean.npy"` in the preprocessing JSON# {# ...# "mean_file": "mean.npy"# ...# }
{"id": 42,"name": "My first network","description": "A neural network trained on some data","task_id": 123,"update_date": "2018-02-16T16:37:25.148189Z","metadata": {"any":"value" },"preprocessing": {"inputs": [ {"tensor_name":"data","image": {"dimension_order":"NCHW","target_size":"224x224","resize_type":"SQUASH","mean_file":"mean.proto.bin","color_channels":"BGR","pixel_scaling":255.0,"data_type":"FLOAT32" } } ],"batched_output":true }}
List networks
Code sample
Lists all public and private networks:
# For public networks:curlhttps://api.deepomatic.com/v0.7/networks/public \-H "X-API-KEY: ${DEEPOMATIC_API_KEY}"# For private networks:curlhttps://api.deepomatic.com/v0.7/networks \-H "X-API-KEY: ${DEEPOMATIC_API_KEY}"
import osfrom deepomatic.api.client import Clientclient =Client(api_key=os.getenv('DEEPOMATIC_API_KEY'))# For public networks:for network in client.Network.list(public=True):print(network)# For private networks:for network in client.Network.list():print(network)
# To retrieve a public network, use:GEThttps://api.deepomatic.com/v0.7/networks/public/{NETWORK_ID}# To retrieve your own network, use:GEThttps://api.deepomatic.com/v0.7/networks/{NETWORK_ID}
import osfrom deepomatic.api.client import Clientclient =Client(api_key=os.getenv('DEEPOMATIC_API_KEY'))# {NETWORK_ID} may be a string for a public# network or an integer for your own network.client.Network.retrieve({NETWORK_ID})
Arguments
Code sample
# For a public network:curlhttps://api.deepomatic.com/v0.7/networks/public/imagenet-inception-v1 \-H "X-API-KEY: ${DEEPOMATIC_API_KEY}"# For a private network:curlhttps://api.deepomatic.com/v0.7/networks/42 \-H "X-API-KEY: ${DEEPOMATIC_API_KEY}"
import osfrom deepomatic.api.client import Clientclient =Client(api_key=os.getenv('DEEPOMATIC_API_KEY'))# For a public network:client.Network.retrieve("imagenet-inception-v1")# For a private network:client.Network.retrieve(42)