Tensorflow Lite Example

From RidgeRun Developer Wiki




Introduction to Tensorflow Lite

This wiki shows a tutorial of how to build, install and use the Tensorflow Lite API with C++.

Build and install Tensorflow Lite

Download Tensorflow source code:

git clone https://github.com/tensorflow/tensorflow
cd tensorflow/tensorflow/lite/tools/make

For the EdgeTPU example, you need to checkout this TENSORFLOW COMMIT that is compatible with the EdgeTPU library.

Download dependencies:

./download_dependencies.sh

Build:

./build_lib.sh

Copy the static library to the libraries path:

cp gen/linux_x86_64/lib/libtensorflow-lite.a /usr/lib/x86_64-linux-gnu/

Troubleshooting

If the commit of Tensorflow needed to build the EdgeTPU example is d855adfc5a0195788bf5f92c3c7352e638aa1109, you may have the following issue:

/home/lmurillo/work/ridgerun/ai/backends/tensorflow-edgetpu/tensorflow/lite/tools/make/gen/aarch64_armv8-a/lib/libtensorflow-lite.a(densify.o): In function `tflite::ops::builtin::densify::Eval(TfLiteContext*, TfLiteNode*)':
densify.cc:(.text+0x378): undefined reference to `tflite::optimize::sparsity::FormatConverter<signed char>::FormatConverter(std::vector<int, std::allocator<int> > const&, TfLiteSparsity const&)'
densify.cc:(.text+0x384): undefined reference to `tflite::optimize::sparsity::FormatConverter<signed char>::SparseToDense(signed char const*)'
densify.cc:(.text+0x5f0): undefined reference to `tflite::optimize::sparsity::FormatConverter<float>::FormatConverter(std::vector<int, std::allocator<int> > const&, TfLiteSparsity const&)'
densify.cc:(.text+0x5fc): undefined reference to `tflite::optimize::sparsity::FormatConverter<float>::SparseToDense(float const*)'

To solve it apply the following change in your local Tensorflow repository:

diff --git a/tensorflow/lite/tools/make/Makefile b/tensorflow/lite/tools/make/Makefile
index 4219aa5c31..43ded75fd6 100644
--- a/tensorflow/lite/tools/make/Makefile
+++ b/tensorflow/lite/tools/make/Makefile
@@ -110,6 +110,7 @@ $(wildcard tensorflow/lite/kernels/*.cc) \
 $(wildcard tensorflow/lite/kernels/internal/*.cc) \
 $(wildcard tensorflow/lite/kernels/internal/optimized/*.cc) \
 $(wildcard tensorflow/lite/kernels/internal/reference/*.cc) \
+$(wildcard tensorflow/lite/tools/optimize/sparsity/*.cc) \
 $(PROFILER_SRCS) \
 tensorflow/lite/tools/make/downloads/farmhash/src/farmhash.cc \
 tensorflow/lite/tools/make/downloads/fft2d/fftsg.c \

Install absl (Tensorflow dependence)

Download absl source code

git clone https://github.com/abseil/abseil-cpp

Build:

cd abseil-cpp
mkdir build && cd build
cmake .. -DABSL_RUN_TESTS=ON -DABSL_USE_GOOGLETEST_HEAD=ON -DCMAKE_CXX_STANDARD=11
cmake --build . --target all
sudo make install

Example

To run the examples first clone this project:

git clone https://gitlab.com/RidgeRun/tflite-example.git
cd tflite-example

TFlite

Modify the Makefile to add the correct Tensorflow path.

Build the code:

make

Finally run the example:

./tflite_example --tflite_model models/mobilenet_v1_1.0_224.tflite --labels models/labels.txt --image testdata/dog.jpg -v 0

Using the mobilenet_v1_1.0_224.tflite the resutl will be:

0.915627: 209 209:Labrador retriever
0.0428241: 208 208:golden retriever
0.00945397: 183 183:Border terrier
0.00348756: 186 186:Norfolk terrier
0.00233: 187 187:Norwich terrier

Using the mobilenet_v1_1.0_224_quant.tflite the resutl will be:

0.901961: 209 209:Labrador retriever
0.054902: 208 208:golden retriever
0.0117647: 183 183:Border terrier
0.00392157: 244 244:bull mastiff
0.00392157: 201 201:Tibetan terrier, chrysanthemum dog

EdgeTPU

Modify the Makefile to add the correct Tensorflow and EdgeTPU paths.

Build the code:

make

Finally run the example:

./edgetpu_example <model path> <image path>

Using the mobilenet_v2_1.0_224_quant_edgetpu.tflite the resutl will be:

$ ./edgetpu_example
[Image analysis] max value index: 286 value: 0.773438
invoked
average time: 14.174 ms
=====================================
[Image analysis] max value index: 286 value: 0.773438
invoked
average time: 3.287 ms
=====================================
[Image analysis] max value index: 286 value: 0.773438
invoked
average time: 3.766 ms
=====================================
[Image analysis] max value index: 286 value: 0.773438
invoked
average time: 2.851 ms
=====================================
[Image analysis] max value index: 286 value: 0.773438
invoked
average time: 2.846 ms
=====================================

Using the mobilenet_v2_1.0_224_quant.tflite the result will be:

$ ./edgetpu_example ../models/mobilenet_v2_1.0_224_quant.tflite ../testdata/resized_cat.bmp 
[Image analysis] max value index: 286 value: 0.792969
invoked
average time: 143.926 ms
=====================================
[Image analysis] max value index: 286 value: 0.792969
invoked
average time: 142.345 ms
=====================================
[Image analysis] max value index: 286 value: 0.792969
invoked
average time: 142.401 ms
=====================================
[Image analysis] max value index: 286 value: 0.792969
invoked
average time: 142.433 ms
=====================================
[Image analysis] max value index: 286 value: 0.792969
invoked
average time: 142.485 ms
=====================================

The mobilenet_v2_1.0_224_quant.tflite model is not compatible with the TPU, hence the inferences are performed in the CPU.



For direct inquiries, please refer to the contact information available on our Contact page. Alternatively, you may complete and submit the form provided at the same link. We will respond to your request at our earliest opportunity.


Links to RidgeRun Resources and RidgeRun Artificial Intelligence Solutions can be found in the footer below.