---
# System prepended metadata

title: OpenVINO guide
tags: [Intel-Movidius]

---

# OpenVINO guide

###### tags: `Intel-Movidius`

## Install Environment and device
*    Install OpenVINO on linux
[link](https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html)
*    Install Movidious on linux
[link](https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux_ivad_vpu.html)

## Setup environment variable

```
source /opt/intel/openvino/bin/setupvars.sh
```

## API reference

[api link](https://docs.openvinotoolkit.org/latest/annotated.html)

## How to use
1. Download Model
    ```
    cd /opt/intel/openvino/deployment_tools/tools/model_downloader
    sudo python3 downloader.py --name mobilenet-v1-1.0-224
    ```
    Other avaliable models, [see here](https://github.com/opencv/open_model_zoo/tree/master/models/public)
    Other available pretrained models, [see here](https://github.com/opencv/open_model_zoo/tree/master/models/intel)

2. Optimize
    [Official guide](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_prepare_model_convert_model_Converting_Model.html)
    ```
    cd /opt/intel/openvino/deployment_tools/tools/model_downloader/
    sudo -E python3 converter.py --name mobilenet-v1-1.0-224
    ```
    Sudo runs with different environment. To keep current environment use -E flag. Without doing this, env variable ```$INTEL_OPENVINO_DIR``` cannot be reconized.

3. Deploy

    ```SHELL=1
    import cv2
    import numpy as np
    from openvino.inference_engine import IENetwork, IECore
    path = "/opt/intel/openvino_2020.2.120/deployment_tools/open_model_zoo/tools/downloader/public/mobilenet-v1-1.0-224/FP16/"
    ie = IECore()                                                   # Load CPU extenstion
    net = ie.read_network(model=path+'mobilenet-v1-1.0-224.xml', 
                        weights=path+'mobilenet-v1-1.0-224.bin')    # Read IR model
    input_blob = next(iter(net.inputs))                             # Get input name
    out_blob = next(iter(net.outputs))                              # Get output name
    batch,channel,height,width = net.inputs[input_blob].shape       # Get input shape
    image = cv2.imread('car.jpg')
    cv2.imshow("input", image)                                      # Read image and manipulate
    image = cv2.resize(image, (width, height))
    image = image.transpose((2, 0, 1))                              # Change data layout from HWC to CHW

    exec_net = ie.load_network(network=net, device_name='GPU')      # Load IR model to device

    """Infer!!!"""
    res = exec_net.infer(inputs={input_blob: image})
    idx = np.argsort(np.squeeze(res[out_blob][0]))[::-1]
    for i in range(5):
        # Display result
        print(idx[i]+1, res[out_blob][0][idx[i]])
        cv2.waitKey(3*1000)
    ```
    #### How to choose device?

    Change device names to *CPU*, *GPU* or *MYRIAD*
    ```SHELL=16
    exec_net = ie.load_network(network=net, device_name='GPU') 
    ```

## FAQ

1. **"RuntimeError: Can not init Myriad device: NC_ERROR"?**
    sol: Maybe you should run in sudo mode, else please refer to question 4.

2. **Regarding to (1), why I get "ModuleNotFoundError: No module named 'CV2'" after running in sudo mode?**
    sol: This is because OpenVINO has its own optimized OpenCV and the path is set when running ```setupvars.sh```. However, the path will be reset when you are running in sudo mode.
    
3. **Regarding to (1) and (2), so sudo or not sudo?**
    sol: sudo
    Below is a simple workaround if you don't want to permanently disable path reset.
    ```SHELL=1
    sudo -E su
    source /opt/intel/openvino/bin/setupvars.sh
    ...run your program
    ```
4. **"RuntimeError: Can not init Myriad device: NC_ERROR" when inference on multiple model with single Myriad?**
    sol: Check if you are using only one IECore instance. If not, please load the networks with identical IECore instance.
5. 
