C++ Demo

1. 下载最新版本预测库

预测库下载界面位于Paddle-Lite官方预编译库,可根据需求选择合适版本。

Android-ARMv8架构为例,可以下载以下版本:

ARM Versionbuild_extraarm_stltarget下载
armv8OFFc++_statictiny_publishrelease/v2.3

解压后内容如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/1inference_lib.pngimage

2. 转化模型

PaddlePaddle的原生模型需要经过opt工具转化为Paddle-Lite可以支持的naive_buffer格式。

mobilenet_v1模型为例:

(1)下载mobilenet_v1模型后解压:

  1. wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz
  2. tar zxf mobilenet_v1.tar.gz

如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/3inference_model.pngimage

(2)下载opt工具。放入同一文件夹,终端输入命令转化模型:

  1. wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.3.0/opt
  2. chmod +x opt
  3. ./opt --model_dir=./mobilenet_v1 --optimize_out_type=naive_buffer --optimize_out=./mobilenet_v1_opt

结果如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/2opt_model.pngimage

3. 编写预测程序

准备好预测库和模型,我们便可以编写程序来执行预测。我们提供涵盖图像分类、目标检测等多种应用场景的C++示例demo可供参考,位于inference_lite_lib.android.armv8/demo/cxx

以mobile net_v1预测为例:mobile_light为mobilenet_v1预测示例,可以直接调用。

示例如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/4light_demo.pngimage

4. 编译

预测程序需要编译为Android可执行文件。

以mobilenet_v1模型为例,C++示例位于inference_lite_lib.android.armv8/demo/mobile_light

  1. cd inference_lite_lib.android.armv8/demo/mobile_light

编译demo

  1. make

结果如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/5compile_demo.pngimage

5. 执行预测

通过adb工具将可执行文件推送到手机上执行预测

(1)保证电脑已经安装adb工具,手机以”USB调试”、”文件传输模式”连接到电脑。

  1. adb deveices #查看adb设备是否已被识别

连接如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/6adb_devices.pngimage

(2)准备预测库、模型和预测文件

1、将模型、动态库和预测文件放入同一文件夹:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/7files.pngimage

注意:动态预测库文件位于: inference_lite_lib.android.armv8/cxx/liblibpaddle_light_api_shared.so

2、文件推送到手机:

  1. chmod +x mobilenetv1_light_api
  2. adb push mobilenet_v1_opt.nb /data/local/tmp
  3. adb push libpaddle_light_api_shared.so /data/local/tmp
  4. adb push mobilenetv1_light_api /data/local/tmp

效果如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/8push_file.pngimage

(3)执行预测

  1. adb shell 'cd /data/local/tmp && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp && mobilenetv1_light_api ./mobilenet_v1_opt.nb'

结果如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/9result.pngimage

上图的Output为mobilenet_v1模型在全1输入时,得到的预测输出。至此,Paddle-Lite的C++ demo执行完毕。

注:如何在代码中使用 API

C++代码调用Paddle-Lite执行预测库仅需以下五步:

(1)引用头文件和命名空间

  1. #include "paddle_api.h"
  2. using namespace paddle::lite_api;

(2)指定模型文件,创建Predictor

  1. // 1. Set MobileConfig, model_file_path is
  2. // the path to model model file.
  3. MobileConfig config;
  4. config.set_model_from_file(model_file_path);
  5. // 2. Create PaddlePredictor by MobileConfig
  6. std::shared_ptr<PaddlePredictor> predictor =
  7. CreatePaddlePredictor<MobileConfig>(config);

(3)设置模型输入 (下面以全一输入为例)

  1. std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0)));
  2. input_tensor->Resize({1, 3, 224, 224});
  3. auto* data = input_tensor->mutable_data<float>();
  4. for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) {
  5. data[i] = 1;
  6. }

(4)执行预测

  1. predictor->Run();

(5)获得预测结果

  1. std::unique_ptr<const Tensor> output_tensor(
  2. std::move(predictor->GetOutput(0)));
  3. // 转化为数据
  4. auto output_data=output_tensor->data<float>();

其他cxx_demo的编译与预期结果

Light API Demo

  1. cd ../mobile_light
  2. make
  3. adb push mobilenetv1_light_api /data/local/tmp/
  4. adb shell chmod +x /data/local/tmp/mobilenetv1_light_api
  5. adb shell "/data/local/tmp/mobilenetv1_light_api --model_dir=/data/local/tmp/mobilenet_v1.opt "

图像分类 Demo

  1. cd ../mobile_classify
  2. wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz
  3. tar zxvf mobilenet_v1.tar.gz
  4. make
  5. adb push mobile_classify /data/local/tmp/
  6. adb push test.jpg /data/local/tmp/
  7. adb push labels.txt /data/local/tmp/
  8. adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
  9. adb shell chmod +x /data/local/tmp/mobile_classify
  10. adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1.opt /data/local/tmp/test.jpg /data/local/tmp/labels.txt"

目标检测 Demo

  1. cd ../mobile_detection
  2. wget https://paddle-inference-dist.bj.bcebos.com/mobilenetv1-ssd.tar.gz
  3. tar zxvf mobilenetv1-ssd.tar.gz
  4. make
  5. adb push mobile_detection /data/local/tmp/
  6. adb push test.jpg /data/local/tmp/
  7. adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
  8. adb shell chmod +x /data/local/tmp/mobile_detection
  9. adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_detection /data/local/tmp/mobilenetv1-ssd /data/local/tmp/test.jpg"
  10. adb pull /data/local/tmp/test_detection_result.jpg ./

light API Demo 运行结果

运行成功后 ,将在控制台输出预测结果的前10个类别的预测概率:

  1. Output dim: 1000
  2. Output[0]: 0.000191
  3. Output[100]: 0.000160
  4. Output[200]: 0.000264
  5. Output[300]: 0.000211
  6. Output[400]: 0.001032
  7. Output[500]: 0.000110
  8. Output[600]: 0.004829
  9. Output[700]: 0.001845
  10. Output[800]: 0.000202
  11. Output[900]: 0.000586

图像分类 Demo 运行结果

运行成功后 ,将在控制台输出预测结果的前5个类别的类型索引、名字和预测概率:

  1. parameter: model_dir, image_path and label_file are necessary
  2. parameter: topk, input_width, input_height, are optional
  3. i: 0, index: 285, name: Egyptian cat, score: 0.482870
  4. i: 1, index: 281, name: tabby, tabby cat, score: 0.471593
  5. i: 2, index: 282, name: tiger cat, score: 0.039779
  6. i: 3, index: 287, name: lynx, catamount, score: 0.002430
  7. i: 4, index: 722, name: ping-pong ball, score: 0.000508

目标检测 Demo 运行结果

运行成功后 ,将在控制台输出检测目标的类型、预测概率和坐标:

  1. running result:
  2. detection image size: 935, 1241, detect object: person, score: 0.996098, location: x=187, y=43, width=540, height=592
  3. detection image size: 935, 1241, detect object: person, score: 0.935293, location: x=123, y=639, width=579, height=597