5 输入数据和预处理
5.1 输入图像格式
输入图像
除了转换模型之外,SNPE 还要求输入图像采用可能与源框架不同的特定格式。
在 Caffe 中,图像呈现为形状的张量(batch x channel x height x width),其中宽度是变化最快的维度,其次是高度,然后是颜色通道。这意味着第一个颜色通道的所有像素值在内存中都是连续的,然后是下一个颜色通道的所有像素值,依此类推。convert_imagesetCaffe在训练过程中在工具中准备这种格式的图像。
在 SNPE 中,图像必须表示为形状为 的张量(batch x height x width x channel),其中通道是变化最快的维度。这意味着单个像素的所有颜色通道的值在内存中是连续的,然后是下一个像素的所有颜色值,依此类推。
如果批次维度大于 1,则必须为每个批次手动将单个图像连接在一起成为一个文件。
请参见下图,了解两种输入图像内存布局的可视化表示。
笔记:
推理期间使用的通道顺序必须与训练期间使用的通道顺序相同。例如,在 Caffe 中训练的 Imagenet 模型需要 BGR 的通道顺序。
Imagenet 模型的输入图像
Caffe中的Imagenet模型(如bvlc_alexnet、bvlc_googlenet等)是用BGR图像(蓝色像素先于绿色像素先于红色像素)训练的。推理引擎必须以相同的通道顺序提供像素值。
下图显示了 Caffe 和 SNPE 对 bvlc_alexnet 模型所需的两种不同的输入图像内存布局。输入图像大小为 227x227。
MNIST 模型的输入图像
Caffe 中的 MNIST 模型(例如 lenet)需要大小为 28x28 的单通道灰度图像。请注意,虽然只有一个通道,但在 Caffe(1x1x28x28)和 SNPE中仍然需要一个 4 维的输入张量(1x28x28x1)。
输出
该示例的输出在 Caffe 和 SNPE 之间保持相同:一个一维张量,其中包含批次中每个图像的每个类别的概率。
对于 Imagenet 模型(例如 bvlc_alexnet),这是 1000 个 Imagenet 类的大小为 1000 的张量。
如果模型的批量维度大于 1,则各个输出张量将沿着批量维度连接在一起。
6 教程和示例
6.1 教程设置
教程资源
这些教程需要额外的资源,这些资源不包含在默认的 SNPE SDK 包中。在运行教程之前需要下载这些资产。
获取 AlexNet
在本教程中,为 Caffe 教程准备了 AlexNet Caffe 模型文件(prototxt 和 caffemodel)和示例图像文件。该脚本需要 AlexNet 资产的目录路径。该脚本还可以选择下载 AlexNet 资产。请注意,该脚本将批处理数更改为 1,并将修改后的模型保存为 $SNPE_ROOT/models/alexnet/caffe 中的 deploy_batch_1.prototxt。
deploy.prototxt - https://raw.githubusercontent.com/BVLC/caffe/master/models/bvlc_alexnet/deploy.prototxt
bvlc_alexnet.caffemodel - http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel
caffe_ilsvrc12.tar。 gz - http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz
请注意,资产很大,下载可能需要一些时间。
运行“python3 $SNPE_ROOT/models/alexnet/scripts/setup_alexnet.py -h”将显示使用说明。
用法:$SNPE_ROOT/models/alexnet/scripts/setup_alexnet.py [-h] -a ASSETS_DIR [-d]
为教程示例准备 AlexNet 资产。
必需参数:
-a ASSETS_DIR, --assets_dir
包含 AlexNet 资产的 ASSETS_DIR 目录
可选参数:
-d, --download 下载 AlexNet 资产到 AlexNet 资产目录
下载模型并准备资产资产
目录包含网络模型资产。如果先前已下载资产,请将 ASSETS_DIR 设置为此目录,否则选择一个目标目录来存储下载的资产。如果资产已经下载到目录(例如 ~/tmpdir),则发出以下命令。
- python3 $SNPE_ROOT/models/alexnet/scripts/setup_alexnet.py -a ~/tmpdir
发出此命令首先下载资产。下载的文件将写入指定的资产目录(例如 ~/tmpdir)
- python3 $SNPE_ROOT/models/alexnet/scripts/setup_alexnet.py -a ~/tmpdir -d
脚本完成后,准备好的 AlexNet 资产将连同示例原始图像和转换后的 SNPE DLC 文件一起复制到$SNPE_ROOT/models/alexnet 目录。
获取 Inception v3
在本教程中,为 TensorFlow 分类教程准备了 Inception v3 TensorFlow 模型文件和示例图像文件。该脚本需要 Inception v3 资产(zip 文件)的目录路径。该脚本还可以选择下载 Inception v3 存档。
下面列出了 Inception v3 资产:
inception_v3_2016_08_28_frozen.pb.tar.gz - https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz
请注意,资产很大,下载可能需要一些时间。
运行“python3 $SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py -h”将显示使用说明。
用法:$SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py [-h] -a ASSETS_DIR [-d] [-r RUNTIME] [-u] [-l [HTP_SOC]] 为教程示例准备 inception_v3 资产
。
必需参数:
-a ASSETS_DIR,--assets_dir
包含 inception_v3 资产的 ASSETS_DIR 目录
可选参数:
-d,--download 下载 inception_v3 资产到 inception_v3 示例
目录
-r RUNTIME,--runtime RUNTIME
选择一个运行时来设置教程。选择:cpu、
gpu、dsp、aip、全部。'all' 选项仅受
--udo 标志支持
-u, --udo 生成并编译用户定义的操作包
以与 inception_v3 一起使用。Softmax 被模拟
为该脚本的 UDO。
-l [HTP_SOC], --htp_soc [HTP_SOC]
指定用于生成 HTP 离线缓存的 SOC 目标。
例如:"--htp_soc sm8450" for waipio, default
value is sm8550
下载模型并准备
资产资产目录旨在包含网络模型资产。如果先前已下载资产,请将 ASSETS_DIR 设置为此目录,否则选择一个目标目录来存储下载的资产,以及选项 [–download] 以实际下载模型文件。
目标运行时的选择
根据所选的运行时,脚本可能会执行特定于硬件目标的额外优化步骤。用户可以选择生成最终的 DLC,以在运行时在 CPU、GPU、DSP 或 HTA 目标之一上运行。
参数 ‘runtime’ 是可选的,在未明确指定时默认为 ‘cpu’。
以下是在不同情况下使用的一些示例命令:
让我们使用 ~/tmpdir 作为这些示例的资产目录。
- 运行脚本下载模型并设置为在 CPU 上运行:
- python $SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py -a ~/tmpdir -d
- 运行脚本下载模型并设置为在 DSP 上运行:
- python $SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py -a ~/tmpdir -d -r dsp
- 在已下载到 ~/tmpdir 的模型上运行脚本以设置为在 HTA 上运行:
- python $SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py -a ~/tmpdir -r aip
SoC 目标的选择
基于 SoC 目标,当目标运行时为“dsp”或“all”时,脚本将向 snpe-dlc-quantize 添加 enable_htp 和 htp_socs 参数。
参数 ‘htp_soc’ 是可选的,如果没有给出值,则 ‘sm8550’ 被视为 htp_soc 参数的默认值。
以下是运行 setup_inceptionv3.py 的一些示例命令:
运行脚本以下载模型并设置为在 dsp 上运行
- SoC 目标为 sm8550:
- python $SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py -a ~/tmpdir -d -r dsp -l
- SoC目标为sm8450:
- python $SNPE_ROOT/models/inception_v3/scripts/setup_inceptionv3.py -a ~/tmpdir -d -r dsp -l sm8450
脚本完成后,准备好的 Inception v3 资产被复制到 $SNPE_ROOT/models/inception_v3 目录,连同示例原始图像和转换后的 SNPE DLC 文件(如果适用)进行额外优化。
注意:有关使用 UDO 运行 Inception v3 和使用 --udo 的信息,请访问UDO 教程