Intel at the Edge (Installing Intel's OpenVINO on MacBook w/ 4th Generation Intel Core i7)

Written on December 27, 2019
[ edge  ai  easi  ]

When first considering installing Intel’s OpenVINO on my MacBook in my last post, I quickly determined that I did not meet the minimum specs required for running Intel’s OpenVINO… Or so I thought.

You see, on their website, Intel says you will need one of the following processors:

  • 6th-10th Generation Intel® Core™
  • Intel® Xeon® v5 family
  • Intel® Xeon® v6 family

But my MBP Mid-2015 only has a 4th Generation Core i7 (2.8 GHz). “Sad face!” I exclaimed. “Now I will have to order the Neural Compute Stick 2.”

Now, I don’t regret ordering the NCS2 because I do plan on playing with it, and possibly even buying a Rasberry Pi to play on as well. That said, after I ordered the NCS2, the thought occurred to me: “Why don’t I try downloading and running everything anyway… Just to see what happens.”

So I did, and I found out that – even with a shabby ol’ 4th Gen processor – you can play around with Intel’s OpenVINO. I’m sure it’s not as fast or efficient of an experience that Intel wants you to have, but it works.

Here are some notes on getting it up and running.

Download & Install

First, you will download latest installation package for MacOS. In this step, you will also have to register your downloaded software and obtain a serial number (though I found that I never had to plug in this serial number anywhere downstream in the installation process).

Begin the installation process in the usual way (i.e., double click on the thing you just downloaded). When the first part of installation is complete, you will receive a message – something like:

The first part of Intel® Distribution of OpenVINO™ toolkit 2019 R3.1 for macOS* has been successfully installed in /opt/intel/openvino_2019.3.376.

You will also get notified that there are additional steps to be taken and get redirected to an Intel webpage with further instructions.

Additional Installation Steps

After the initial installation step, there are a few things left to do:

  • Install External Software Dependencies
  • Set Environment variables
  • Configure Model Optimizer
  • Run the Verification Scripts to Verify Installation and Compile Samples

Environment Variables

To ensure the proper environment variables are set in your current Terminal session:

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

To ensure the proper environment variables are always set, plug that command into your Bash profile. You can also wrap it in a easy-to-remember function so that the command is only run when desired:

function intelopenvino {
  source /opt/intel/openvino/bin/setupvars.sh
}

Model Optimizer (Ensure Prerequisites are Installed)

Now, we must make sure the model optimizer can work with the deep learning frameworks of our choice. First, head into the Model Optimizer section of the OpenVINO directory:

cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites

Here, you can choose to make sure the Model Optimizer can work with all supported frameworks, or just the supported frameworks you are interested in.

To configure the Model Optimizer for all available deep learning frameworks (Caffe, TensorFlow, MXNet, Kaldi*, and ONNX):

sudo ./install_prerequisites.sh

To just configure for one framework, e.g., TensorFlow:

sudo ./install_prerequisites_tf.sh

Troubleshooting Notes

I ran into a few issues.

First, I had to upgrade pip:

pip install --upgrade pip

It is often recommended to use virtual environments for different Python use cases and setups. One way to do this is using Python’s virtualenv package… Another is using conda environments, which I’ve been doing for the past few years… However, I guess I haven’t created any new environments in a while because I received notifications stating my conda software was out of date. But when I went to conda update conda, I received error messages stating that I couldn’t delete pip… Long story short, I googled around, found I had uninstall pip, then reinstall it with conda…and a few other things. After all was said and done, I was able to create a new conda environment.

conda create --name intel
conda activate intel

Finally, when I installed Model Optimizer prerequisites for all supported deep learning frameworks, I got some warning messages at the beginning of the screen output:

WARNING: The directory '/Users/kevinurban/Library/Caches/pip/http' or its parent directory is not owned by the current  user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
WARNING: The directory '/Users/kevinurban/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

And at the end, I received some as well:

All Model Optimizer dependencies are installed globally.
[WARNING] If you want to keep Model Optimizer in separate sandbox run install_prerequisites.sh 
[WARNING] venv {caffe|tf|mxnet|kaldi|onnx}

Test Demos

The site says if you installed as root, make sure to go into root mode first (sudo -i). I thought I installed as root, but this put me into an environment that no longer had the necessary dependences (it took me out of my conda environment. Note that running this without sudo results in errors as well. However, by just using the sudo prefix things worked.

Image Classification w/ SqueezeNet

cd /opt/intel/openvino/deployment_tools/demo
sudo ./demo_squeezenet_download_convert_run.sh

If everything runs smoothly, you should get some probability scores classifying an image of a car:

Top 10 results:

Image /opt/intel/openvino_2019.3.376/deployment_tools/demo/car.png

classid probability label
------- ----------- -----
817     0.6853030   sports car, sport car
479     0.1835197   car wheel
511     0.0917197   convertible
436     0.0200694   beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon
751     0.0069604   racer, race car, racing car
656     0.0044177   minivan
717     0.0024739   pickup, pickup truck
581     0.0017788   grille, radiator grille
468     0.0013083   cab, hack, taxi, taxicab
661     0.0007443   Model T

From Intel’s website:

“The Image Classification verification script downloads a public SqueezeNet Caffe* model and runs the Model Optimizer to convert the model to .bin and .xml Intermediate Representation (IR) files. The Inference Engine requires this model conversion so it can use the IR as input and achieve optimum performance on Intel hardware.

This verification script creates the directory /home//inference_engine_samples/, builds the Image Classification Sample application and runs with the model IR and car.png image located in the demo directory. When the verification script completes, you will have the label and confidence for the top-10 categories."

From the README file in the demo directory:

The demo illustrates the general workflow of using the Intel(R) Deep Learning Deployment Toolkit and performs the following:

  • Downloads a public SqueezeNet model using the Model Downloader (open_model_zoo\tools\downloader\downloader.py)
  • Installs all prerequisites required for running the Model Optimizer using the scripts from the “model_optimizer\install_prerequisites” folder
  • Converts SqueezeNet to an IR using the Model Optimizer (model_optimizer\mo.py) via the Model Converter (open_model_zoo\tools\downloader\converter.py)
  • Builds the Inference Engine classification_sample (inference_engine\samples\classification_sample)
  • Runs the sample with the car.png picture located in the demo folder

If you look at the screen output when running the demo, you can see a command that is used for running the model:

./classification_sample_async -d CPU -i /opt/intel/openvino_2019.3.376/deployment_tools/demo/car.png -m /Users/<userName>/openvino_models/ir/public/squeezenet1.1/FP16/squeezenet1.1.xml

You will find the IR files for these models in:

~/openvino_models/ir/public/

It’s pretty easy to guess at what the various flags do:

  • -d: which device to use
  • -i: where is the input coming from
  • -m: which model to use

Looking at the Bash script itself is very instructive:

#!/usr/bin/env bash

# Copyright (C) 2018-2019 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

. "$ROOT_DIR/utils.sh"

usage() {
    echo "Classification demo using public SqueezeNet topology"
    echo "-d name     specify the target device to infer on; CPU, GPU, FPGA, HDDL or MYRIAD are acceptable. Sample will look for a suitable plugin for device specified"
    echo "-help            print help message"
    exit 1
}

trap 'error ${LINENO}' ERR

target="CPU"

# parse command line options
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -h | -help | --help)
    usage
    ;;
    -d)
    target="$2"
    echo target = "${target}"
    shift
    ;;
    -sample-options)
    sampleoptions="$2 $3 $4 $5 $6"
    echo sample-options = "${sampleoptions}"
    shift
    ;;
    *)
    # unknown option
    ;;
