学习模型优化器并进行图片分类
1 说明
本实验所有代码均在ubuntu18.04 + OpenVINO 2020R3.LTS installed 环境下验证通过,若需要代码移植,请务必检查环境配置是否与本实验环境相同。
2 实验目的
1、使用模型优化器生成IR文件。
2、使用python分类示例对图像进行分类。
3 任务内容
1、使用模型优化器生成IR文件。
2、使用python分类示例对图像进行分类。
4 实验原理
一、DLDT介绍
模型优化器(Model Optimizer)和推理引擎(Inference Engine)是整个工具套件的核心。
模型优化器是一个跨平台的命令行工具,可促进训练和部署环境之间的转换,执行静态模型分析并自动调整深度学习模型,以便在端点目标设备上实现最佳执行。模型优化器旨在支持多种深度学习支持的框架和格式。在运行模型优化器时,无需考虑要使用的目标设备,MO的相同输出可用于所有目标。模型优化器支持的框架和格式有Caffe(大多数公共分支机构)、TensorFlow、MXNet、Kaldi、ONNX。模型优化器工作流程:
*为支持的深度学习框架配置模型优化器,该框架用于训练模型。
*提供特定的网络拓扑,调整后的权重和偏差(带有一些可选参数)的训练网络作为输入。
*运行模型优化器以执行特定的模型优化(例如,某些网络层的水平融合)。精确优化是特定于框架的,具体可参考Intel官网相应的页面:转换Caffe模型,转换TensorFlow模型,转换MXNet模型,转换Kaldi模型,转换ONNX模型。
模型优化器生成网络的中间表示(IR)作为输出,该网络用作所有目标上的推理引擎的输入。IR是一对描述整个模型的文件:
① .xml:拓扑文件,描述网络拓扑的XML文件
② .bin:经过训练的数据文件,包含权重和偏差二进制数据的.bin文件
推理引擎是提供统一的API以将推理与应用程序逻辑集成,主要作用如下:
作为模型的输入。该模型以模型优化器生成的中间表示(IR)的特定形式呈现。
优化目标硬件的推理执行。
在嵌入式推理平台上提供减少占用空间的推理解决方案。
推理引擎支持IR格式模型,并可使用相同的模型在多种设备上运行推理,例如英特尔CPU、凌动、酷睿或至强、英特尔集成显卡、Movidius VPU和FPGA。
DLDT的具体工作流程如下图所示。
需要注意的是,使用模型优化器转换模型是一个离线操作,只需要执行一次。不需要太久的时间,就会看到转换结果。一旦有了IR文件,就可反复使用它们进行推理,模型优化器的功能不仅仅是转换模型,还可以在神经网络上执行各种优化,比如将数据格式转换为FP16等。
二、应用构建的流程
创建人工智能应用或产品的流程如下:
1.找到合适的模型
首先需要一个基于深度学习的模型来执行分析任务,比如分类、检测、分割等。整个模型通常在另一个软件中进行训练,例如TensorFlow或Caffe等训练软件。
2.进行推理之前的准备
模型通常是在云环境中训练的,因为云环境拥有所需的所有计算资源,但是需要为推理做好准备。比如模型通常采用浮点格式,有时用户想在只能执行整数或其他格式的设备上运行模型,因此,需要转换模型格式。
3.性能指标评测
准备好进行推理的模型后,需要对其进行性能指标评测,了解其性能,以及每秒可以执行多少次推理。可以使用多项优化技术和多种数据格式对多个模型进行基准测试。
4.选择能够满足性能要求的平台
5.查看解码和编码密度
选择合适硬件的另一个考虑因素是设备可支持多少个摄像头,如果销售的产品可以支持5个或10个摄像头,那么其中的差异就很大。为此,需要查看解码密度。
6.由于解码、编码和推理等任务是一起运行的,所以得到的结果可能差强人意
例如,如果推理结果是每秒100次推理,解码每秒可以处理100帧,当他们一起运行时,也许每秒只能处理80帧,因此如果需要模拟完整的工作负载,也就是说,所有功能同时执行,就需要选择合适的系统。通常用STREAMER模拟整个流程。
7.构建软件
在确认所选择的系统可以胜任后,我们需要构建软件,或者使用OpenVINO 将视频分析流程和推理整合到现有应用中。
下面我们重点介绍如何获取一个深度学习的模型,然后进行模型转换,最后使用一个OpenVINO示例来创建AI应用。
三、获取深度学习的模型
获取模型有3种方法。
1. 第一是通过某个途径购买或下载模型或自行训练。
训练模型是一项单独的技术,并非本课程的重点,在此不做详细阐述。
2. 第二个是从OpenVINO model-zoo中下载模型。
OpenVINO中共有40多种模型,它们有着广泛用途,可用于检测、分类、分割、重新识别、2D、3D、音频处理等。这些模型可以免费下载使用,并且针对英特尔硬件进行了优化,性能非常出色。
查看模型优化器和推理引擎的文档具体操作如下:
访问OpenVINO工具套件文档页面
链接: link.
可以查看模型优化器和推理引擎的文档。单击Model-Zoo链接查看相关内容,可以看到用于对象检测的模型、支持对象识别的模型、重新识别模型等。比如需要寻找可以检测人员的模型,则可以使用faster-rcnn-resnet101-coco-sparse-60-0001这个模型,单击这个模型,可获得其所有信息,包括精度、输入、输出等。
下载模型的具体操作如下:
访问Model-Zoo存储库https://download.01.org/opencv
链接: link.
比如选择面部检测模型,可以通过3种不同的格式可以下载,即FP16、INT8和FP32。这里IR文件包含xml和bin文件,右击 save-link-as便可获得模型。
3. 最后一个选项是使用模型下载器
这是一个非常简单的Python实用程序,可以下载许多公开模型和所有Model-Zoo模型。可以指定所需的模型、具体精度比如FP32、FP16、INT8。可以使用列表一次下载一个或多个模型。比如下载squeezenet模型,并将其放在这个目录中,具体如下。
如果是从OpenVINO model-zoo中获得了模型,则该模型已经过优化并且为IR格式。如果不是,需要为其进行模型转换。可以使用模型优化器进行模型转换,我们将在下一项目中对此进行深入讨论和练习。最后可以使用OpenVINO提供的一个示例或演示,OpenVINO 包含约40个C、C++ 和Python演示和示例,选择一个预训练模型或IR格式的任何模型,将其插入其中一个示例就得到一个AI应用。
四、SqueezeNet介绍
SqueezeNet的核心指导思想是——在保证精度的同时使用最少的参数。
1 设计思想
(1)用1×1卷积核代替3×3卷积核。理论上一个1×1卷积核的参数是一个3×3卷积核的1/9,可以将模型尺寸压缩9倍。
(2)减少3×3卷积的输入通道数。减少输入通道数不仅可以减少卷积的运算量,而且输入通道数与输出通道数相同时还可以减少MAC。
(3)延迟下采样。分辨率越大的输入能够提供更多特征的信息,有利于网络的训练判断,延迟下采样可以提高网络精度。
2 网络架构
SqueezeNet提出了一种多分支结构——fire model。这个结构是由squeeze层和expand层构成的。squeeze层是由s1个1×1卷积组成,主要是通过1×1卷积降低expand层的输入维度。expand层利用e1个1×1和e3个3×3卷积构成多分支结构提取输入特征,以此提高网络的精度(其中文中给出e1=e3=4×s1)。
其中,expand层中,把1×1和3×3得到的feature map进行通道上的concat。
3 操作步骤
步骤1
登录实验平台,进入实验环境并打开终端。
步骤2
执行命令su,输入root用户密码root@openlab,切换到root目录。
步骤3
执行命令cd ~/51openlab/02/exercise-1/,进入exercise-1目录。
步骤4
执行export lab_dir=~/51openlab/02/exercise-1/设置lab_dir环境变量。
步骤5
执行如下命令,初始化OpenVINO工具套件。
# source /opt/intel/openvino/bin/setupvars.sh
步骤6
执行如下命令,查看squeezenet1.1的网络。
# netron $lab_dir/public/squeezenet1.1/squeezenet1.1.prototxt
步骤7
执行如下命令,进入模型优化器目录。
# cd /opt/intel/openvino/deployment_tools/model_optimizer
步骤8
执行如下命令,用模型优化器对模型进行转换。
# mo_caffe.py --input_model $lab_dir/public/squeezenet1.1/squeezenet1.1.caffemodel --output_dir $lab_dir
步骤9
执行如下命令,查看输出的xml文件。
# netron $lab_dir/squeezenet1.1.xml
步骤10
执行如下命令,返回实验目录并查看目录下文件内容。
# cd $lab_dir
# ls
步骤11
执行vi squeezenet1.1.labels命令,查看标签文件内容。
步骤12
执行ll images命令,查看实验预置的图片信息。
步骤13
执行sudo eog images/car.png命令,查看小汽车图片。
步骤14
执行如下命令,从推理引擎中拷贝一个简单的分类示例到实验目录下。
# cp /opt/intel/openvino/inference_engine/samples/python/classification_sample/classification_sample.py ./
步骤15
执行vi classification_sample.py命令,编辑第127行代码,调整输出格式。
步骤16
执行如下命令,指定相应的模型文件和标签文件,对汽车图片进行分类。
# python3 classification_sample.py -i images/car.png -m squeezenet1.1.xml --labels squeezenet1.1.labels -d CPU
由此可见,通过该推理运算,识别到了图片中的汽车,置信度为83%。
5 实际操作
在终端使用netron打开文件,可以查看squeezenet1.1的网络
此时会占用浏览器端口,在步骤9打开xml文件需要先关闭占用的应用
linux 查看文件显示行号
1.用vi或vim打开文件显示行号:
显示当前行号: :nu
显示所有行号: :set nu
其它正常输入即可