骁龙神经处理引擎SDK参考指南(16)
6.4 跑网
6.4.1 Caffe Alexnet
运行 AlexNet 模型
概述
本教程中的示例 C++ 应用程序称为snpe-net-run。它是一个命令行可执行文件,使用 SNPE SDK API 执行神经网络。
snpe-net-run 所需的参数是:
DLC文件格式的神经网络模型
包含输入数据路径的输入列表文件。
snpe-net-run 的可选参数是:
选择 GPU 或 DSP 运行时(默认为 CPU)
输出目录(默认为./output)
显示帮助说明
snpe-net-run 使用对输入数据执行神经网络的结果创建并填充输出目录。
SNPE SDK 提供snpe-net-run的Linux 和 Android 二进制文件
- $SNPE_ROOT/bin/x86_64-linux-clang
- $SNPE_ROOT/bin/arm-android-clang6.0
- $SNPE_ROOT/bin/aarch64-android-clang6.0
- $SNPE_ROOT/bin/aarch64-oe-linux-gcc6.4
- $SNPE_ROOT/bin/arm-oe-linux-gcc6.4hf
先决条件
- SNPE SDK 已按照SNPE 设置章节 进行设置。
- 教程设置已完成。
- Caffe 已安装(请参阅Caffe 和 Caffe2 设置)
介绍
AlexNet imagenet 分类模型经过训练可以对具有 1000 个标签的图像进行分类。下面的示例显示了使用snpe-net-run执行预训练的 AlexNet 模型以对一组样本图像进行分类所需的步骤。
在 Linux 主机上运行
转到模型的基本位置并运行snpe-net-run
cd $SNPE_ROOT/models/alexnet
snpe-net-run --container dlc/bvlc_alexnet.dlc --input_list data/cropped/raw_list.txt
snpe-net-run 完成后,验证结果是否填充在 $SNPE_ROOT/models/alexnet/output 目录中。应该有一个或多个 .log 文件和几个 Result_X 目录,每个目录包含一个prob.raw文件。
输入之一是 data/cropped/chairs.raw,它是从 data/cropped/chairs.jpg 创建的,如下所示。
使用此输入文件,snpe-net-run 创建了输出文件 $SNPE_ROOT/models/alexnet/output/Result_0/prob.raw。它保存了 1000 个类别的 1000 个概率的输出张量数据。具有最高值的元素代表顶级分类。我们可以使用 python 脚本来解释分类结果,如下所示。
python3 $SNPE_ROOT/models/alexnet/scripts/show_alexnet_classifications.py -i data/cropped/raw_list.txt \
-o output/ \
-l data/ilsvrc_2012_labels.txt
输出应如下所示,显示所有图像的分类结果。
Classification results
<input_files_dir>/trash_bin.raw 0.949348 412 ashcan, trash can, garbage can,
wastebin, ash bin, ash-bin, ashbin,
dustbin, trash barrel, trash bin
<input_files_dir>/plastic_cup.raw 0.749104 647 measuring cup
<input_files_dir>/chairs.raw 0.365685 831 studio couch, day bed
<input_files_dir>/notice_sign.raw 0.722708 458 brass, memorial tablet, plaque
注意:上面的 <input_files_dir> 映射到路径,例如 /local/mnt/workspace/XXX/snpe-xyz/models/alexnet/data/cropped/
第二个输出显示图像被分类为“量杯”(标签的索引 647),概率为 0.749104。查看其余输出以查看模型对其他图像的分类。
二进制数据输入
请注意,AlexNet 图像分类模型不接受 jpg 文件作为输入。该模型期望其输入张量维度为 227x227x3 作为浮点数组,请参阅输入图像以获取更多详细信息。scripts/setup_alexnet.py 脚本通过调用 scripts/create_alexnet_raws.py 执行 jpg 到二进制数据的转换。这些脚本是如何预处理 jpg 图像以生成 AlexNet 模型输入的示例。
create_alexnet_raws.py 的用法
请事先将您的*.jpg 文件放入一个文件夹中。例如,input_pictures。
cd $SNPE_ROOT/models/alexnet
python scripts/create_alexnet_raws.py -i scripts/input_pictures \
-o scripts/output \
-m data/ilsvrc_2012_mean.npy
在执行snpe-net-run之前,请确保正确的 raw_list.txt 对应于您的新输出文件夹。
在 Android 目标上运行
选择目标架构
SNPE 为 armeabi-v7a 和 arm64-v8a 架构提供 Android 二进制文件。对于每个体系结构,二进制文件都是使用 libc++ STL 实现使用 clang6.0 编译的。下面显示了选择所需二进制文件的命令。
# architecture: armeabi-v7a - compiler: clang - STL: libc++
export SNPE_TARGET_ARCH=arm-android-clang6.0
export SNPE_TARGET_STL=libc++_shared.so
# architecture: arm64-v8a - compiler: clang - STL: libc++
export SNPE_TARGET_ARCH=aarch64-android-clang6.0
export SNPE_TARGET_STL=libc++_shared.so
为简单起见,本教程将目标二进制文件设置为 arm-android-clang6.0,它使用 libc++_shared.so 作为主机和目标上的命令。
将二进制文件推送到目标
将 SNPE 库和预构建的 snpe-net-run 可执行文件推送到 Android 目标上的 /data/local/tmp/snpeexample。
export SNPE_TARGET_ARCH=arm-android-clang6.0
export SNPE_TARGET_STL=libc++_shared.so
adb shell "mkdir -p /data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/bin"
adb shell "mkdir -p /data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/lib"
adb shell "mkdir -p /data/local/tmp/snpeexample/dsp/lib"
adb push $SNPE_ROOT/lib/$SNPE_TARGET_ARCH/$SNPE_TARGET_STL \
/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/lib
adb push $SNPE_ROOT/lib/$SNPE_TARGET_ARCH/*.so \
/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/lib
adb push $SNPE_ROOT/lib/dsp/*.so \
/data/local/tmp/snpeexample/dsp/lib
adb push $SNPE_ROOT/bin/$SNPE_TARGET_ARCH/snpe-net-run \
/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/bin
设置环境变量
在 adb shell 中设置库路径、路径变量和目标体系结构,以使用 -h 参数运行可执行文件以查看其描述。
adb shell
export SNPE_TARGET_ARCH=arm-android-clang6.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/lib
export PATH=$PATH:/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/bin
snpe-net-run -h
exit
将模型数据推送到 Android 目标
要在您的 Android 目标上执行 AlexNet 分类模型,请按照以下步骤操作:
cd $SNPE_ROOT/models/alexnet
mkdir data/rawfiles && cp data/cropped/*.raw data/rawfiles/
adb shell "mkdir -p /data/local/tmp/alexnet"
adb push data/rawfiles /data/local/tmp /alexnet/cropped
adb push data/target_raw_list.txt /data/local/tmp/alexnet
adb push dlc/bvlc_alexnet.dlc /data/local/tmp/alexnet
rm -rf data/rawfiles
注意:将 AlexNet dlc 文件推送到您的目标可能需要一些时间。
使用 CPU 运行时在 Android 上运行
使用以下命令运行 Android C++ 可执行文件:
adb shell
export SNPE_TARGET_ARCH=arm-android-clang6.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/lib
export PATH=$PATH:/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/bin
cd /data/local/tmp/alexnet
snpe-net-run --container bvlc_alexnet.dlc --input_list target_raw_list.txt
exit
可执行文件将创建结果文件夹:/data/local/tmp/alexnet/output。要拉输出:
adb pull /data/local/tmp/alexnet/output output_android
通过运行 interpret python 脚本检查分类结果。
python3 scripts/show_alexnet_classifications.py -i data/target_raw_list.txt -o output_android/ \
-l data/ilsvrc_2012_labels.txt
输出应如下所示,显示所有图像的分类结果。
Classification results
cropped/trash_bin.raw 0.949346 412 ashcan, trash can, garbage can, wastebin, ash bin,
ash-bin, ashbin, dustbin, trash barrel, trash bin
cropped/plastic_cup.raw 0.749105 647 measuring cup
cropped/chairs.raw 0.365684 831 studio couch, day bed
cropped/handicap_sign.raw 0.101762 919 street sign
cropped/notice_sign.raw 0.722704 458 brass, memorial tablet, plaque
使用 GPU 运行时在 Android 上运行
尝试使用–use_gpu选项在 Android 目标上运行,如下所示。默认情况下,GPU 运行时以 GPU_FLOAT32_16_HYBRID(数学:全浮点和数据存储:半浮点)模式运行。可以使用–gpu_mode选项将模式更改为 GPU_FLOAT16(数学:半浮点数和数据存储:半浮点数)。
adb shell
export SNPE_TARGET_ARCH=arm-android-clang6.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/lib
export PATH=$PATH:/data/local/tmp/snpeexample/$SNPE_TARGET_ARCH/bin
cd /data/local/tmp/alexnet
snpe-net-run --container bvlc_alexnet.dlc --input_list target_raw_list.txt --use_gpu
exit
将输出拉入 output_android_gpu 目录。
adb pull /data/local/tmp/alexnet/output output_android_gpu
同样,我们可以运行解释脚本来查看分类结果。
python3 scripts/show_alexnet_classifications.py -i data/target_raw_list.txt \
-o output_android_gpu/ \
-l data/ilsvrc_2012_labels.txt
输出应如下所示,显示所有图像的分类结果。
Classification results
cropped/trash_bin.raw 0.948242 412 ashcan, trash can, garbage can, wastebin, ash bin,
ash-bin, ashbin, dustbin, trash barrel, trash bin
cropped/plastic_cup.raw 0.747559 647 measuring cup
cropped/chairs.raw 0.363770 831 studio couch, day bed
cropped/notice_sign.raw 0.720215 458 brass, memorial tablet, plaque
查看分类结果的输出。
分类结果与使用 CPU 运行时的运行相同,但由于浮点精度差异,与输出标签相关的概率存在差异。