esac
shift
done

target_precision="FP16"

printf "target_precision = ${target_precision}\n"

models_path="$HOME/openvino_models/models"
models_cache="$HOME/openvino_models/cache"
irs_path="$HOME/openvino_models/ir"

model_name="squeezenet1.1"

target_image_path="$ROOT_DIR/car.png"

run_again="Then run the script again\n\n"
dashes="\n\n###################################################\n\n"


if [ -e "$ROOT_DIR/../../bin/setupvars.sh" ]; then
    setupvars_path="$ROOT_DIR/../../bin/setupvars.sh"
else
    printf "Error: setupvars.sh is not found\n"
fi

if ! . $setupvars_path ; then
    printf "Unable to run ./setupvars.sh. Please check its presence. ${run_again}"
    exit 1
fi

# Step 1. Download the Caffe model and the prototxt of the model
printf "${dashes}"
printf "\n\nDownloading the Caffe model and the prototxt"

cur_path=$PWD

printf "\nInstalling dependencies\n"

if [[ -f /etc/centos-release ]]; then
    DISTRO="centos"
elif [[ -f /etc/lsb-release ]]; then
    DISTRO="ubuntu"
fi

if [[ $DISTRO == "centos" ]]; then
    sudo -E yum install -y centos-release-scl epel-release
    sudo -E yum install -y gcc gcc-c++ make glibc-static glibc-devel libstdc++-static libstdc++-devel libstdc++ libgcc \
                           glibc-static.i686 glibc-devel.i686 libstdc++-static.i686 libstdc++.i686 libgcc.i686 cmake

    sudo -E rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm || true
    sudo -E yum install -y epel-release
    sudo -E yum install -y cmake ffmpeg gstreamer1 gstreamer1-plugins-base libusbx-devel

    # check installed Python version
    if command -v python3.5 >/dev/null 2>&1; then
        python_binary=python3.5
        pip_binary=pip3.5
    fi
    if command -v python3.6 >/dev/null 2>&1; then
        python_binary=python3.6
        pip_binary=pip3.6
    fi
    if [ -z "$python_binary" ]; then
        sudo -E yum install -y rh-python36 || true
        . scl_source enable rh-python36
        python_binary=python3.6
        pip_binary=pip3.6
    fi
