Skip to content

Dragonboard Hexagon DSP

Srini edited this page Mar 6, 2020 · 53 revisions

This page will help you setting up your environment to execute code on the Hexagon DSP on apq8016 (db410c), apq8096 (db820c), and qcs404. On qcs404 it's possible to use the cDSP in addition to the aDSP.

Index

Setup

  • Linux based host machine.
  • DragonBoard 410c or 820c running debian. You can get 96boards images here. The installation instructions are pretty straightforward and can be found here.
  • The Linaro Toolchain.
  • The Hexagon SDK.
  • A Linux kernel tree with support for the adsprpc driver.
  • For db410c, you need the apq8016 modem firmware files r1036.1 to get FastRPC support. These files are released through the Qualcomm Developer Network. You'll need to replace the files /lib/firmware/modem.* in your stock rootfs with the r1036.1 ones.
  • For db820c, the public archive linux-board-support-package-r01700.1.zip contains the needed adsp firwmares.

For the purpose of this documentation, let's say your working directory is ~/dev.

Linaro toolchain

To compile the Linux kernel and also the Hexagon sample applications you'll need the aarch64 Linaro toolchain. Download the archive named as gcc-linaro-x.y.z-201Y.MM-x86_64_aarch64-linux-gnu.tar.xz and decompress it into your ~/dev folder.

Eventually you may add the bin sub-folder of the Linaro toolchain to your $PATH environment variable. This is needed to cross-compile libadsprpc.so if you want to build it from your host.

Hexagon SDK

Install the SDK

You need to install the Hexagon SDK to compile the sample application. The SDK can be downloaded here. You can choose version 3.4.1.

Once installed, you need a couple of extra steps to be able to compile the example.

Add the Linaro toolchain to the SDK

In order to compile the sample applications using the standard Linux target you must add the Linaro toolchain to the Hexagon SDK.

This is usually done by copying the Linaro toolchain into the SDK tools sub-folder. Creating a symbolic link to the toolchain folder we've already setup is actually enough. If this symbolic link exist, delete it before.

$ ln -s ~/dev/gcc-linaro-version-date-x86_64_aarch64-linux-gnu /PATH/TO/HEXAGON/SDK/tools/linaro

Setup the IDL compiler (qaic)

This step will select a qaic executable that fits your distribution.

$ cd /PATH/TO/HEXAGON/SDK/tools/qaic
$ make

This creates the qaic executable in "bin" sub-folder.

Linux Kernel

Getting the kernel source tree

A Linux kernel tree with FastRPC support is available here and can be cloned with the following commands:

$ cd ~/dev
$ git clone -b integration-linux-qcomlt https://git.linaro.org/landing-teams/working/qualcomm/kernel.git

Compiling the kernel

$ export ARCH=arm64
$ export CROSS_COMPILE=~/dev/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
$ cd ~/dev/kernel
$ make defconfig

Then use your favorite kernel configuration habit to enable a few more options:

CONFIG_QCOM_FASTRPC=y (Device Drivers -> Misc devices)

For db820c you must enable the Qualcomm Asynchronous Packet Router

CONFIG_QCOM_APR=y (Device Drivers -> SOC (System On Chip) specific Drivers -> Qualcomm SoC drivers)

Then built it:

$ make

Installing modules

You have to copy the modules to the DragonBoard root filesystem. Depending on how you're booting your device it might be easy or a bit more complex.

If the rootfs is located on the internal eMMC you have to install the modules somewhere on the host hard drive:

$ make INSTALL_MOD_PATH=~/dev modules_install 

The developer image allows you to remotely connect to the DragonBoard through ssh (using the credentials linaro/linaro) and you can copy the modules to the DragonBoard using scp.

First you need to delete the source and build symlinks in the modules folder (otherwise scp will follow them and copy the build and source trees to the DragonBoard).

$ find ~/dev/lib/modules -type l -print -delete

It's now safe to copy the entire folder to the board rootfs:

$ scp -r ~/dev/lib/modules linaro@DB_IP_ADDR:~/dev

Then ssh to the DragonBoard and move the modules folder:

