summaryrefslogtreecommitdiff
path: root/README
blob: 63a7747284b27197a47f55583c6fb926643fe933 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
Here are few steps required to get Imagenet based on OpenCV working DB845c

######################## On Host #################################

Step 1: Build Hexagon NN DSP library for DB845c CDSP
------------------------------------------------------
## First download (https://developer.qualcomm.com/downloads/hexagon-sdk-v342-linux?referrer=node/6116)
and Install Hexagon SDK 3.4.2 if you have not already done
## Compile Hexagon NN with below commands.

$ 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

This step will generate hexagon_Release_dynamic_toolv82_v65/ship/libhexagon_nn_skel.so
which is a shared library for the CDSP.

Step 2: Generate Testsig and sign libhexagon_nn_skel.so with it.
------------------------------------------------------
##Get serial number from the DB845c console using below command and pass it to elfsigner.py.

root@linaro-alip:/# cat /sys/bus/soc/devices/soc0/serial_number

##elfsigner tool takes SoC Serial number as input to generate a testsig, you can get
##serial number by using getserial or from board sysfs entry as described in above step

$ cd $HEXAGON_SDK_ROOT
$ 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 3: Generate Inception v3 model graph for hexagon.
------------------------------------------------------

Option 1: Download the Tensorflow Inception v3 Frozen graph and covert to hexagon compatible c file.
========
$ 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

## 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:

$ cd $HEXAGON_SDK_ROOT/examples/hexagon_nn/
$ virtualenv -p python2 env2
$ source env2/bin/activate
$ pip install -r environments/req2.txt
$ cd -
$ python  $HEXAGON_SDK_ROOT/examples/hexagon_nn/scripts/tensorflow_to_hexagon_nn.py /tmp/inception_v3_quantized.pb $HEXAGON_SDK_ROOT/examples/hexagon_nn/tutorials/007-tensorflow-to-hexagon-nn/inceptionv3_v1.yaml > iv3.c
$ cp iv3.c  $HEXAGON_SDK_ROOT/libs/hexagon_nn/2.5/

Option 2: download iv3.c file which I generated using above steps.
========
I can share my iv3.c file incase you want to avoid installing tensor flow on your machine.
$ cp iv3.c  $HEXAGON_SDK_ROOT/libs/hexagon_nn/2.5/

Step 4: Compile new fastrpc library
------------------------------------------------------

$ git clone -b  automake https://git.linaro.org/landing-teams/working/qualcomm/fastrpc.git
$ cd fastrpc
$ ./autogen.sh
$ ./configure --host=aarch64-linux-gnu
$ make
$ cp src/.libs/libadsprpc.so* $HEXAGON_SDK_ROOT/libs/common/remote/ship/UbuntuARM_Debug_aarch64/
$ cp src/.libs/libcdsprpc.so* $HEXAGON_SDK_ROOT/libs/common/remote/ship/UbuntuARM_Debug_aarch64

Step 5: Compile hexagon-nn shared userspace library.
------------------------------------------------------

## Patch Hexagon NN with patch to compile as shared library for userspace.
$ cd $HEXAGON_SDK_ROOT/libs/hexagon_nn/2.5/
$ wget http://people.linaro.org/~srinivas.kandagatla/hexagon_nn_3.4.2_shared_lib.patch
$ patch -p1 < hexagon_nn_3.4.2_shared_lib.patch
$ make tree  V=UbuntuARM_Debug_aarch64 CDSP_FLAG=1 V65=1 GRAPHINIT="iv3.c"


Step 6: Push files to target
------------------------------------------------------
$ ssh linaro@DB_IP_ADDR mkdir /home/linaro/apps /home/linaro/dsp

$ scp $HEXAGON_SDK_ROOT/output/testsig*.so linaro@DB_IP_ADDR:~/dsp/
$ scp $HEXAGON_SDK_ROOT/output/libhexagon_nn_skel.so linaro@DB_IP_ADDR:~/dsp/

$ scp $HEXAGON_SDK_ROOT/libs/hexagon_nn/2.5/UbuntuARM_Debug_aarch64/ship/libhexagon_nn.so linaro@DB_IP_ADDR:~/apps/
$ scp $FASTRPC_LIB_PATH/src/.libs/libcdsp* linaro@DB_IP_ADDR:~/apps/
$ scp $FASTRPC_LIB_PATH/src/.libs/libadsp* linaro@DB_IP_ADDR:~/apps/
$ scp $FASTRPC_LIB_PATH/src/.libs/*rpcd linaro@DB_IP_ADDR:~/apps/


######################## on TARGET DB845c ###############################

Step 1: Install new fastrpc lib on DB845c
------------------------------------------------------
## For now remove any old adsprpc libraries. new releases should not need this, but for now lets do it.
$ rm /usr/local/libadsp* /usr/local/libcdsp* /usr/local/bin/cdsprpcd /usr/local/bin/adsprpcd
$ cp /home/linaro/apps/libcdsp* /usr/local/lib/
$ cp /home/linaro/apps/libcdsp* /usr/local/lib/
$ cp /home/linaro/apps/*rpcd /usr/local/bin

Step 2: Copy dsp libraries to correct place and start cdsprpcd deamon
------------------------------------------------------
$ mkdir /dsp
$ mount /dev/disk/by-partlabel/dsp_a /dsp
$ cp /home/linaro/dsp/* /dsp/cdsp/
$ export ADSP_LIBRARY_PATH=/dsp/cdsp
$ cdsprpcd&

Step 3: Install OpenCV on the Target
------------------------------------------------------
##Its possible to optimize opencv by enabling neon but for now lets ignore this!

$ git clone https://github.com/opencv/opencv.git
$ cd ~/opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make -j8
$ sudo make install

Or

$ sudo apt-get install libopencv-dev python3-opencv


Step 4: Build OpenCV Imagenet application and run
------------------------------------------------------
## To Build ##
$ git clone https://git.linaro.org/people/srinivas.kandagatla/ImagenetCv.git
$ cd ImagenetCv
$ cmake .
$ make
$ ./ImagenetCv

Same instructions apply to images branch aswell.
This should show up a live video with Image Classifications.