elif [[ $DISTRO == "ubuntu" ]]; then
    sudo -E apt update
    print_and_run sudo -E apt -y install build-essential python3-pip virtualenv cmake libcairo2-dev libpango1.0-dev libglib2.0-dev libgtk2.0-dev libswscale-dev libavcodec-dev libavformat-dev libgstreamer1.0-0 gstreamer1.0-plugins-base
    python_binary=python3
    pip_binary=pip3

    system_ver=`cat /etc/lsb-release | grep -i "DISTRIB_RELEASE" | cut -d "=" -f2`
    if [ $system_ver = "18.04" ]; then
        sudo -E apt-get install -y libpng-dev
    else
        sudo -E apt-get install -y libpng12-dev
    fi
elif [[ "$OSTYPE" == "darwin"* ]]; then
    # check installed Python version
    if command -v python3.7 >/dev/null 2>&1; then
        python_binary=python3.7
        pip_binary=pip3.7
    elif command -v python3.6 >/dev/null 2>&1; then
        python_binary=python3.6
        pip_binary=pip3.6
    elif command -v python3.5 >/dev/null 2>&1; then
        python_binary=python3.5
        pip_binary=pip3.5
    else
        python_binary=python3
        pip_binary=pip3
    fi
fi

if ! command -v $python_binary &>/dev/null; then
    printf "\n\nPython 3.5 (x64) or higher is not installed. It is required to run Model Optimizer, please install it. ${run_again}"
    exit 1
fi

if [[ "$OSTYPE" == "darwin"* ]]; then
    $pip_binary install -r $ROOT_DIR/../open_model_zoo/tools/downloader/requirements.in
else
    sudo -E $pip_binary install -r $ROOT_DIR/../open_model_zoo/tools/downloader/requirements.in
fi

downloader_dir="${INTEL_OPENVINO_DIR}/deployment_tools/open_model_zoo/tools/downloader"

model_dir=$("$python_binary" "$downloader_dir/info_dumper.py" --name "$model_name" |
    "$python_binary" -c 'import sys, json; print(json.load(sys.stdin)[0]["subdirectory"])')

downloader_path="$downloader_dir/downloader.py"

print_and_run "$python_binary" "$downloader_path" --name "$model_name" --output_dir "${models_path}" --cache_dir "${models_cache}"

ir_dir="${irs_path}/${model_dir}/${target_precision}"

if [ ! -e "$ir_dir" ]; then
    # Step 2. Configure Model Optimizer
    printf "${dashes}"
    printf "Install Model Optimizer dependencies\n\n"
    cd "${INTEL_OPENVINO_DIR}/deployment_tools/model_optimizer/install_prerequisites"
    . ./install_prerequisites.sh caffe
    cd $cur_path

    # Step 3. Convert a model with Model Optimizer
    printf "${dashes}"
    printf "Convert a model with Model Optimizer\n\n"

    mo_path="${INTEL_OPENVINO_DIR}/deployment_tools/model_optimizer/mo.py"

    export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
    print_and_run "$python_binary" "$downloader_dir/converter.py" --mo "$mo_path" --name "$model_name" -d "$models_path" -o "$irs_path" --precisions "$target_precision"
else
    printf "\n\nTarget folder ${ir_dir} already exists. Skipping IR generation  with Model Optimizer."
    printf "If you want to convert a model again, remove the entire ${ir_dir} folder. ${run_again}"
