使用模型优化器优化SSD-mobilenet模型
1 说明
本实验所有代码均在ubuntu 18.04 + OpenVINO 2020R3.LTS installed 环境下验证通过,若需要代码移植,请务必检查环境配置是否与本实验环境相同。
2 实验目的
1、掌握模型优化器优化SSD mobilenet模型的方法。
2、掌握使用优化后的模型对图像中的对象进行检测和分类的方法。
3 任务内容
1、使用模型优化器优化SSD mobilenet模型。
2、使用优化后的模型对图形中的对象进行检测和分类。
4 实验原理
一、SSD(Single Shot MultiBox Detector)简介
SSD全称是“Single Shot MultiBox Detector”,它的基本功能是对视频图像中的对象进行检测和分类。它支持并行搜索不同大小的对象,并尝试对每个对象进行分类。例如,下图中可以看到检测到了3个对象具有完全不同的“box”、含义、大小和纵横比。
二、SSD拓扑
SSD是对象检测API拓扑中最简单的拓扑。其中ssd_v2_support.json配置文件被用来转换该模型,其中包括了ObjectDetectionAPIPreprocessorReplacement,
ObjectDetectionAPISSDPostprocessorReplacement和ObjectDetectionAPIOutputReplacement三个模块。具体的实现如下所述。
(1)预处理模块
所有对象检测API拓扑均包含了节点的预处理模块,预处理模块包括两个任务项。
将图像缩放到拓扑所需的大小
在需要的时候使用均值和缩放值
在这里需要注意的是,由于以下两点原因,模型优化器无法转换部分预处理器模块执行缩放的功能。一个是TensorFlow使用了推理引擎(神经网络)不支持的while循环实现,另一个是推理引擎会自动将输入图像缩放为中间表示(IR)的输入层大小。鉴于以上原因,所以有必要将预处理模块的缩放比例部分剪辑掉,只保留均值和缩放值的操作。使用模型优化器子图替换机制可以解决此问题。具体的操作是使用如下两个附加参数,第一个是tensorflow_use_custom_operations_config,它使用一个特殊的JSON文件来描述如何替换循环子图。第二个参数是tensorflow_object_detection_api_pipeline_config,它是一个特殊的配置文件,描述了拓扑超参数和TensorFlow对象检测API模型的结构。预处理的子图替换机制代码可以在如下文件中查看具体实现。(/deployment_tools/model_optimizer/extensions/front/tf/ObjectDetectionAPI.py)
(2)后处理模块
SSD拓扑的一个显著特征是其对检测的图像边框执行非最大抑制的部分,这一部分在TensowFlow框架中有数十种实现方式,而在推理引擎中,则对应名为DetectionOutput的这一层。因此,要把TensorFlow框架下的SSD模型转换为IR,模型优化器应使用单个DetectionOutput节点替换实现该层操作的整个子图。在ssd_v2_support.json配置文件中使用的是按点替换子图来匹配后处理模块。
推理引擎DetectionOutput层实现按以下顺序消费三个张量:
1.带有边界框位置的张量
2.每个边框的置信度张量
3.先验边框张量(TensorFlow中称为“锚”)
推理引擎的DetectionOutput层实现在实际检测时,会生成一个带有7个数字参数的张量。依次是batch index、class label、class probability、x_1 box coordinate、y_1 box coordinate、x_2 box coordinate、y_2 box coordinate。而TensorFlow对象检测API有多个输出张量,包括detection_boxes、detection_classes、detection_scores和num_detections,但是其值与推理引擎的DetectionOutput层输出值是一致的。
5 操作步骤
步骤1
登录实验平台,进入实验环境并打开终端。
步骤2
执行命令su,输入root用户密码root@openlab,切换到root用户。
步骤3
执行命令cd ~/51openlab/03/exercise-2/,进入exercise-2目录。
步骤4
执行如下命令录入实验路径。
# export lab_dir=~/51openlab/03/exercise-2/
步骤5
执行如下命令,初始化OpenVINO
# source /opt/intel/openvino/bin/setupvars.sh
步骤6
执行如下命令录入模型优化器路径
# export mo_dir=/opt/intel/openvino/deployment_tools/model_optimizer/
步骤7
执行如下命令查看ssd_mobilenet_v2_coco模型下的所有文件,包括frozen_inference_graph.pb文件和pipeline.config文件。其中frozen_inference_graph.pb是训练流程结束时冻结的模型,文件中所有的变量都具有一个固定值。
# ll public/ssd_mobilenet_v2_coco/ssd_mobilenet_v2_coco_2018_03_29/
步骤8
执行如下命令,查看模型的yaml文件,了解模型参数。
# vi /opt/intel/openvino/deployment_tools/open_model_zoo/models/public/ssd_mobilenet_v2_coco/model.yaml
步骤9
执行如下命令运行模型优化器。输入模型为已训练好并冻结的模型frozen_inference_graph.pb,按照yaml文件的说明反转输入通道的顺序,输入形状分为1个通道,3个通道,一个300*300的图像。指定相应的json文件和管道配置文件。同时命名输出层的4个模型名称为ssd-mobilenet,运行并生成IR文件。
#mo.py --input_model public/ssd_mobilenet_v2_coco/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb --reverse_input_channels --input_shape [1,300,300,3] --input=image_tensor --transformations_config=$mo_dir/extensions/front/tf/ssd_v2_support.json --tensorflow_object_detection_api_pipeline_config=public/ssd_mobilenet_v2_coco/ssd_mobilenet_v2_coco_2018_03_29/pipeline.config --output=detection_classes,detection_scores,detection_boxes,num_detections --model_name ssd-mobilenet
步骤10
执行如下命令查看所要检测的图片。
# sudo eog images/1.jpg
步骤11
执行如下命令,使用刚刚生成的IR文件作为模型,并使用标签,运行并检测1.jpg图像。
# python3 object_detection.py -m ssd-mobilenet.xml --labels labels.txt -i images/1.jpg
根据运行结果,可以看到在输入的图片中检测到1个人,2个显示器和1个键盘。
步骤12
执行如下命令查看输出的图片,验证检测分类实验效果。
# sudo eog out.bmp
6 实际操作
注意那些超长的命令路径
+enter可换行输入
使用优化生产的IR文件运行模型即可