$ ssh linaro@DB_IP_ADDR
DB $ sudo mv ~/dev/modules/* /lib/modules

It is easier if you boot directly from the SD. Simply mount the SD card on your host system and install the modules directly to the SD card by passing the rootfs mount point.

$ make INSTALL_MOD_PATH=/PATH/TO/MOUNTED/ROOTFS/ modules_install

Building the boot image

Now you need to build a boot image for the db410c and boot it using fastboot. You'll need a few more tools to build the boot image.

Download initrd image

$ cd ~/dev
$ wget https://snapshots.linaro.org/96boards/dragonboard410c/linaro/debian/latest/initrd.img-4.14.0-qcomlt-arm64

Download skales tools (dtbTool and mkbootimg)

$ git clone git://codeaurora.org/quic/kernel/skales

Compile the DTS

$ ~/dev/skales/dtbTool -o ~/images/dt.img -s 4096 ~/dev/kernel/arch/arm64/boot/dts/qcom/

Specify the kernel command line

$ export CMDLINE="root=/dev/disk/by-partlabel/rootfs rw rootwait console=tty0 console=ttyMSM0,115200n8"

In this example, the rootfs is located on the DragonBoard eMMC. If your rootfs is located on the SD card you must specify 'root=/dev/mmcblk1p9' in the CMDLINE variable above.

Make the boot.img

$ ~/dev/skales/mkbootimg --kernel ~/dev/kernel/arch/arm64/boot/Image \
               --ramdisk ~/dev/initrd.img-4.14.0-qcomlt-arm64 \
               --output ~/dev/boot.img \
               --dt ~dev/dt.img \
               --pagesize 4096 \
               --base 0x80000000 \
               --cmdline "${CMDLINE}";

Boot it!

Now you have a nice boot image. Boot the DragonBoard in fastboot mode by pressing the vol- button while powering it up. Boot the board with the following command:

$ fastboot boot ~/dev/boot.img

Build userspace libraries and daemons

This userspace library is used to communicate with the adsprpc driver. It can be cross-compiled on your host machine or directly on the DragonBoard.

You'll also need to copy it onto the Hexagon SDK so the sample applications use it and not the default stubbed libraries provided by the SDK.

First git clone the repo:

$ cd ~/dev
$ git clone https://git.linaro.org/landing-teams/working/qualcomm/libadsprpc.git
$ cd libadsprpc

Use the autogen.sh script to generate the configure script. You need to install some programs first:

$ sudo apt-get install libtool m4 automake gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
$ ./autogen.sh

Execute the configure script. Use the --host option if you are cross-compiling (you need the Linaro toolchain in your $PATH):

$ ./configure --host=aarch64-linux-gnu

Then build and install:

$ make
$ sudo make install

If you cross-compile from your host machine you obviously need to copy the binaries onto your target device. Once built they are located here:

src/lib/.libs/libadsprpc.so*
src/lib/.libs/libcdsprpc.so*
src/utils/.libs/adsprpcd
src/utils/.libs/cdsprpcd

Copy libraries to Hexagon SDK

It's time to hack around with the Hexagon SDK. Copy the library binaries to the SDK for the UbuntuARM target:

$ cp src/lib/.libs/libadsprpc.so* $HEXAGON_SDK_ROOT/libs/common/remote/ship/UbuntuARM_Debug_aarch64/
$ cp src/lib/.libs/libcdsprpc.so* $HEXAGON_SDK_ROOT/libs/common/remote/ship/UbuntuARM_Debug_aarch64/

Setup userspace tools on the DragonBoard

Install using apt

The easiest way is to install them through apt. If you're running a Debian image obtained from the 96boards website as described above, simply install them on the DragonBoard using apt:

$ sudo apt update
$ sudo apt install rmtfs qrtr libqrtr1

With these packages come the systemd startup script that configure the IPC router and start the remote filesystem service. You can skip the next chapter and Boot the remote DSP.

Compile from sources

Build and install qrtr (Qualcomm IPC Router)

$ cd ~
$ git clone https://github.com/andersson/qrtr.git
$ cd qrtr
$ make
$ sudo make install

Build and install qmic (QMI IDL compiler)

$ cd ~
$ git clone https://github.com/andersson/qmic.git
$ cd qmic
$ make
$ sudo make install

Build and install rmtfs (Qualcomm Remote Filesystem Service)

$ cd ~
$ git clone https://github.com/andersson/rmtfs.git
$ cd rmtfs
$ make
$ sudo make install

If needed, create the files provided to the modem by rmtfs:

$ dd if=/dev/zero of=/boot/modem_fs1 bs=1572864 count=1
$ dd if=/dev/zero of=/boot/modem_fs2 bs=1572864 count=1
$ dd if=/dev/zero of=/boot/modem_fsc bs=1024 count=1
$ dd if=/dev/zero of=/boot/modem_fsg bs=1572864 count=1

If the above files were not already present you'll need to reboot the board so the modem is correctly initialized.

Finally configure the IPC router and Remote FS

You'll have to do so after each boot of your Dragonboard. The Debian packages of these tools already take care of that for your and are started through systemd scripts.

$ sudo qrtr-cfg 1
$ sudo qrtr-ns
$ sudo rmtfs &

Test your setup

Boot the remote DSP

Start the remote DSP through its remoteproc device to load DSP firmware.

On db410c:

$ sudo sh -c 'echo start > /sys/devices/platform/soc/4080000.hexagon/remoteproc/remoteproc0/state'

On db820c:

$ sudo sh -c 'echo start > /sys/devices/platform/adsp-pil/remoteproc/remoteproc0/state'

On qcs404 you can choose to boot the aDSP and/or the cDSP.

$ sudo sh -c 'echo start > /sys/devices/platform/remoteproc-adsp/remoteproc/remoteproc0/state'
$ sudo sh -c 'echo start > /sys/devices/platform/remoteproc-cdsp/remoteproc/remoteproc1/state'

On some systems, the remoteproc device index might not be 0. Adapt the above line consequently (i.e .../remoteproc/remoteproc1/state).

Start the daemons (db820c and qcs404)

On db820c and qcs404 you need to execute the daemon responsible for loading the hexagon code to the DSP.

$ sudo adsprpcd &

If you booted the cDSP on qsc404, launch the cDSP daemon

$ sudo cdsprpcd &

Run getserial

You can test that everything works correctly by using the getserial tool from the Hexagon SDK. This tool queries the remote DSP serial number and prints it.

Please note that getserial only runs on aDSP so it won't work if you boot the cDSP on qcs404.

Copy the getserial executable to the DragonBoard:

$ scp /PATH/TO/HEXAGON/SDK/tools/elfsigner/getserial/UbuntuARM_Release_aarch64/getserial linaro@DB_IP_ADDR:~/dev

And execute it:

$ ssh linaro@DB_IP_ADDR sudo /home/linaro/dev/getserial

If everything works correctly you should get something like:

####################Serial number (see below)###########################

Serial Num : 0xe2afec0

####################Serial number (see above)###########################

If it's not the case, please check:

  • Your kernel has support for the fastrpc driver (CONFIG_QCOM_FASTRPC=y)
  • For db820c, modem firmware files r1036.1 are installed in /lib/firmware on the DragonBoard

Building matrix_multi sample app (On the host)

Setup a SDK client command line environment:

$ source /PATH/TO/HEXAGON/SDK/setup_sdk_env.source

Get the matrix multiplication demo source code

$ cd ~/dev
$ git clone https://git.linaro.org/people/nicolas.dechesne/te/matrix_multi.git

Build matrix_multi demo

$ cd matrix_multi
$ make V=hexagon_Debug_dynamic_toolv82_v60 tree
$ make V=UbuntuARM_Debug_aarch64 tree

If you wish to run the application on the qcs404 cDSP, use the CDSP_FLAG variable for the Linux target:

$ make V=UbuntuARM_Debug_aarch64 CDSP_FLAG=1 tree

The resulting binaries will be in the following folders:

DSP: hexagon_Debug_dynamic_toolv82_v60/ship
APPS: UbuntuARM_Debug_aarch64/ship

Copy the content to the DragonBoard:

$ ssh linaro@DB_IP_ADDR mkdir /home/linaro/apps /home/linaro/dsp
$ scp matrix_multi/UbuntuARM_Debug_aarch64/ship/* linaro@DB_IP_ADDR:~/apps

For db410c, copy the DSP library:

$ scp matrix_multi/hexagon_Debug_dynamic_toolv82_v60/ship/*.so linaro@DB_IP_ADDR:~/dsp

For db820c, you first need to sign the DSP library and copy it:

$ python $HEXAGON_SDK_ROOT/tools/elfsigner/elfsigner.py -i ./hexagon_Debug_dynamic_toolv82_v60/ship/libmatrix_multi_skel.so
$ scp output/*.so linaro@DB_IP_ADDR:~/dsp

ssh to the DragonBoard and set the library path to the apps and dsp folders:

$ sudo su
$ export ADSP_LIBRARY_PATH=/home/linaro/dsp
$ export LD_LIBRARY_PATH=/home/linaro/apps

Now you're ready to run the example:

$ cd /home/linaro/apps
$ ./matrix_multi 0 10

The matrix_multi example calculates the resulting matrix of multiplying two size x size matrices A and B, where A is a transposing matrix with a single 1 in each column and row and B has random values between 0..size-1 where size is the second parameter passed to the application. Pass 0 as first parameter to execute the multiplication on the remote DSP. Pass 1 to execute it on the application processor.

Building calculator sample app (On the host)

Setup a SDK client command line environment:

$ source /PATH/TO/HEXAGON/SDK/setup_sdk_env.source

Build calculator demo

$ cd /PATH/TO/HEXAGON/SDK/examples/common/calculator
$ make V=hexagon_Debug_dynamic_toolv81_v65 tree
$ make V=UbuntuARM_Debug_aarch64 tree

If you wish to run the application on the qcs404 cDSP, use the CDSP_FLAG variable for the Linux target:

$ make V=hexagon_Debug_dynamic_toolv81_v65 CDSP_FLAG=1 tree
$ make V=UbuntuARM_Debug_aarch64 CDSP_FLAG=1 tree

The resulting binaries will be in the following folders:

DSP: hexagon_Debug_dynamic_toolv81_v65/ship
APPS: UbuntuARM_Debug_aarch64/ship

Sign calculator dsp library

elfsigner tool takes SoC Serial number as input to generate a testsig, you can get serial number by using getserial

$ python tools/elfsigner/elfsigner.py -t $SERIAL_NUMBER
$ python ./tools/elfsigner/elfsigner.py -i ./examples/common/calculator/ hexagon_Debug_dynamic_toolv81_v65/ship/libcalculator_skel.so

Copy the content to the DragonBoard:

$ ssh linaro@DB_IP_ADDR mkdir /home/linaro/apps /home/linaro/dsp
$ scp matrix_multi/UbuntuARM_Debug_aarch64/ship/* linaro@DB_IP_ADDR:~/apps

ssh to the DragonBoard and set the library path to the apps and dsp folders:

$ sudo su
$ export ADSP_LIBRARY_PATH=/home/linaro/dsp
$ export LD_LIBRARY_PATH=/home/linaro/apps

Now you're ready to run the example:

$ cd /home/linaro/apps
$ ./calculator 0 10

Building TensorFlow Trained model with Hexagon NN app (On the host)

Build and run TensorFlow Trained model with Hexagon NN to run on DB845c CDSP.

Note: These Steps are not replacement of original guides released as part of Hexagon SDK. These are the steps that I followed to be able to test DB845c CDSP with Hexagon nn.

I have used Hexagon SDK 3.4.2 which has Hexagon NN released as part of SDK package

Step 1: Compile Hexagon NN DSP library:

$ source $HEXAGON_SDK_ROOT/setup_sdk_env.source
$ cd $HEXAGON_SDK_ROOT/libs/hexagon_nn/2.5/
$ make tree VERBOSE=1 CDSP_FLAG=1 V=hexagon_Release_dynamic_toolv82_v65 V65=1

more info on Hexagon nn library at: https://usermanual.wiki/Document/80VB419110HexagonNNLibraryUserGuide.730950702.pdf

Step 2: Download the Tensorflow imagenet Frozen protobuf.

$ curl http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz -o /tmp/inceptionv3.tgz
$ tar xzf /tmp/inceptionv3.tgz -C /tmp/

Then download and Install bazel and build tensorflow More instructions at https://docs.bazel.build/versions/master/install-ubuntu.html I have used Bazel 0.21.0 and TensorFlow 1.13.2 release version.

$ wget https://github.com/bazelbuild/bazel/releases/download/0.21.0/bazel-0.21.0-installer-linux-x86_64.sh
$ wget https://github.com/tensorflow/tensorflow/archive/v1.13.2.tar.gz
$ chmod +x bazel-0.21.0-installer-linux-x86_64.sh
$ sh ./bazel-0.21.0-installer-linux-x86_64.sh --user
$ tar -zxvf v1.13.2.tar.gz 
$ cd tensorflow-1.13.2
$ ./configure

Step 3: Build transform_graph tool in tensorflow About tranform_graph https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#using-the-graph-transform-tool

$ bazel build tensorflow/tools/graph_transforms:transform_graph

Quantize protobuf using Graph Transform Tool

$ bazel-bin/tensorflow/tools/graph_transforms/transform_graph  --in_graph=/tmp/classify_image_graph_def.pb --out_graph=/tmp/inception_v3_quantized.pb  --inputs="Mul" --outputs='softmax'  --transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,299,299,3") remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes fold_constants strip_unused_nodes sort_by_execution_order'

Then convert the quantized protobuf into a C file to be used by graph_app:

$ cd ../../
$ virtualenv -p python2 env2
$ source env2/bin/activate
$ pip install -r environments/req2.txt
$ cd -
$ python ../../scripts/tensorflow_to_hexagon_nn.py /tmp/inception_v3_quantized.pb ./inceptionv3_v1.yaml > iv3.c

Step 4: Build hexgon nn graph_app and define graph via graph_init

$ cp iv3.c $HEXAGON_NN
$ make -C $HEXAGON_NN tree  V=UbuntuARM_Debug_aarch64 CDSP_FLAG=1 V65=1 GRAPHINIT="iv3.c"

Step 5: Generate Testsig and sign ibhexagon_nn_skel.so with it.

elfsigner tool takes SoC Serial number as input to generate a testsig, you can get serial number by using getserial

$ python tools/elfsigner/elfsigner.py -t $SERIAL_NUMBER
$ python ./tools/elfsigner/elfsigner.py -i ./libs/hexagon_nn/2.5/hexagon_Release_dynamic_toolv82_v65/ship/libhexagon_nn_skel.so

Step 6: Push files to target

$ scp hexagon_nn/2.5/UbuntuARM_Debug_aarch64/ship/* linaro@DB_IP_ADDR:~/apps
$ scp hexagon_nn/2.5/test/panda_299x299.dat linaro@DB_IP_ADDR:~/apps
$ scp output/testsig*.so linaro@DB_IP_ADDR:~/dsp
$ scp output/libhexagon_nn_skel.so linaro@DB_IP_ADDR:~/dsp

More Info to create new test images:

$ python ../../../examples/hexagon_nn/scripts/img_to_dat.py --root iv3 --input $YOUR_IMAGE_DIRECTORY --size 299 --mean_r 128 --mean_g 128 --mean_b 128 --div_scalar 128 --mul_scalar 128 --byte
#.dat files will be generated in $YOUR_IMAGE_DIRECTORY_b folder
$ scp $YOUR_IMAGE_DIRECTORY_b/*.dat linaro@DB_IP_ADDR:~/apps

Step 7: Run on DB845c

#Build new fastrpc lib
$ git clone -b  automake https://git.linaro.org/landing-teams/working/qualcomm/fastrpc.git
$ cd fastrpc
$ ./gitcompile
$ make install
# start cdsp if its not already started.
$ echo start >/sys/devices/platform/remoteproc-cdsp/remoteproc/remoteproc1/state
#Run qrtr services if they have not already started
$ qrtr-cfg 1 && qrtr-ns && rmtfs -v &
#Mount dsp partition 
$ mount /dev/disk/by-partlabel/dsp_a /dsp
#export libcdsp path.
$ export ADSP_LIBRARY_PATH=/dsp/cdsp
#copy hexagon dsp library to library path at ADSP_LIBRARY_PATH
$ cp ~/dsp/*.so /dsp/cdsp/
#Start cdsp deamon
$ cdsprpcd&
#run the graph.
$ ~/apps/graph_app --input_to_float 1 --iters 1 ~/apps/panda_299x299.dat
#You should see some thing like this:
Using <./panda_299x299.dat>
filesize=268203 elementsize=1 height=299 width=299 depth=3
Run!
output size=4032
Rank,Softmax,index,string
0,0.954667,169,giant panda
1,0.001520,7,lesser panda
2,0.000926,61,brown bear
3,0.000926,103,ice bear
4,0.000396,82,French bulldog
AppReported: 64300764

Thats it you are done testing tensorflow imagenet model graph using hexagon nn.

C++ HexagonNN Example:

This example runs HexagonNN with ImageNet graph on DB845c Dragonboard with live categorizatio from camera input aswell as input images.

https://git.linaro.org/people/srinivas.kandagatla/ImagenetCv.git/

Running Snapdragon Neural Processing Engine on DB845c

Download and Setup a SNPE environment (on Host):

Download from https://developer.qualcomm.com/software/qualcomm-neural-processing-sdk and follow Instructions in https://developer.qualcomm.com/docs/snpe/index.html to setup

Download Tensorflow Inception Model (on Host):

Follow below instruction to download Tensorflow Inception model and convert to dlc format. You would need to install tensorflow before you do this as per step 1.

https://developer.qualcomm.com/docs/snpe/model_conv_tensorflow.html

Copy SNPE libraries and model dlc to target :

$ ssh linaro@DB_IP_ADDR mkdir /home/linaro/snpe
$ ssh linaro@DB_IP_ADDR mkdir /home/linaro/snpe/dsp /home/linaro/snpe/lib /home/linaro/snpe/bin
$ ssh linaro@DB_IP_ADDR mkdir /home/linaro/inception_v3

$ scp snpe-1.30.0.480/lib/aarch64-linux-gcc4.9/* linaro@DB_IP_ADDR:~/snpe/lib/
$ scp snpe-1.30.0.480/bin/aarch64-linux-gcc4.9/* linaro@DB_IP_ADDR:~/snpe/bin/
$ scp snpe-1.30.0.480/lib/dsp/*.so linaro@DB_IP_ADDR:~/snpe/dsp/

$ scp -r snpe-1.30.0.480/models/inception_v3/data/cropped linaro@DB_IP_ADDR:~/inception_v3/
$ scp snpe-1.30.0.480/models/inception_v3/data/target_raw_list.txt linaro@DB_IP_ADDR:~/inception_v3/
$ scp snpe-1.30.0.480/inception_v3.dlc  linaro@DB_IP_ADDR:~/inception_v3/

Setup DB845c and run SNPE sample (on Target):

root@linaro-alip:~# mount /dev/disk/by-partlabel/dsp_a /dsp
root@linaro-alip:~# cp /home/linaro/snpe/dsp/* /dsp/cdsp/
root@linaro-alip:~# export ADSP_LIBRARY_PATH=/dsp/cdsp
root@linaro-alip:~# cdsprpcd&
root@linaro-alip:~# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linaro/snpe/lib
root@linaro-alip:~# export PATH=$PATH:/home/linaro/snpe/bin

Run on CDSP

root@linaro-alip:~# cd /home/linaro/inception_v3
root@linaro-alip:~# LD_PRELOAD=/usr/local/lib/libcdsprpc.so snpe-net-run --use_dsp --container ./inception_v3.dlc  --input_list target_raw_list.txt 

hello snpe-net-run - fastrpc_apps_user.c:1580: Searching for fastrpc_shell_3 ...hello snpe-net-run - fastrpc_apps_user.c:1688: Successfully created user PD on domain 3 (attrs 0x0)-----------------------------------------------------------
Model String: N/A
SNPE v1.30.0.480
-------------------------------------------------------------------------------
Processing DNN input(s):
cropped/notice_sign.raw
Processing DNN input(s):
cropped/plastic_cup.raw
Processing DNN input(s):
cropped/chairs.raw
Processing DNN input(s):
cropped/handicap_sign.raw
Processing DNN input(s):
cropped/trash_bin.raw

##Check results

root@linaro-alip:~# python /home/linaro/snpe-1.30.0.480/models/inception_v3/scripts/show_inceptionv3_classifications.py -i /home/linaro/snpe-1.30.0.480/models/inception_v3/data/target_raw_list.txt -o /home/linaro/inception_v3/output/ -l /home/linaro/snpe-1.30.0.480/models/inception_v3/tensorflow/imagenet_slim_labels.txt
Classification results
cropped/notice_sign.raw   0.144984 459 brass
cropped/plastic_cup.raw   0.980529 648 measuring cup
cropped/chairs.raw        0.311908 832 studio couch
cropped/handicap_sign.raw 0.382252 920 street sign
cropped/trash_bin.raw     0.746154 413 ashcan

Kernel patches required for SNPE

All the patches except below hack should be available in https://git.linaro.org/landing-teams/working/qualcomm/kernel.git/log/?h=integration-linux-qcomlt

Use below hack to make SNPE happy.

diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
index 05933c065732..91d996b1ba86 100644
--- a/arch/arm64/kernel/cpuinfo.c
+++ b/arch/arm64/kernel/cpuinfo.c
@@ -177,6 +177,7 @@ static int c_show(struct seq_file *m, void *v)
                seq_printf(m, "CPU variant\t: 0x%x\n", MIDR_VARIANT(midr));
                seq_printf(m, "CPU part\t: 0x%03x\n", MIDR_PARTNUM(midr));
                seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr));
+               seq_printf(m, "Hardware\t: Qualcomm Technologies, Inc SDA845\n");
        }
 
        return 0;

Thats it you are done testing Inception v3 model graph using SNPE.

C++ SNPE Example:

This example runs SNPE with MobileNet SSD graph on DB845c Dragonboard with live boxing from camera input

https://git.linaro.org/people/srinivas.kandagatla/SNPEMobileNetCv.git/

Clone this wiki locally