fi

# Step 4. Build samples
printf "${dashes}"
printf "Build Inference Engine samples\n\n"

OS_PATH=$(uname -m)
NUM_THREADS="-j2"

if [ $OS_PATH == "x86_64" ]; then
  OS_PATH="intel64"
  NUM_THREADS="-j8"
fi

samples_path="${INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/samples"
build_dir="$HOME/inference_engine_samples_build"
binaries_dir="${build_dir}/${OS_PATH}/Release"

if [ -e $build_dir/CMakeCache.txt ]; then
	rm -rf $build_dir/CMakeCache.txt
fi
mkdir -p $build_dir
cd $build_dir
cmake -DCMAKE_BUILD_TYPE=Release $samples_path

make $NUM_THREADS classification_sample_async

# Step 5. Run samples
printf "${dashes}"
printf "Run Inference Engine classification sample\n\n"

cd $binaries_dir

cp -f $ROOT_DIR/${model_name}.labels ${ir_dir}/

print_and_run ./classification_sample_async -d "$target" -i "$target_image_path" -m "${ir_dir}/${model_name}.xml" ${sampleoptions}

printf "${dashes}"

printf "Demo completed successfully.\n\n"

Messing Around

By importing the car.png file into Python, I found the image is 787x259.

from PIL import Image
Image.open('car.png')
  <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=787x259 at 0x1186926A0>

I then randomly downloaded some car images from Google Images, with varying size and file type (i.e., I used jpg files as well as png). For example:

Image.open('car2.jpg')
  <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=600x360 at 0x10C4C6CC0>

Without altering the files at all, the SqueezeNet demo was able to work. However, I suspect to do so, it is cropping images in some default way. I say this b/c the results weren’t always great, e.g., for a very obvious picture of a gray car front-and-center, here are the following probabilities:

Image /opt/intel/openvino_2019.3.376/deployment_tools/demo/car2.jpg

classid probability label
------- ----------- -----
581     0.3110719   grille, radiator grille
817     0.2064950   sports car, sport car
479     0.1889743   car wheel
717     0.0811309   pickup, pickup truck
751     0.0761435   racer, race car, racing car
511     0.0455605   convertible
436     0.0277504   beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon
656     0.0193125   minivan
609     0.0133630   jeep, landrover
864     0.0076768   tow truck, tow car, wrecker

Still pretty good though!

For other cars, it was great, e.g., for a 480x240 JPG of an orange, sporty car:

classid probability label
------- ----------- -----
817     0.9660867   sports car, sport car
511     0.0110451   convertible
751     0.0084816   racer, race car, racing car
479     0.0076236   car wheel
581     0.0024839   grille, radiator grille
436     0.0016106   beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon
518     0.0012010   crash helmet
656     0.0010051   minivan
468     0.0002406   cab, hack, taxi, taxicab
779     0.0000357   school bus

For a 318x159 JPG of a gray cat whose face was in focus front-and-center, but whose body was blurred out of focus:

Image /opt/intel/openvino_2019.3.376/deployment_tools/demo/cat.jpg

classid probability label
------- ----------- -----
281     0.3908087   tabby, tabby cat
285     0.3239622   Egyptian cat
282     0.2236193   tiger cat
287     0.0523816   lynx, catamount
286     0.0035395   cougar, puma, catamount, mountain lion, painter, panther, Felis concolor
728     0.0030023   plastic bag
280     0.0007048   grey fox, gray fox, Urocyon cinereoargenteus
289     0.0005830   snow leopard, ounce, Panthera uncia
278     0.0003320   kit fox, Vulpes macrotis
761     0.0002517   remote control, remote

So, overall – very cool! :-)

The Inference Pipeline Verification Script

cd /opt/intel/openvino/deployment_tools/demo/
sudo ./demo_security_barrier_camera.sh

Looking over the screen output from running this file is instructive. For example, you will see that Intel’s Model Downloader was used multiple times to download a few models:

  • license-plate-recognition-barrier-0001
  • vehicle-attributes-recognition-barrier-0039
  • vehicle-license-plate-detection-barrier-0106

These are downloaded using commands like the following:

python3.7 /opt/intel//openvino_2019.3.376/deployment_tools/open_model_zoo/tools/downloader/downloader.py --name vehicle-license-plate-detection-barrier-0106 --output_dir /Users/kevinurban/openvino_models/ir --cache_dir /Users/kevinurban/openvino_models/cache

