使用推理和单次拍摄多框检测器 (SSD) 进行对象识别
本教程将引导您了解深度学习部署工具包的推理引擎 (包含在 Intel® 计算机视觉 SDK 中) 的基础知识。
本教程将引导您了解深度学习部署工具包的推理引擎 (包含在 Intel® 计算机视觉 SDK 中) 的基础知识。在此,推理是指使用训练过的神经网络从数据 (例如图像) 中推断含义的过程。在接下来的代码示例中,视频 (逐帧) 被馈送给推理引擎 (我们的训练过的神经网络),然后输出结果 (图像分类)。推理可以使用各种神经网络架构 (AlexNet*、GoogleNet* 等) 进行。本示例在 GoogleNet 模型上使用了单次ショット多盒检测器 (SSD)。有关 SSD 用法示例,请参阅 Intel® 开发者区上的这篇文章。
推理引擎要求将模型转换为 IR (中间表示) 文件。本教程将引导您了解如何使用模型优化器将现有模型 (GoogleNet) 转换为 IR (中间表示) 文件。
那么,在推理引擎上运行神经网络与在现成框架上运行有什么区别?
- 推理引擎优化了推理,使用户能够在 Intel® 架构上运行深度学习部署,速度**显着加快**。有关在 Intel® 处理器图形上的性能的更多信息,请参阅这篇文章。
- 推理可以在 CPU 以外的硬件上运行,例如内置的 Intel® GPU 或 Intel® FPGA 加速卡。
您将学到
- 如何安装 OpenCL™ 运行时包
- 如何安装 Intel® 计算机视觉 SDK
- 如何从 Caffe 模型生成推理引擎所需的 .bin 和 .xml (IR 文件)
- 在 C++ 应用程序中使用生成的 IR 文件运行推理引擎
- 比较 CPU 与 GPU 的性能
收集您的材料
- 第 5 代或更高代 Intel® Core™ 处理器。您可以在 Linux* 中通过运行 'lscpu' 命令查找产品名称。'Model name:' 包含有关处理器的信息。
注意:代数嵌入在产品名称中,紧跟在 'i3'、'i5' 或 'i7' 之后。例如,Intel® Core™ i5-5200U 处理器和 Intel® Core™ i5-5675R 处理器都属于第 5 代,而 Intel® Core™ i5-6600K 处理器和 Intel® Core™ i5 6360U 处理器都属于第 6 代。
- Ubuntu* 16.04.3 LTS
- 为了在集成 GPU 上运行推理
- 具有 Intel® Iris® Pro 图形或 HD 图形的处理器
- 未安装独立显卡 (OpenCL™ 平台需要)。如果您有独立显卡,请确保在进行此安装过程之前在 BIOS 中禁用它。
- 未安装其他 GPU 的驱动程序,或未构建支持其他 GPU 的库
安装
安装 OpenCL™ 运行时包和其他依赖项
为了在 GPU 上运行推理,您需要先安装 OpenCL™ 运行时包。这些命令将安装 OpenCL™ 运行时包以及 Intel® CV SDK 所需的一些包依赖项。
注意: 这些步骤适用于 Ubuntu 16.04.3 或更高版本。如果您使用的版本早于 16.04.3,则仍需要安装下面的包依赖项,然后跳到“安装 Intel® CV SDK”部分,获取安装 OpenCL™ 驱动程序的说明。
Intel® CV SDK 包依赖项
sudo apt-get update sudo apt-get install build-essential ffmpeg cmake checkinstall pkg-config yasm libjpeg-dev curl imagemagick gedit mplayer unzip libpng12-dev libcairo2-dev libpango1.0-dev libgtk2.0-dev libgstreamer0.10-dev libswscale.dev libavcodec-dev libavformat-dev
OpenCL™ 运行时包
wget http://registrationcenter-download.intel.com/akdlm/irc_nas/11396/SRB5.0_linux64.zip unzip SRB5.0_linux64.zip -d SRB5.0_linux64 cd SRB5.0_linux64
sudo apt-get install xz-utils mkdir intel-opencl tar -C intel-opencl -Jxf intel-opencl-r5.0-63503.x86_64.tar.xz tar -C intel-opencl -Jxf intel-opencl-devel-r5.0-63503.x86_64.tar.xz tar -C intel-opencl -Jxf intel-opencl-cpu-r5.0-63503.x86_64.tar.xz sudo cp -R intel-opencl/* / sudo ldconfig
安装 Intel® CV SDK
- 访问 https://software.seek.intel.com/computer-vision-software
- 注册,然后等待确认电子邮件。收到电子邮件可能需要**数小时**。所以去休息一下,等收到电子邮件后再回来。
如果您以前注册过 Intel® CV SDK,您应该几乎立即就能获得下载权限。
tar zxvf intel_cv_sdk_ubuntu_r3_2017.1.163.tgz
注意: 如果您运行的版本早于 Ubuntu 16.04.3,则要安装 OpenCL™ 驱动程序,您需要在运行 Intel® CV SDK 安装**之前**,在下载的文件夹中运行 _install_OCL_driver.sh 脚本。此脚本可能需要一个多小时才能完成。它将使用更新的驱动程序重新构建内核。您的计算机将通过该过程重启。请务必在运行此脚本之前备份您的数据。如果您不想继续进行此内核重建,我们建议您安装 Ubuntu 16.04.3 或更高版本,该版本只需要安装几个文件 (上述说明),并且不需要内核重建。
- 在 cv sdk 文件夹中
cd intel_cv_sdk_ubuntu_r3_2017.1.163/
进入超级用户模式
sudo su
然后运行安装向导
./install_GUI.sh
并按照说明进行操作。
获取代码
克隆此仓库
注意: 克隆此仓库之前,请务必退出超级用户模式。
git clone https://github.com/intel-iot-devkit/computer-vision-inference-tutorials.git
安装 Caffe
Model Optimizer 需要 Caffe 来转换 Caffe 模型。此脚本将安装一个与 Model Optimizer 兼容的 Caffe 版本到 _opt/intel/ssdcaffe_ 文件夹。
从 _computer-vision-inference-tutorials/1-run-model-optimizer_ 目录
cd computer-vision-inference-tutorials/1-run-model-optimizer
在终端中输入
sudo su source /opt/intel/computer_vision_sdk_2017.1.163/bin/setupvars.sh python installSSDCaffe.py exit
这大约需要 **10 到 20 分钟**,具体取决于您的系统。
为推理引擎生成 .bin 和 .xml (IR 文件)
Caffe 模型包含两个文件:_SSD_GoogleNetV2_Deploy.prototxt_ 和 _SSD_GoogleNetV2_Deploy.caffemodel_。您将通过运行 Model Optimizer 和 runMO.py 脚本将它们转换为 IR 文件。
首先下载文件
wget https://software.intel.com/file/609199/download -O SSD_GoogleNetV2_caffe.tgz && mkdir SSD_GoogleNetV2_caffe && tar -xvzf SSD_GoogleNetV2_caffe.tgz -C SSD_GoogleNetV2_caffe
重新进入超级用户模式并运行
sudo su source /opt/intel/computer_vision_sdk_2017.1.163/bin/setupvars.sh python runMO.py -w SSD_GoogleNetV2_caffe/SSD_GoogleNetV2.caffemodel -d SSD_GoogleNetV2_caffe/SSD_GoogleNetV2_Deploy.prototxt
验证 IR 文件的创建
查看 _/artifacts/VGG_VOC0712_SSD_300x300_deploy_ 文件夹。
cd artifacts/VGG_VOC0712_SSD_300x300_deploy ls
检查 _VGG_VOC0712_SSD_300x300_deploy.xml_ 和 _VGG_VOC0712_SSD_300x300_deploy.bin_ 是否在该目录中创建。
请务必在继续操作之前退出超级用户模式 exit
在 C++ 应用程序中使用 IR 文件运行推理引擎
请务必在构建应用程序之前退出超级用户模式 exit
首先设置路径
source /opt/intel/computer_vision_sdk_2017.1.163/bin/setupvars.sh
然后构建
make
注意: 如果遇到与“未定义引用‘google::FlagRegisterer…’”相关的错误,请尝试卸载 libgflags-dev:sudo apt-get remove libgflags-dev
在运行之前,将测试视频文件下载到一个新的 videos
目录中。
wget https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi -P videos/
运行
./IEobjectdetection -i videos/vtest.avi -fr 200 -m artifacts/VGG_VOC0712_SSD_300x300_deploy/VGG_VOC0712_SSD_300x300_deploy.xml -d CPU -l pascal_voc_classes.txt
您应该会看到一个视频播放,其中有人走过,并在他们周围有红色边界框。
您还应该在控制台中看到输出,显示找到的对象和置信度。
以下是运行应用程序的标志的含义。也可以通过运行以下命令找到:
./IEobjectdetection -help
-h Print a usage message -i <path> Required. Path to input video file -fr <path> Number of frames from stream to process -m <path> Required. Path to IR .xml file. -l <path> Required. Path to labels file. -d <device> Infer target device (CPU or GPU) -t <type> Infer type (SSD, etc) -pc Enables per-layer performance report -thresh <val>confidence threshold for bounding boxes 0-1 -b <val> Batch size
在此示例视频中,大约有 790 帧,因此通过将帧数设置为 790,您将看到整个视频。
-fr 790
如果将置信度阈值更改为 0.1,您会看到更多围绕人物的边界框,但也会有很多错误的。
-thresh 0.1
./IEobjectdetection -i videos/vtest.avi -fr 200 -m SSD_GoogleNet_v2_fp32.xml -d CPU -l pascal_voc_classes.txt -thresh 0.1
比较 CPU 与 GPU 的性能
CPU
您可以使用 -pc
标志启用性能数据输出到控制台。
-pc
./IEobjectdetection -i videos/vtest.avi -fr 200 -m SSD_GoogleNet_v2_fp32.xml -d CPU -l pascal_voc_classes.txt -pc
您将看到运行所需的**总时间**。
GPU
由于您已安装 OpenCL™ 驱动程序以使用 GPU,因此您可以尝试在 GPU 上运行推理并比较差异。
最好打开一个新的终端窗口,以便比较结果。
请务必先源化您的环境变量。
source /opt/intel/computer_vision_sdk_2017.1.163/bin/setupvars.sh
使用 GPU 由此标志设置
-d GPU
./IEobjectdetection -i videos/vtest.avi -fr 200 -m SSD_GoogleNet_v2_fp32.xml -d GPU -l pascal_voc_classes.txt -pc
CPU 和 GPU 之间的**总时间**将因您的系统而异。
工作原理
推理引擎如何工作?
推理引擎接收神经网络模型的表示,并对其进行优化,以利用 CPU 中的高级 Intel® 指令集,同时也使其兼容其他硬件加速器 (GPU 和 FPGA)。为此,模型文件 (例如 .caffemodel, .prototxt) 会被提供给模型优化器,模型优化器会处理这些文件并输出两个新文件:.bin 和 .xml。在运行应用程序时,将使用这两个文件而不是原始模型文件。在此示例中,提供了 .bin 和 .xml 文件。
在上图所示的 IR 代表中间表示 (Intermediate Representation),这只是 .xml 和 .bin 文件 (作为推理引擎的输入) 的一个名称。
当您想在推理引擎中使用其他模型时,请参考本教程,了解如何使用模型优化器获取必要的文件。 https://software.intel.com/en-us/inference-trained-models-with-intel-dl-deployment-toolkit-beta-2017r3
如果您遇到问题,请随时在我们的论坛 https://software.intel.com/en-us/forums/computer-vision 上联系我们。
代码中的高级步骤
- 检查参数
- 视频预处理
- 将模型加载到推理引擎
- 运行推理
- 解析结果
- 渲染帧
视频预处理
视频预处理步骤会获取当前帧,并使用 cv2.resize()
函数调整其大小,https://docs.opencv.ac.cn/3.0-beta/modules/imgproc/doc/geometric_transformations.html?highlight=resize#cv2.resize,
它还会将其转换为平面格式 (默认情况下是打包格式)。打包格式的排列方式是 RGBRGBRGB,平面格式的排列方式是 RRRGGGBBB。
推理引擎需要这种格式,因为这是 Intel® 数学内核库 (Intel® MKL) 使用的格式。如果您想了解更多信息,请参阅
https://software.intel.com/en-us/ipp-dev-reference-pixel-and-planar-image-formats 和 https://software.intel.com/en-us/ipp-dev-guide-channel-and-planar-image-data-layouts
将模型加载到推理引擎
将模型加载到推理引擎有三个步骤:加载插件、读取网络并将模型加载到插件中。
加载插件
这是通过使用 InferenceEnginePluginPtr _plugin()
函数完成的。
读取网络
网络对象被初始化
InferenceEngine::CNNNetReader network;
然后使用 ReadNetwork()
函数读取网络
network.ReadNetwork(FLAGS_m)
FLAGS_m
表示 -m
标志,在本例中为 SSD_GoogleNet_v2_fp32.xml
。
然后将权重添加到网络中
network.ReadWeights(binFileName.c_str());
注意:.xml 文件包含网络,.bin 文件包含权重。
将模型加载到插件中
有关如何设置输入和 blob,请参阅代码。
运行推理
推理使用以下方式运行:
_plugin->Infer(inputBlobs, outputBlobs, &dsc)
注意: 在每次推理运行之前,图像大小会根据模型 .xml 文件中预期的尺寸进行调整。
后续步骤
有关如何从 Caffe 和 TensorFlow 模型生成 IR 文件的更多信息,请参阅
如果您遇到问题,请随时在我们 论坛上提问。