Model Creation C++ Sample
@sphinxdirective
This sample demonstrates how to execute an synchronous inference using :doc:model <openvino_docs_OV_UG_Model_Representation> built on the fly which uses weights from LeNet classification model, which is known to work well on digit classification tasks.
You do not need an XML file to create a model. The API of ov::Model allows creating a model on the fly from the source code.
The following C++ API is used in the application:
+------------------------------------------+-----------------------------------------+---------------------------------------+
| Feature | API | Description |
+==========================================+=========================================+=======================================+
| OpenVINO Runtime Info | ov::Core::get_versions | Get device plugins versions |
+------------------------------------------+-----------------------------------------+---------------------------------------+
| Shape Operations | ov::Output::get_shape, | Operate with shape |
| | ov::Shape::size, | |
| | ov::shape_size | |
+------------------------------------------+-----------------------------------------+---------------------------------------+
| Tensor Operations | ov::Tensor::get_byte_size, | Get tensor byte size and its data |
| | ov::Tensor:data | |
+------------------------------------------+-----------------------------------------+---------------------------------------+
| Model Operations | ov::set_batch | Operate with model batch size |
+------------------------------------------+-----------------------------------------+---------------------------------------+
| Infer Request Operations | ov::InferRequest::get_input_tensor | Get a input tensor |
+------------------------------------------+-----------------------------------------+---------------------------------------+
| Model creation objects | ov::opset8::Parameter, | Used to construct an OpenVINO model |
| | ov::Node::output, | |
| | ov::opset8::Constant, | |
| | ov::opset8::Convolution, | |
| | ov::opset8::Add, | |
| | ov::opset1::MaxPool, | |
| | ov::opset8::Reshape, | |
| | ov::opset8::MatMul, | |
| | ov::opset8::Relu, | |
| | ov::opset8::Softmax, | |
| | ov::descriptor::Tensor::set_names, | |
| | ov::opset8::Result, | |
| | ov::Model, | |
| | ov::ParameterVector::vector | |
+------------------------------------------+-----------------------------------------+---------------------------------------+
Basic OpenVINO™ Runtime API is covered by :doc:Hello Classification C++ sample <openvino_inference_engine_samples_hello_classification_README>.
+---------------------------------------------------------+-------------------------------------------------------------------------------------------------+
| Options | Values |
+=========================================================+=================================================================================================+
| Validated Models | LeNet |
+---------------------------------------------------------+-------------------------------------------------------------------------------------------------+
| Model Format | model weights file (*.bin) |
+---------------------------------------------------------+-------------------------------------------------------------------------------------------------+
| Validated images | single-channel MNIST ubyte images |
+---------------------------------------------------------+-------------------------------------------------------------------------------------------------+
| Supported devices | :doc:All <openvino_docs_OV_UG_supported_plugins_Supported_Devices> |
+---------------------------------------------------------+-------------------------------------------------------------------------------------------------+
| Other language realization | :doc:Python <openvino_inference_engine_ie_bridges_python_sample_model_creation_sample_README> |
+---------------------------------------------------------+-------------------------------------------------------------------------------------------------+
How It Works ############
At startup, the sample application does the following:
- Reads command line parameters
- :doc:
Build a Model <openvino_docs_OV_UG_Model_Representation>and passed weights file - Loads the model and input data to the OpenVINO™ Runtime plugin
- Performs synchronous inference and processes output data, logging each step in a standard output stream
You can see the explicit description of each sample step at :doc:Integration Steps <openvino_docs_OV_UG_Integrate_OV_with_your_application> section of "Integrate OpenVINO™ Runtime with Your Application" guide.
Building ########
To build the sample, please use instructions available at :doc:Build the Sample Applications <openvino_docs_OV_UG_Samples_Overview> section in OpenVINO™ Toolkit Samples guide.
Running #######
.. code-block:: console
model_creation_sample <path_to_lenet_weights>
.. note::
- you can use LeNet model weights in the sample folder:
lenet.binwith FP32 weights file - The
lenet.binwith FP32 weights file was generated by the :doc:Model Optimizer <openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide>tool from the public LeNet model with the--input_shape [64,1,28,28]parameter specified.
The original model is available in the Caffe* repository <https://github.com/BVLC/caffe/tree/master/examples/mnist>__ on GitHub*.
You can do inference of an image using a pre-trained model on a GPU using the following command:
.. code-block:: console
model_creation_sample lenet.bin GPU
Sample Output #############
The sample application logs each step in a standard output stream and outputs top-10 inference results.
.. code-block:: console
[ INFO ] OpenVINO Runtime version ......... [ INFO ] Build ........... [ INFO ] [ INFO ] Device info: [ INFO ] GPU [ INFO ] Intel GPU plugin version ......... [ INFO ] Build ........... [ INFO ] [ INFO ] [ INFO ] Create model from weights: lenet.bin [ INFO ] model name: lenet [ INFO ] inputs [ INFO ] input name: NONE [ INFO ] input type: f32 [ INFO ] input shape: {64, 1, 28, 28} [ INFO ] outputs [ INFO ] output name: output_tensor [ INFO ] output type: f32 [ INFO ] output shape: {64, 10} [ INFO ] Batch size is 10 [ INFO ] model name: lenet [ INFO ] inputs [ INFO ] input name: NONE [ INFO ] input type: u8 [ INFO ] input shape: {10, 28, 28, 1} [ INFO ] outputs [ INFO ] output name: output_tensor [ INFO ] output type: f32 [ INFO ] output shape: {10, 10} [ INFO ] Compiling a model for the GPU device [ INFO ] Create infer request [ INFO ] Combine images in batch and set to input tensor [ INFO ] Start sync inference [ INFO ] Processing output tensor
Top 1 results:
Image 0
classid probability label
0 1.0000000 0
Image 1
classid probability label
1 1.0000000 1
Image 2
classid probability label
2 1.0000000 2
Image 3
classid probability label
3 1.0000000 3
Image 4
classid probability label
4 1.0000000 4
Image 5
classid probability label
5 1.0000000 5
Image 6
classid probability label
6 1.0000000 6
Image 7
classid probability label
7 1.0000000 7
Image 8
classid probability label
8 1.0000000 8
Image 9
classid probability label
9 1.0000000 9
Deprecation Notice ##################
+--------------------+------------------+ | Deprecation Begins | June 1, 2020 | +====================+==================+ | Removal Date | December 1, 2020 | +--------------------+------------------+
See Also ########
- :doc:
Integrate the OpenVINO™ Runtime with Your Application <openvino_docs_OV_UG_Integrate_OV_with_your_application> - :doc:
Using OpenVINO™ Toolkit Samples <openvino_docs_OV_UG_Samples_Overview> - :doc:
Model Optimizer <openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide>
@endsphinxdirective