You will find the IR files for these models in:

~/openvino_models/ir/intel/

You’ll also get a note where the build files are located:

Build files have been written to: /Users/<userName>/inference_engine_demos_build

How are these models used? From the website:

“First, an object is identified as a vehicle. This identification is used as input to the next model, which identifies specific vehicle attributes, including the license plate. Finally, the attributes identified as the license plate are used as input to the third model, which recognizes specific characters in the license plate.”

From the README:

The demo illustrates using the Inference Engine with pre-trained models to perform vehicle detection, vehicle 
attributes and license-plate recognition tasks. 

As the sample produces visual output, it should be run in GUI mode.  

The demo script does the following:

- Builds the Inference Engine security barrier camera sample (inference_engine\samples\security_barrier_camera_sample)
- Runs the sample with the car_1.bmp located in the demo folder

The sample application displays the resulting frame with detections rendered as bounding boxes and text.

In the screen output when running this demo, you can see how to string together a few models:

./security_barrier_camera_demo -d CPU -d_va CPU -d_lpr CPU \
	-i /opt/intel/openvino_2019.3.376/deployment_tools/demo/car_1.bmp \
	-m /Users/<userName>/openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml \
	-m_lpr /Users/<userName>/openvino_models/ir/intel/license-plate-recognition-barrier-0001/FP16/license-plate-recognition-barrier-0001.xml \
	-m_va /Users/<userName>/openvino_models/ir/intel/vehicle-attributes-recognition-barrier-0039/FP16/vehicle-attributes-recognition-barrier-0039.xml

And, of course, looking over the bash script itself is super helpful in learning how to issue commands yourself.

#!/usr/bin/env bash

# Copyright (C) 2018-2019 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

. "$ROOT_DIR/utils.sh"

usage() {
    echo "Security barrier camera demo that showcases three models coming with the product"
    echo "-d name     specify the target device to infer on; CPU, GPU, FPGA, HDDL or MYRIAD are acceptable. Sample will look for a suitable plugin for device specified"
    echo "-help            print help message"
    exit 1
}

trap 'error ${LINENO}' ERR

target="CPU"

# parse command line options
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -h | -help | --help)
    usage
    ;;
    -d)
    target="$2"
    echo target = "${target}"
    shift
    ;;
    -sample-options)
    sampleoptions="$2 $3 $4 $5 $6"
    echo sample-options = "${sampleoptions}"
    shift
    ;;
    *)
    # unknown option
    ;;
esac
shift
done


target_image_path="$ROOT_DIR/car_1.bmp"

run_again="Then run the script again\n\n"
dashes="\n\n###################################################\n\n"

if [[ -f /etc/centos-release ]]; then
    DISTRO="centos"
elif [[ -f /etc/lsb-release ]]; then
    DISTRO="ubuntu"
elif [[ "$OSTYPE" == "darwin"* ]]; then
    DISTRO="macos"
fi

if [[ $DISTRO == "centos" ]]; then
    sudo -E yum install -y centos-release-scl epel-release
    sudo -E yum install -y gcc gcc-c++ make glibc-static glibc-devel libstdc++-static libstdc++-devel libstdc++ libgcc \
                           glibc-static.i686 glibc-devel.i686 libstdc++-static.i686 libstdc++.i686 libgcc.i686 cmake

    sudo -E rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm || true
    sudo -E yum install -y epel-release
    sudo -E yum install -y cmake ffmpeg gstreamer1 gstreamer1-plugins-base libusbx-devel

    # check installed Python version
    if command -v python3.5 >/dev/null 2>&1; then
        python_binary=python3.5
        pip_binary=pip3.5
    fi
    if command -v python3.6 >/dev/null 2>&1; then
        python_binary=python3.6
        pip_binary=pip3.6
    fi
    if [ -z "$python_binary" ]; then
        sudo -E yum install -y rh-python36 || true
        . scl_source enable rh-python36
        python_binary=python3.6
        pip_binary=pip3.6
    fi
elif [[ $DISTRO == "ubuntu" ]]; then
    sudo -E apt update
    print_and_run sudo -E apt -y install build-essential python3-pip virtualenv cmake libcairo2-dev libpango1.0-dev libglib2.0-dev libgtk2.0-dev libswscale-dev libavcodec-dev libavformat-dev libgstreamer1.0-0 gstreamer1.0-plugins-base
    python_binary=python3
    pip_binary=pip3

    system_ver=`cat /etc/lsb-release | grep -i "DISTRIB_RELEASE" | cut -d "=" -f2`
    if [ $system_ver = "18.04" ]; then
        sudo -E apt-get install -y libpng-dev
    else
        sudo -E apt-get install -y libpng12-dev
    fi
