1 说明2 实验目的3 实验原理4 操作步骤5实际操作
1 说明本实验所有代码均在ubuntu 18.04 + OpenVINO 2020R3.LTS installed 环境下验证通过,若需要代码移植,请务必检查环境配置是否与本实验环境相同。
2 实验目的1、了解推理引擎计数器,了解如何获取网络各层的实时执行时间。
2、掌握添加时间计数器测量推理时间的方法。
任务内容
1、了解推理引擎计数器,了解如何获取网络各层的实时执行时间。
2、在配置文件中添加计数器,测量推理时间。
3、验证第三章节实验三生成的不同模型图像分类的性能。
推理引擎是对模型针对特定设备的二级优化,其使用灵活的“插件”架构去执行环境配置,使其可以在具有完全不同的指令集、不同的内存布局的设备上实施推理,并且实现最佳性能。
推理引擎API是在所有英特尔架构的硬件中实施推理的一套简单而且统一的API,其特殊的插件架构支持优化推理性能和内存使用,同时具有足够的灵活性来支持各种灵活场景。推理引擎API有多个重要的类,包括IECore、InferRequest等,上一个实验我们重点介绍InferRequest类中的get_perf_counts()方法。该方法如下图所示,主要功能则是查询网络每层的性能,通过该方法可以获得最耗时的层信息。
然而很多时候处理视频图像每一帧都会有多于1次的推理(例如,当对视频图像中的两辆车进行分类),而每一个推理耗时则包含网络的每个层的耗时。那么如何获取每一帧推理的总耗时呢?
在Python中包含了若干个能够处理时间的库,而time库是最基本的一个,是Python中处理时间的标准库。time库能够表达计算机时间,提供获取系统时间并格式化输出的方法,提供系统级精确计时功能(可以用于程序性能分析)。time库包含三类函数,分别是时间获取函数、时间格式化函数、程序计时函数。下面我们就来看一下本实验所需的时间获取函数,如下表所示。
函数 描述
time() 获取当前时间戳,即当前系统内表示时间的一个浮点数。例如:
>>> import time >>> time.time() 1584341528.5690455 时间戳是从1970年1月1日0:00开始,到当前为止的一个以秒为单位的数值。 ctime() 获取当前时间,并返回一个以人类可读方式的字符串。例如: >>> import time >>> time.ctime() ‘Mon Mar 16 14:59:35 2020’ gmtime() 获取当前时间,并返回计算机可处理的时间格式。例如: import time time.gmtime() time.struct_time(tm_year=2020, tm_mon=3, tm_mday=16, tm_hour=7, tm_min=6, tm_sec=2, tm_wday=0, tm_yday=76, tm_isdst=0)4 操作步骤
步骤1
登录实验平台,进入实验环境并打开终端。
步骤2
执行命令su,输入root用户密码root@openlab,切换到root目录。
步骤3
执行命令cd ~/51openlab/05/exercise-1/,进入exercise-1目录。
步骤4
执行如下命令,初始化OpenVINO。
# source /opt/intel/openvino/bin/setupvars.sh
步骤5
执行如下命令,录入实验路径。
# export lab_dir=~/51openlab/05/exercise-1/
步骤6
执行命令gst-play-1.0 road.mp4,打开视频播放器,查看所要被检测的视频文件,如下图所示,可以看到视频中有很多行驶的汽车。
步骤7
执行如下命令,对上图所查看的视频中的对象进行目标检测追踪,并保存结果在output.avi文件中。
# python3 2.object-detection-save-video.py
步骤8
再次执行命令gst-play-1.0 output.avi播放视频,验证目标检测追踪结果。
步骤9
执行如下命令运行程序3.object-detection-show-progress.py,该程序会显示每帧视频的进度。同时也会显示帧编号,以及每帧视频所检测到的所有对象的分类。
# python3 3.object-detection-show-progress.py
由运行结果,可以看出视频中每帧检测到的对象大多数是类3,也就是汽车。
步骤10
执行命令vi add-perf-object-detection.py,编辑文件添加如下图红框中所示代码,在推理前后增加计时点,结束时间与开始时间相减以获得推理时间。然后使用sys.stdout.write函数将结果打印在屏幕上。编辑完成,执行wq保存修改。
步骤11
执行如下命令运行add-perf-object-detection.py程序,可以看到程序显示每帧检测追踪到的对象的同时,也会打印出其推理时间,如下图所示。
# python3 add-perf-object-detection.py
步骤12
验证ONNX模型在不同参数下的推理性能。执行命令cd ~/51openlab/05/exercise-3/,进入exercise-3目录。
步骤13
执行vi classification_sample.py命令,修改classification_sample.py文件,使用time函数获取推理时间。具体命令和添加代码如下所示。
步骤14
执行如下命令初始化OpenVINO。
# source /opt/intel/openvino/bin/setupvars.sh
步骤15
执行如下命令,录入实验路径。
# export lab_dir=~/51openlab/05/exercise-3/
步骤16
执行如下命令,运行精度为FP16的模型进行推理分类,得到推理时间如下截图。
# python3 classification_sample.py -m mobilenetv2-7-FP16.xml --labels labels.txt -i 1.JPEG
步骤17
执行如下命令,运行原始精度为32的模型进行推理分类,得到推理时间如下截图。
# python3 classification_sample.py -m mobilenetv2-7.xml --labels labels.txt -i 1.JPEG
步骤18
执行如下命令,运行batch为4的模型进行推理分类,得到推理时间如下截图。
# python3 classification_sample.py -m mobilenetv2-7-batch-4.xml --labels labels.txt -i 1.JPEG
步骤19
执行如下命令,运行输入大小为[1,3,100,100]的smaller模型进行推理分类,得到推理时间如下截图。
# python3 classification_sample.py -m mobilenetv2-7-smaller.xml --labels labels.txt -i 1.JPEG
由以上运行结果可知,精度为FP16的模型在分类正确的前提下,其推理所花费的时间比精度为FP32的模型更少,性能更好。batch为4的模型比batch为1的模型,其推理所花费的时间更少,性能更好一点。而输入大小为越小,其推理所花费的时间越小,但是其推理分类的准确度降低。
5实际操作



