骁龙神经处理引擎SDK参考指南(16)

281 篇文章 32 订阅

骁龙神经处理引擎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 运行时的运行相同,但由于浮点精度差异,与输出标签相关的概率存在差异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值