elif [[ "$OSTYPE" == "darwin"* ]]; then
    # check installed Python version
    if command -v python3.7 >/dev/null 2>&1; then
        python_binary=python3.7
        pip_binary=pip3.7
    elif command -v python3.6 >/dev/null 2>&1; then
        python_binary=python3.6
        pip_binary=pip3.6
    elif command -v python3.5 >/dev/null 2>&1; then
        python_binary=python3.5
        pip_binary=pip3.5
    else
        python_binary=python3
        pip_binary=pip3
    fi
fi

if ! command -v $python_binary &>/dev/null; then
    printf "\n\nPython 3.5 (x64) or higher is not installed. It is required to run Model Optimizer, please install it. ${run_again}"
    exit 1
fi

if [[ $DISTRO == "macos" ]]; then
    $pip_binary install -r $ROOT_DIR/../open_model_zoo/tools/downloader/requirements.in
else
    sudo -E $pip_binary install -r $ROOT_DIR/../open_model_zoo/tools/downloader/requirements.in
fi

if [ -e "$ROOT_DIR/../../bin/setupvars.sh" ]; then
    setupvars_path="$ROOT_DIR/../../bin/setupvars.sh"
else
    printf "Error: setupvars.sh is not found\n"
fi
if ! . $setupvars_path ; then
    printf "Unable to run ./setupvars.sh. Please check its presence. ${run_again}"
    exit 1
fi

# Step 1. Downloading Intel models
printf "${dashes}"
printf "Downloading Intel models\n\n"


target_precision="FP16"

printf "target_precision = ${target_precision}\n"

downloader_dir="${INTEL_OPENVINO_DIR}/deployment_tools/open_model_zoo/tools/downloader"

downloader_path="$downloader_dir/downloader.py"
models_path="$HOME/openvino_models/ir"
models_cache="$HOME/openvino_models/cache"

declare -a model_args

while read -r model_opt model_name; do
    model_subdir=$("$python_binary" "$downloader_dir/info_dumper.py" --name "$model_name" |
        "$python_binary" -c 'import sys, json; print(json.load(sys.stdin)[0]["subdirectory"])')

    model_path="$models_path/$model_subdir/$target_precision/$model_name"

    print_and_run "$python_binary" "$downloader_path" --name "$model_name" --output_dir "$models_path" --cache_dir "$models_cache"

    model_args+=("$model_opt" "${model_path}.xml")
done < "$ROOT_DIR/demo_security_barrier_camera.conf"

# Step 2. Build samples
printf "${dashes}"
printf "Build Inference Engine demos\n\n"

demos_path="${INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/demos"

if ! command -v cmake &>/dev/null; then
    printf "\n\nCMAKE is not installed. It is required to build Inference Engine demos. Please install it. ${run_again}"
    exit 1
fi

OS_PATH=$(uname -m)
NUM_THREADS="-j2"

if [ $OS_PATH == "x86_64" ]; then
  OS_PATH="intel64"
  NUM_THREADS="-j8"
fi

build_dir="$HOME/inference_engine_demos_build"
if [ -e $build_dir/CMakeCache.txt ]; then
	rm -rf $build_dir/CMakeCache.txt
fi
mkdir -p $build_dir
cd $build_dir
cmake -DCMAKE_BUILD_TYPE=Release $demos_path
make $NUM_THREADS security_barrier_camera_demo

# Step 3. Run samples
printf "${dashes}"
printf "Run Inference Engine security_barrier_camera demo\n\n"

binaries_dir="${build_dir}/${OS_PATH}/Release"
cd $binaries_dir

print_and_run ./security_barrier_camera_demo -d "$target" -d_va "$target" -d_lpr "$target" -i "$target_image_path" "${model_args[@]}" ${sampleoptions}

printf "${dashes}"
printf "Demo completed successfully.\n\n"

Messing Around

I was able to successfully mess around with the image classification demo, so I figured I’d do the same here.

I downloaded some JPEGs of cars with visible license plates…and the script ran without error, however it did not detect a license plate (so did not read a license plate either).

I even tried converting the JPEGs to BitMap using ImageMagick (convert img.jpg img.bmp), but license plates were still not detected…