---
# System prepended metadata

title: Intel Movidius NCS 2

---

# Intel Movidius NCS 2
## Setting raspberry pi
**Note: NCS2 currently doesn't support raspberry pi**
### Configure locale
Edit the file `/etc/locale.gen`, uncomment the lines for the locales you want and run
```
sudo locale-gen
sudo dpkg-reconfigure locales
```

### Install some needed package (optional)
#### vim
```
sudo apt-get update
sudo apt-get install vim
```
Enter all the line below in `~/.vimrc`
```
# vim ~/.vimrc
syntax on
set t_Co=256
set encoding=utf-8
set nu
set ts=4
set shiftwidth=4
set smartindent
```

## Setting host in Virtualbox
Download ubuntu 16.04 LTS from [here](https://www.ubuntu-tw.org/modules/tinyd0/)

Download Oracle VM Extension pack from [here](https://www.virtualbox.org/wiki/Downloads)
**Note: The verion of extension pack must match the version of VirtualBox you are using!**

Create an ubuntu 16.04 VM (below are all personal choices)
* Choose 4096 RAM for now
* Select 2 virtual CPU
* Set up to 40GB dynamically allocated VDI

### VM USB passthrough setting
Go to the *"Settings"* for your VM and edit *"Ports > USB"* to reflect a *"USB 3.0 (xHCI) Controller"*
You need to set **USB2** and **USB3** Device Filters for the Movidius to seamlessly stay connected.
To to this, click *"Add new USB filter"* as is marked in the below image
![](https://i.imgur.com/eg3ruEz.png)
Create two USB Device Filters. Most of the fields can be left blank except Name and Vendor ID.
* Name: **Movidius1**, Vendor ID: **03e7**
* Name: **Movidius2**, Vendor ID: **040e**

Time to boot the Ubuntu 16.04 VM, the installation of OS might take a while...
### After ubuntu 16.04 has been installed
#### Update the system
```
sudo apt-get install update
```
#### Install guest additions
Go to the Devices menu of Virtual box and clicking *"Insert Guest Additions CD Image…"*
#### Install openVINO toolkit
Download the latest toolkit from [here](https://software.seek.intel.com/openvino-toolkit)
After downloading, open the terminal and run these commands
```
cd ~/Downloads
tar xvf l_openvino_toolkit_<VERSION>.tgz
cd l_openvino_toolkit_<VERSION>
sudo ./install_cv_sdk_dependencies.sh
./install_GUI.sh
```

#### Setup environment variable
1. Edit `.bashrc` in <user_directory>
```
vi ~/.bashrc
```
2. Add this line at the end of the file
```
source ~/intel/computer_vision_sdk/bin/setupvars.sh
```
3. To test your change, open a new terminal. You will see 
```
[setupvars.sh] OpenVINO environment initialized
```

#### Configure model optimizer
```
cd ~/intel/computer_vision_sdk/deployment_tools/model_optimizer/install_prerequisites
sudo ./install_prerequisites.sh
```

**Notes:** If this error message `locale.Error: unsupported locale setting` pop up, enter these commands and re-run the commands above
```
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales
```

### Additional step (required)
```
sudo usermod -a -G users "$(whoami)"
```
To perform inference on movidius NCS, install the USB rules as follows
```
cat <<EOF > 97-usbboot.rules
SUBSYSTEM=="usb", ATTRS{idProduct}=="2150", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="usb", ATTRS{idProduct}=="2485", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="usb", ATTRS{idProduct}=="f63b", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
EOF
```
Then use the following commands
```
sudo cp 97-usbboot.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo ldconfig
rm 97-usbboot.rules
```

## Compiling Tensorflow model with openVINO

### Training 
When you are training your model, add the line with `+` before it in your training code
This will save your training model
```
+ saver = tf.train.Saver()
...
with tf.Session() as sess:
+   save_path = saver.save(sess, './model')
```
After training complete, there will be four files in your current directory
```
model.data-00000-of-00001
model.index
model.meta
checkpoint
```

### Create inference model
Copy your training code to inference only code by following command
```
cp <your_trianing_code> <any_name_you_want_for_inference_only_code>
```
Remove all training specific code in the copied inference only code such as
```
Dropout layer
loading training data
cross entropy
accuracy
placeholder except input
... etc
```

Now remove all the code below `with tf.Session() as sess:` and add those lines with `+` before it
```
with tf.Session() as sess:
+    sess.run(init)
+    saver.restore(sess, './model')
+    save_path = saver.save(sess, './model_inference')
```
If you run the inference code without error, there will be 4 files in current directory too
```
model_inference.data-00000-of-00001
model_inference.index
model_inference.meta
checkpoint
```
These 4 files are **very important**, it will be converted to **IR** (a graph which is understanable by movidius NCS2 ) by `openVINO` toolkit.

### Compile inference model with model optimizer
Go to the `~/intel/computer_vision_sdk/deployment_tools/model_optimizer` directory

```
python3 mo_tf.py --input_meta_graph <path/to/your/meta/graph> --input_shape <shape_of_input> --output_dir <where/you/want/to/store/the/output> --data_type=FP16
```
For example
```
python3 mo_tf.py --input_meta_graph ~/Desktop/dl/lab2/host/inference/inference.ckpt.meta --input_shape [1,48,48,1] --output_dir ~/Desktop/dl/lab2/movidius/model/ --data_type=FP16
```
Note that `--data_type=FP16` is needed if you are going to do inference on NCS2, 
use `--data_type=FP32` instead if you are going to do infernece with your CPU.
If you run successfully, you might see the output similar with
```
Model Optimizer arguments:
Common parameters:
	- Path to the Input Model: 	None
	- Path for generated IR: 	/home/hwy/Desktop/
	- IR output name: 	model_inference.ckpt
	- Log level: 	ERROR
	- Batch: 	Not specified, inherited from the model
	- Input layers: 	Not specified, inherited from the model
	- Output layers: 	Not specified, inherited from the model
	- Input shapes: 	[1,28,28,3]
	- Mean values: 	Not specified
	- Scale values: 	Not specified
	- Scale factor: 	Not specified
	- Precision of IR: 	FP16
	- Enable fusing: 	True
	- Enable grouped convolutions fusing: 	True
	- Move mean values to preprocess section: 	False
	- Reverse input channels: 	False
TensorFlow specific parameters:
	- Input model in text protobuf format: 	False
	- Offload unsupported operations: 	False
	- Path to model dump for TensorBoard: 	None
	- List of shared libraries with TensorFlow custom layers implementation: 	None
	- Update the configuration file with input/output node names: 	None
	- Use configuration file used to generate the model with Object Detection API: 	None
	- Operations to offload: 	None
	- Patterns to offload: 	None
	- Use the config file: 	None
Model Optimizer version: 	1.4.292.6ef7232d

[ SUCCESS ] Generated IR model.
[ SUCCESS ] XML file: /home/hwy/Desktop/model_inference.ckpt.xml
[ SUCCESS ] BIN file: /home/hwy/Desktop/model_inference.ckpt.bin
[ SUCCESS ] Total execution time: 1.36 seconds.
```

### Inference with intel neural compute stick
```
python classification.py --model ./inference.ckpt.xml --input images/ --device MYRIAD --labels mapping
```
## Some Error
`locale.Error: unsupported locale setting`
[](https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting)