本地 OpenVINO 模型转换

在本教程中,您将学习如何将 OpenVINO 中间表示文件(IR)转换为在DepthAI上运行所需的格式,即使是在低功耗的Raspberry Pi上也能使用。 我将向您介绍OpenVINO工具集、Open Model Zoo(我们将在那里下载 face-detection-retail-0004 模型), 并向您展示如何生成在DepthAI上运行模型推理所需的文件。

face

还没听说过 OpenVINO 或者 Open Model Zoo? 我先简单介绍一下为什么我们需要这些工具。

什么是OpenVINO?

在后台,DepthAI 使用英特尔技术来执行高速模型推断。 然而,要获得高性能,不只是把神经网络塞到芯片中这么简单。 这个时候,我们就需要 OpenVINO 了. OpenVINO是一个免费工具包,可将深度学习模型转换为可在Intel硬件上运行的格式。 转换模型后,通常可以看到每秒帧数(FPS)提高25倍或更多。 几个小步骤是否值得将FPS提高25倍? 通常,答案是肯定的!

什么是Open Model Zoo?

Open Model Zoo 是一个免费的预训练模型库。 Zoo还包含用于将这些模型下载为可编译格式以便在DepthAI上运行的脚本。

DepthAI 能够运行 Zoo 中的许多对象检测模型。

安装 OpenVINO

Warning

如果您已经安装过了OpenVINO或者想按照 官方教程 操作, 请跳过这个步骤

请注意,以下安装说明适用于 Ubuntu 18.04 操作系统, 如果您打算使用其他操作系统,请按照官方的OpenVINO安装说明进行安装。

DepthAI 需要 OpenVINO 2020.1 版本来运行。 让我们为操作系统获取一个软件包,并使用以下命令满足该版本:

apt-get update
apt-get install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
apt-get update
apt-get install -y wget pciutils python3.8 libpng-dev libcairo2-dev libpango1.0-dev libglib2.0-dev libgtk2.0-dev libswscale-dev libavcodec-dev libavformat-dev
cd
mkdir openvino_install && cd openvino_install
wget http://registrationcenter-download.intel.com/akdlm/irc_nas/16345/l_openvino_toolkit_p_2020.1.023.tgz
tar --strip-components=1 -zxvf l_openvino_toolkit_p_2020.1.023.tgz
./install_openvino_dependencies.sh
./install.sh # 完成后,您可以继续执行 "rm -r ~/openvino_install"

现在,我们要使用的第一个屏幕是 EULA, 按 Enter, 滚动后输入 accept 即可。

下一个是同意英特尔软件改进计划,这没有关系,所以你可以选择是否同意 (1) 或不同意 (2) 。

接下来,您可能会看到“缺少必要文件”的画面,显示 Intel® Graphics Compute Runtime for OpenCL™ Driver is missing - 你可以继续并忽略这个警告。

最后,我们会看到安装总结–请确认它指出的位置是否正确 - /opt/intel。 如果一切看起来都很好,继续进行 (1). 如果再次出现缺少必要文件的提示,请随意跳过。

让我们验证一下你的主机上是否安装了正确的版本。通过在终端会话中运行以下内容来检查你的版本:

cat /opt/intel/openvino/inference_engine/version.txt

你可能看到类似如下的输出:

Thu Jan 23 19:14:14 MSK 2020
d349c3ba4a2508be72f413fa4dee92cc0e4bc0e1
releases_2020_1_InferenceEngine_37988

确认您在输出中看到 releases_2020_1 。 如果你看到了,继续前进。 如果您使用的是不同版本, 请转到 OpenVINO 网站 并为您的操作系统下载2020.1版本:

face

检查是否安装了模型下载器

在安装 OpenVINO 时,您可以选择执行一个较小的安装以节省磁盘空间。这个自定义安装可能不包括模型下载器脚本。让我们检查下载器是否已经安装。在终端会话中,键入以下内容:

find /opt/intel/ -iname downloader.py

如果看到了如下的输出,请继续:

/opt/intel/openvino_2020.1.023/deployment_tools/open_model_zoo/tools/downloader/downloader.py

没看到任何输出? 如果没有找到 downloader.py 也不要着急。 我们将在下面安装这个。

安装 Open Model Zoo 下载器

如果没有找到下载工具, 我们将通过克隆 Open Model Zoo Repo 来安装工具,并安装工具依赖关系。

启动一个终端会话,并在终端中运行以下命令:

apt-get install -y git curl
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
rm get-pip.py
cd ~
git clone https://github.com/opencv/open_model_zoo.git
cd open_model_zoo
git checkout tags/2020.1
cd tools/downloader
python3 -m pip install --user -r ./requirements.in

这部分操作将把代码库克隆到 ~/open_model_zoo 目录下,拷贝所需的 2020.1 版本,并安装下载程序的dependencies.zh。

创建一个 OPEN_MODEL_DOWNLOADER 环境变量

输入 downloader.py 的完整路径可能会使用大量的按键。为了延长你的键盘寿命,让我们把这个脚本的路径存储在一个环境变量中。

在你的终端中运行以下内容:

export OPEN_MODEL_DOWNLOADER='INSERT PATH TO YOUR downloader.py SCRIPT'

其中 INSERT PATH TO YOUR downloader.py SCRIPT 可以通过以下方式找到:

find /opt/intel/ -iname downloader.py
find ~ -iname downloader.py

例如,如果你自己安装了 open_model_zoo :

export OPEN_MODEL_DOWNLOADER="$HOME/open_model_zoo/tools/downloader/downloader.py"

下载 face-detection-retail-0004 模型

我们已经安装了从 Open Model Zoo 下载模型所需的所有东西!现在我们将使用 模型下载器 来下载 face-detection-retail-0004 模型文件. 在您的终端运行以下内容:

$OPEN_MODEL_DOWNLOADER --name face-detection-retail-0004 --output_dir ~/open_model_zoo_downloads/

这将会把模型文件下载到 ~/open_model_zoo_downloads/ 。 具体来说,我们所需要的模型文件位于:

~/open_model_zoo_downloads/intel/face-detection-retail-0004/FP16

你会在目录中看到两个文件:

$ ls -lh
total 1.3M
-rw-r--r-- 1 root root 1.2M Jul 28 12:40 face-detection-retail-0004.bin
-rw-r--r-- 1 root root 100K Jul 28 12:40 face-detection-retail-0004.xml

该模型采用 OpenVINO 中间表示(IR)格式:

  • face-detection-retail-0004.xml - Describes the network topology

  • face-detection-retail-0004.bin - Contains the weights and biases binary data.

这意味着我们已准备好为 MyriadX 编译模型!

编译模型

我们的 DepthAI 板上使用的 MyriadX 芯片不直接使用 IR 格式文件。 相反,我们需要生成两个文件:

  • face-detection-retail-0004.blob - 我们将用 myriad_compile 命令创建这个文件。

  • face-detection-retail-0004.json - JSON格式的 blob_file_config 文件。 它描述了输出 tensors 的格式。你可以在 这里 阅读更多关于这个文件结构和例子。

我们将从创建 blob 文件开始。

定位 myriad_compile

让我们来寻找 myriad_compile 的位置。在你的终端,运行:

find /opt/intel/ -iname myriad_compile

您应该看到类似于以下的输出:

find /opt/intel/ -iname myriad_compile
/opt/intel/openvino_2020.1.023/deployment_tools/inference_engine/lib/intel64/myriad_compile

由于路径很长, 让我们把 myriad_compile 可执行文件存储在一个环境变量中 (就像 OPEN_MODEL_DOWNLOADER)一样:

export MYRIAD_COMPILE=$(find /opt/intel/ -iname myriad_compile)

激活 OpenVINO 环境

为了使用 myriad_compile 工具, 我们需要激活我们的OpenVINO环境。

首先,让我们找到 setupvars.sh 文件。

find /opt/intel/ -name "setupvars.sh"
/opt/intel/openvino_2020.1.023/opencv/setupvars.sh
/opt/intel/openvino_2020.1.023/bin/setupvars.sh

我们对 bin/setupvars.sh 文件感兴趣, 所以让我们继续用它来激活环境:

source /opt/intel/openvino_2020.1.023/bin/setupvars.sh
[setupvars.sh] OpenVINO environment initialized

如果你看到 [setupvars.sh] OpenVINO environment initialized 那么你的环境应该是正确初始化的。

运行 myriad_compile

