模型转换密码-3:从 MobilenetSSD 到 DeepLabv3 的技术突破

使用 MobilenetSSD

Tensorflow MobilenetSSD 模型

Tensorflow Mobilenet SSD 冻结图有两种类型:标准冻结图和量化感知冻结图。以下示例使用量化感知冻结图来确保在高通神经处理SDK 运行时获得准确的结果。

先决条件

量化感知模型转换过程已使用 Tensorflow v1.11 进行测试,但其他版本也可能适用。使用 CPU 版本的 Tensorflow 是为了避免转换过程中在不同 GPU 卡上观察到的内存不足问题。

设置 Tensorflow 对象检测框架

量化感知模型以 TFLite 冻结图的形式提供。然而,高通神经处理SDK 需要 TensorFlow 冻结图 (.PB)。为了转换量化模型,需要使用对象检测框架将其导出到 TensorFlow 冻结图。请按照以下步骤克隆对象检测框架:

mkdir ~/tfmodels
cd ~/tfmodels
git clone https://github.com/tensorflow/models.git

检查经过测试的对象检测框架提交(SHA)

git checkout ad386df597c069873ace235b931578671526ee00

按照第三方说明设置 Tensorflow 对象检测框架

下载量化感知模型

已测试特定版本的 Tensorflow MobilenetSSD 模型: ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03.tar.gz

wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03.tar.gz

下载模型后,将内容提取到目录中。

tar xzvf ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03.tar.gz

从对象检测框架导出经过训练的图表

按照以下说明导出 Tensorflow 图:

或者修改并执行此示例脚本

使用您喜欢的编辑器创建此文件 export_train.sh。将路径修改为下载的量化感知模型文件的正确目录位置。

#!/bin/bash
INPUT_TYPE=image_tensor
PIPELINE_CONFIG_PATH=<path_to>/ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03/pipeline.config
TRAINED_CKPT_PREFIX=<path_to>/ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03/model.ckpt
EXPORT_DIR=<path_to>/exported
pushd ~/tfmodels/models/tfmodels/research
python3 object_detection/export_inference_graph.py \
--input_type=${INPUT_TYPE} \
--pipeline_config_path=${PIPELINE_CONFIG_PATH} \
--trained_checkpoint_prefix=${TRAINED_CKPT_PREFIX} \
--output_directory=${EXPORT_DIR}
popd

使脚本可执行

chmod u+x export_train.sh

运行脚本

./export_train.sh

这应该会生成一个冻结的图表 <path_to>/exported/frozen_inference_graph.pb

使用snpe-tensorflow-to-dlc转换器转换冻结图 。

snpe-tensorflow-to-dlc --input_network <path_to>/exported/frozen_inference_graph.pb --input_dim Preprocessor/sub 1,300,300,3 --out_node detection_classes --out_node detection_boxes --out_node detection_scores ---output_path mobilenet_ssd.dlc --allow_unconsumed_nodes

在高通神经处理SDK 转换之后,您应该有一个可以在高通神经处理SDK 运行时加载和运行的 mobilenet_ssd.dlc。

该模型的输出层是:

  • 后处理器/BatchMultiClassNonMaxSuppression

  • 添加

输出缓冲区名称为:

  • (类别)detection_classes:0(+1 索引偏移量)

  • (类)后处理器/BatchMultiClassNonMaxSuppression_classes(0 索引偏移)

  • (框)后处理器/BatchMultiClassNonMaxSuppression_boxes

  • (分数)后处理器/BatchMultiClassNonMaxSuppression_scores

高通神经处理SDK 中运行模型

以下是在 高通神经处理SDK 中运行 DLC 模型的限制和建议:

  • 不支持批次维度 > 1。

  • DetectionOutput 层仅支持 CPU 运行时处理器。要使用其他运行时处理器(例如 GPU 或 DSP)运行模型,必须在运行时列表中启用 CPU 回退模式。如果使用snpe-net-run 工具,请使用–runtime_order选项

  • 合理配置 DetectionOutput 层。DetectionOutput 层的性能(即处理时间)取决于层参数:top_kkeep_top_k 和confidence_threshold。例如,top_k参数对处理时间的影响实际上呈指数级;例如,top_k=100 的处理时间比 top_k=1000 的处理时间要小得多。较小的参数confidence_threshold会导致输出框数量较多,反之亦然。

  • 不允许在 SNPE 对象创建/构建时调整输入维度。请注意,输入维度在转换过程中嵌入到 DLC 模型中,但在某些情况下,可以在 SNPE 对象创建/构建时通过 Snpe_SNPEBuilder_SetInputDimensions() 进行覆盖。由于模型转换器中的 PriorBox 层折叠,无法调整输入/网络大小。

使用 DeepLabv3

Tensorflow DeepLabv3 模型

Tensorflow DeepLabv3 模型的特定版本已测试:deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar。此版本的 DeepLabv3 使用 MobileNet-v2 作为骨干网络,并已在 Pascal VOC 2012 数据集上进行预训练。

下载模型。

wget http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz

下载模型后,将内容提取到目录中。

tar xzvf deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz

使用snpe-tensorflow-to-dlc转换器转换模型 。

snpe-tensorflow-to-dlc --input_network deeplabv3_mnv2_pascal_train_aug/frozen_inference_graph.pb --input_dim sub_7 1,513,513,3 --out_node ArgMax --output_path deeplabv3.dlc

该模型的输出层是:

  • 精氨酸

输出缓冲区名称为:

  • (分割图)ArgMax:0.raw

预处理输入图像

高通神经处理SDK 不支持 DeepLabv3 模型中的预处理。预处理必须在图像运行前离线完成。在预处理阶段,图像必须调整大小为 513x513x3,并且像素必须归一化到 -1 到 1 之间。

需要按照以下顺序对所有输入图像执行以下步骤:

  1. 使用以下方法计算图像的调整大小比率和目标大小:

    resize_ratio = 513.0 / max(width, height)
    target_size = (int(resize_ratio * width), int(resize_ratio * height))
    
  2. 使用抗锯齿重采样滤波器将图像转换为目标尺寸。这将使图像的长边尺寸为 513,而另一边尺寸小于 513。

  3. 用平均值 128 填充较小的尺寸,以生成 513x513x3 的图像。

  4. 将图像转换为float32类型。

  5. 将图像逐个元素与 0.00784313771874 相乘。

  6. 逐个元素地从图像中减去 1.0。

在 高通神经处理SDK 中运行模型

以下是在高通神经处理SDK 中运行 DLC 模型的限制和建议:

  • 模型中的某些操作仅在 CPU 运行时处理器上支持。要使用其他运行时处理器(例如 GPU 或 DSP)运行模型,必须在运行时列表中启用 CPU 回退模式。如果使用snpe-net-run 工具,请使用–runtime_order选项

后处理输出分割图

使用高通神经处理SDK 运行 DeepLabv3 将生成一个尺寸为 513x513x1 的输出分割图,其中每个元素都是一个整数,代表一个类别(例如 0=背景等)。然而,高通神经处理SDK 的输出仍然带有预处理步骤中应用的填充。必须裁剪掉此填充,并将图像调整为原始大小。

为了获得与原始图像相同的尺寸,应采取以下步骤:

  1. 裁剪掉预处理步骤中应用于较短维度的填充。分割图的尺寸比例现在应该与原始图像相同。

  2. 将分割图调整为原始图像的高度和宽度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值