$MYRIAD_COMPILE -m ~/open_model_zoo_downloads/intel/face-detection-retail-0004/FP16/face-detection-retail-0004.xml -ip U8 -VPU_MYRIAD_PLATFORM VPU_MYRIAD_2480 -VPU_NUMBER_OF_SHAVES 4 -VPU_NUMBER_OF_CMX_SLICES 4

你将看到:

Inference Engine:
  API version ............ 2.1
  Build .................. 37988
  Description ....... API
Done

Blob 文件在哪里?它和 face-detection-retail-0004.xml 在同一文件夹里:

ls -lh ~/open_model_zoo_downloads/intel/face-detection-retail-0004/FP16/
total 2.6M
-rw-r--r-- 1 root root 1.2M Jul 28 12:40 face-detection-retail-0004.bin
-rw-r--r-- 1 root root 1.3M Jul 28 12:50 face-detection-retail-0004.blob
-rw-r--r-- 1 root root 100K Jul 28 12:40 face-detection-retail-0004.xml

创建 blob 配置文件

MyriadX 需要一个 blob 文件 (我们刚刚创建了一个) 和一个JSON格式的 blob_file_config 。 我们将手动创建此配置文件。 在您的终端中请输入:

cd ~/open_model_zoo_downloads/intel/face-detection-retail-0004/FP16/
touch face-detection-retail-0004.json

把下面的代码复制粘贴到 face-detection-retail-0004.json :

{
    "NN_config": {
        "output_format" : "detection",
        "NN_family" : "mobilenet",
        "confidence_threshold" : 0.5
    }
}

这些值是什么意思?

  • output_format - 是 detection 还是 raw. Detection 告诉 DepthAI 对 NN 进行解析并根据它们创建一个检测对象, 您可以通过运行 getDetectedObjects 方法来访问该对象。 Raw 表示 “不解析, 我将在主机上处理解析”, 要求你解析原始张量。

  • NN_family - 仅在检测到 output_formatdetection 时才需要。 目前支持两个NN系列 mobilenetYOLO

  • confidence_threshold - DepthAI将仅返回置信度高于阈值的结果。

运行并显示模型输出

有了 blob 和 a json blob配置文件, 我们就可以开始了! 为了验证模型是否正确运行,让我们稍微修改一下我们在 Hello World 中创建的程序。

具体的说,让我们修改 create_pipeline 调用来加载我们的模型 记得将路径替换为你所拥有的正确路径!

pipeline = device.create_pipeline(config={
    'streams': ['previewout', 'metaout'],
    'ai': {
-        'blob_file': "/path/to/mobilenet-ssd.blob",
+        'blob_file': "/path/to/open_model_zoo_downloads/intel/face-detection-retail-0004/FP16/face-detection-retail-0004.blob",
-        'blob_file_config': "/path/to/mobilenet-ssd.json"
+        'blob_file_config': "/path/to/open_model_zoo_downloads/intel/face-detection-retail-0004/FP16/face-detection-retail-0004.json"
    }
})

以上就是全部了。

你应该能看到一个带注释的输出,跟下面这个类似:

face

审查流程

我们走过的流程适用于 Open Model Zoo 的其他预训练对象检测模型:

  1. 下载模型:

    $OPEN_MODEL_DOWNLOADER --name [INSERT MODEL NAME] --output_dir ~/open_model_zoo_downloads/
    
  2. 创建 MyriadX blob 文件:

    $MYRIAD_COMPILE -m [INSERT PATH TO MODEL XML FILE] -ip U8 -VPU_MYRIAD_PLATFORM VPU_MYRIAD_2480 -VPU_NUMBER_OF_SHAVES 4 -VPU_NUMBER_OF_CMX_SLICES 4
    
  3. 根据模型的输出 创建 blob 配置文件

  4. 在你的脚本中使用这个模型。

你已经上手了! 你可以在 GitHub 上找到这个教程的 完整代码

有疑问?

我们很乐意为您提供代码或其他问题的帮助。

我们的联系方式

OAK QQ群
QQ

OAK视觉人工智能俱乐部

群号:280844897

加微信邀请入群
WeChat

微信号:13951940532

关注微信公众号:OAK视觉人工智能开发
欢迎到淘宝选购
taobao
OAK中国官方淘宝店

还可以通过我们发布的视频和文章了解OAK