Paddle-Lite 端侧 C++ Demo 完全指南:基于 adb 的 Android 模型验证与部署流程
【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite
本篇技术指南基于 Paddle-Lite 仓库 lite/demo/cxx/README.md 编写,完整讲解如何通过 shell 端(adb)在 Android 手机上编译、运行 Paddle-Lite 官方 C++ Demo,快速验证模型在端侧的正确性与性能。读完本文,你将掌握轻量级 API(Light API)与全量 API(Full API)两种预测方式的选型与调用、mobilenetv1 分类、SSD/YOLOv3 目标检测、人脸口罩检测、含 CV 预处理库单测共 6 类官方 Demo 的完整落地流程,并能结合仓库源码理解其底层实现原理,为后续在 Android App 中正式部署模型铺平道路。
1. 概述与前置准备
这些 C++ Demo 通过 shell 端(即电脑终端 + adb)在安卓手机上直接执行,核心目的是快速验证模型的正确性:在手机端跑通模型、确认输出符合预期之后,再在 Android App 中调用 Paddle-Lite 完成正式部署。这种"先命令行验证、后 App 集成"的方式可以极大缩短端侧调试周期,避免在 App 工程中反复折腾。
运行这些 Demo 需要准备两样东西:
- 一台可以编译 Paddle-Lite 的电脑:具体环境配置可参考 docs/source_compile/compile_env.rst,推荐使用 Docker 环境,可避免本机依赖污染。
- 一台 armv7 或 armv8 架构的安卓手机:安装好 adb,并确保电脑和手机可以通过 adb 正常连接(
adb devices能看到设备)。
Paddle-Lite 预测库的获取有两种途径,任选其一:
- 自行编译:参考 docs/source_compile/linux_x86_compile_android.rst 编译 Android 版本预测库;
- 直接下载:从 Paddle-Lite release 界面下载已经编译好的 release 库文件包,并参考 docs/quick_start/release_lib.md 了解其目录结构与使用方式。
编译好的 release 包(如inference_lite_lib.android.armv8)内部包含demo/cxx目录,与仓库 lite/demo/cxx 下的结构一致,官方 Demo 源码、Makefile 均已内置,可直接进入对应目录编译。
下文涉及的 6 个 Demo 为:轻量 API 分类 Demo、全量 API 分类 Demo、物体分类 Demo、SSD 目标检测 Demo、YOLOv3 目标检测 Demo、人脸识别与口罩佩戴判断 Demo,以及含 CV 预处理库的模型单测 Demo。
2. 编译并运行轻量级 API(Light API)Demo
轻量级 API 是 Paddle-Lite 推荐的部署方式:先用 opt 工具把训练模型离线转换为 Paddle-Lite 专用格式(naive_buffer,.nb文件),再通过轻量 API 直接加载.nb文件进行预测。由于免去了运行时在线转换,加载与预测耗时均更优。
2.1 编译可执行文件
在inference_lite_lib.android.armv8/demo/cxx/mobile_light目录下执行:
cd inference_lite_lib.android.armv8/demo/cxx/mobile_light make -j编译产出可执行文件mobilenetv1_light_api。对应的源码位于 lite/demo/cxx/mobile_light/mobilenetv1_light_api.cc,其核心流程为:构造MobileConfig→CreatePaddlePredictor<MobileConfig>(config)创建预测器 → 填充输入 →predictor->Run()→ 读取输出。测试代码中输入的是一张全 1 数据(input_data[i] = 1.f),仅用于验证流程正确性,实际部署时请替换为真实预处理后的图像数据。
2.2 下载模型并使用 opt 转换
下载原始 Paddle 模型(mobilenet_v1 分类模型):
wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz tar zxf mobilenet_v1.tar.gz使用 opt 工具进行模型转换(具体用法参考 docs/user_guides/model_optimize_tool.md)。推荐从 Paddle-Lite release 界面下载 opt 工具,注意 opt 工具版本必须与预测库版本保持一致。假定转换后的模型为mobilenet_v1.nb。
opt 工具同时也提供命令行二进制形式,转换命令可参考:
./opt --model_dir=mobilenet_v1 --optimize_out_type=naive_buffer --optimize_out=mobilenet_v1 # 优化后模型为 mobilenet_v1.nb更多 opt 用法可查看仓库文档 docs/user_guides/opt/opt_bin.md 与 docs/user_guides/opt/opt_python.md。
2.3 通过 adb 推送并在手机端执行
adb push mobilenetv1_light_api /data/local/tmp/ adb push mobilenet_v1.nb /data/local/tmp/ adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ adb shell chmod +x /data/local/tmp/mobilenetv1_light_api adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobilenetv1_light_api /data/local/tmp/mobilenet_v1.nb"说明:
- 需要将动态库
libpaddle_light_api_shared.so与可执行文件、模型一并 push 到手机,并通过LD_LIBRARY_PATH指定动态库搜索路径; chmod +x赋予执行权限;- 如果是在 Docker 中编译,而 Docker 无法直连手机,可将测试所需文件和库拷贝到 Docker 外部再执行上述命令。
运行成功后,控制台会输出预测结果前 10 个类别的预测概率。
2.4 从源码看 Light API 的可调参数
从 mobilenetv1_light_api.cc 的main函数可以看出,该可执行文件支持最多 8 个命令行参数,依次为:
| 参数 | 说明 | 默认值 |
|---|---|---|
naive_buffer_model_dir | .nb模型路径 | 必填 |
raw_input_shapes | 输入 shape,如1,3,224,224;多输入用:分隔 | 1,3,224,224 |
repeats | 重复推理次数 | 10 |
warmup | 预热次数 | 10 |
power_mode | 0:大核高性能;1:小核;2:全部核;3:不绑定 | 0 |
thread_num | 线程数 | 1 |
accelerate_opencl | 仅当模型可在 OpenCL 后端运行时生效,1 开启 OpenCL kernel 缓存与调优 | 1 |
print_output | 1 表示将输出张量逐元素打印到 stdout | 0 |
源码还展示了 OpenCL 后端相关的进阶配置:IsOpenCLBackendValid检查 GPU 后端是否可用,set_opencl_binary_path_name指定 kernel 二进制缓存路径,set_opencl_tune(CL_TUNE_NORMAL, ...)选择调优级别,set_opencl_precision(CL_PRECISION_FP16)指定 FP16 精度。若 OpenCL 不可用,程序会输出*** nb model will be running on cpu. ***提示并回退到 CPU 执行。完整 OpenCL 部署可参考 docs/demo_guides/opencl.md。
3. 编译并运行全量 API(Full API)Demo
全量 API(CxxConfig+CreatePaddlePredictor<CxxConfig>)支持在线对原始模型进行转换:直接加载 Paddle 原始模型(__model__/__params__或合并格式),在运行时完成优化后再预测。由于在线转换耗时较久,Paddle-Lite 推荐首选 opt 工具离线转换 + 轻量 API 部署的组合。全量 API 更多用于调试或需要动态改变模型结构的场景。
注:当编译模式为
tiny_publish时,release 包中将不包含该 Demo,需使用full_publish编译模式才会产出。
3.1 编译与运行
cd inference_lite_lib.android.armv8/demo/cxx/mobile_full wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz tar zxvf mobilenet_v1.tar.gz make adb push mobilenet_v1 /data/local/tmp/ adb push mobilenetv1_full_api /data/local/tmp/ adb push ../../../cxx/lib/libpaddle_full_api_shared.so /data/local/tmp/ adb shell chmod +x /data/local/tmp/mobilenetv1_full_api adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobilenetv1_full_api --model_dir=/data/local/tmp/mobilenet_v1 --optimized_model_dir=/data/local/tmp/mobilenet_v1.opt"运行成功后在控制台输出预测结果前 10 个类别的预测概率。同样地,测试文件中输入数据为全 1,实际部署请替换为真实数据;Docker 编译无法连手机时,将所需文件和库拷贝到 Docker 外部再测试。
3.2 从源码看 Full API 的命令行参数
对应源码 lite/demo/cxx/mobile_full/mobilenetv1_full_api.cc 基于 gflags 解析参数:
| 参数 | 类型 | 说明 |
|---|---|---|
--model_dir | string | 未合并(uncombined)格式的模型目录路径 |
--model_file/--param_file | string | 合并(combined)格式的模型文件与参数文件 |
--optimized_model_dir | string | 优化后模型的输出目录 |
--prefer_int8_kernel | bool | 是否优先使用 int8 kernel(默认 false) |
--power_mode | int32 | 0:POWER_HIGH;1:POWER_LOW;2:POWER_FULL;3:NO_BIND(默认 3) |
--threads | int32 | 线程数(默认 1) |
--warmup | int32 | 预热次数(默认 10) |
--repeats | int32 | 重复次数(默认 100) |
--use_gpu | bool | 是否使用 OpenCL 后端(默认 false) |
源码中的关键点:
- 通过
config.set_valid_places(valid_places)声明候选执行后端列表,开启 GPU 时会依次放入多组 OpenCLPlace(含TARGET(kOpenCL)、FP16/FP32 精度、kImageDefault/kImageFolder/kNCHW数据布局),否则仅放入TARGET(kARM); predictor->SaveOptimizedModel(FLAGS_optimized_model_dir, LiteModelType::kNaiveBuffer)会在线把优化后的模型保存为.nb文件——这正是 Full API 相比 Light API 的差异点:它把 opt 的转换能力内置到了运行时。源码注释特别警告:SaveOptimizedModel必须在Run()之前调用,因为部分 kernel 的PrepareForRun可能修改参数值。
4. 编译并运行物体分类 Demo(mobile_classify)
与前两个 Demo 不同,物体分类 Demo 是面向真实图像的:它会用 OpenCV 读取图片、做完整预处理,并输出带类别名的 Top-K 结果,最贴近实际业务场景。
4.1 编译
cd inference_lite_lib.android.armv8/demo/cxx/mobile_classify make编译产出mobile_classify可执行文件。
4.2 下载模型与测试数据
wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz tar zxf mobilenet_v1.tar.gz wget https://paddle-inference-dist.cdn.bcebos.com/PaddleLite/cxx_demo/test_data.tgz tar zxf test_data.tgztest_data.tgz内含测试图片test.jpg与类别标签文件label.txt。
4.3 模型转换
./opt --model_dir=mobilenet_v1 --optimize_out_type=naive_buffer --optimize_out=mobilenet_v1 # 优化后模型为 mobilenet_v1.nb--optimize_out_type=naive_buffer即产出轻量 API 所需的.nb格式。
4.4 推送并执行
adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ adb push mobile_classify /data/local/tmp/ adb shell chmod +x /data/local/tmp/mobile_classify adb push test_data /data/local/tmp/ adb push mobilenet_v1.nb /data/local/tmp/ adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1.nb /data/local/tmp/test_data/test.jpg /data/local/tmp/test_data/label.txt"运行成功后输出预测结果前 5 个类别的概率。
4.5 可选参数:topk 与输入尺寸
查看前 10 个类别:在命令末尾追加
topk值即可:adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1.nb /data/local/tmp/test_data/test.jpg /data/local/tmp/test_data/label.txt 10"切换其他模型并指定输入尺寸:追加
model_dir及其模型输入大小,格式为topk 宽 高:adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1.nb /data/local/tmp/test_data/test.jpg /data/local/tmp/test_data/label.txt 10 224 224"
4.6 从源码看图像预处理链路
对应源码 lite/demo/cxx/mobile_classify/mobile_classify.cc 展示了完整的"图像 → 张量"预处理流程,这部分是端侧视觉类应用的通用范式:
cv::cvtColor将 BGR 图转为 RGB;cv::resize缩放到模型输入尺寸;convertTo(CV_32FC3, 1/255.f)归一化到[0,1];- 调用
neon_mean_scale完成减均值、除方差,并通过 NEON 内联汇编(float32x4_t、vld3q_f32、vst1q_f32等)将 NHWC 布局转换为 NCHW 布局,同时做 4 路向量化加速。默认均值means = {0.485f, 0.456f, 0.406f}、方差scales = {0.229f, 0.224f, 0.225f}(ImageNet 统计值); print_topk使用std::partial_sort计算 Top-K,并配合label.txt输出类别名与置信度。
该 Demo 同时展示了MobileConfig的最小用法:set_model_from_file指定.nb模型 →CreatePaddlePredictor<MobileConfig>→GetInput(0)/Resize/mutable_data<float>→Run()→GetOutput(0)。
5. 编译并运行 SSD 目标检测 Demo
SSD Demo 将检测框、类别、置信度直接绘制到测试图片上并保存结果图,可直观验证检测模型的正确性。
cd inference_lite_lib.android.armv8/demo/cxx/ssd_detection make -j adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ adb push ssd_detection /data/local/tmp/ adb shell chmod +x /data/local/tmp/ssd_detection wget https://paddle-inference-dist.bj.bcebos.com/mobilenetv1-ssd.tar.gz tar zxvf mobilenetv1-ssd.tar.gz adb push mobilenetv1-ssd /data/local/tmp adb push test.jpg /data/local/tmp/ # 请自己准备ssd模型的测试图片 adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/ssd_detection /data/local/tmp/mobilenetv1-ssd /data/local/tmp/test.jpg" adb pull /data/local/tmp/test_ssd_detection_result.jpg ./运行成功后,ssd_detection目录下会生成目标检测结果图像test_ssd_detection_result.jpg。
从源码看检测输出后处理
对应源码 lite/demo/cxx/ssd_detection/ssd_detection.cc 展示了端侧目标检测的标准后处理:
- SSD 模型的输出按每 6 个 float 为一组(
data += 6)组织,依次为:class_id(类别索引)、prob(置信度)、以及归一化后的x, y, w, h(data[2]..data[5],需乘以原图宽高还原为像素坐标); - 阈值
0.6f用于过滤低置信度框,detect_object中还会用cv::Rect(0,0,cols,rows)对检测框做越界裁剪; - 内置 VOC 20 类 + background 共 21 个类别名(
class_names[]); - 使用
cv::rectangle、cv::putText将结果绘制到图上,最终cv::imwrite保存为<图片名>_ssd_detection_result.jpg。
预处理方面该 Demo 使用均值/方差{0.5f, 0.5f, 0.5f},输入尺寸固定为300×300,同样基于 NEON 完成 NHWC→NCHW 转换。
6. 编译并运行 YOLOv3 目标检测 Demo
YOLOv3 Demo 与 SSD Demo 流程一致,仅模型与后处理不同:
cd inference_lite_lib.android.armv8/demo/cxx/yolov3_detection make -j adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ adb push yolov3_detection /data/local/tmp/ adb shell chmod +x /data/local/tmp/yolov3_detection wget https://paddle-inference-dist.bj.bcebos.com/mobilenetv1-yolov3.tar.gz tar zxvf mobilenetv1-yolov3.tar.gz adb push mobilenetv1-yolov3 /data/local/tmp adb push test.jpg /data/local/tmp/ # 请自己准备yolov3模型的测试图片 adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/yolov3_detection /data/local/tmp/mobilenetv1-yolov3 /data/local/tmp/test.jpg" adb pull /data/local/tmp/test_yolov3_detection_result.jpg ./运行成功后,yolov3_detection目录下会生成目标检测结果图像test_yolov3_detection_result.jpg。
从源码 lite/demo/cxx/yolov3_detection/yolov3_detection.cc 可以看到,其内置了 COCO 80 类类别名(person、bicycle、car、dog…),后处理同样按固定步长解析输出并进行阈值过滤与坐标还原,最后将结果绘制并保存。
7. 人脸识别与佩戴口罩判断 Demo(mask_detection)
该 Demo 串联了人脸检测 + 口罩佩戴判断两个模型:先用pyramidbox_lite人脸检测模型定位人脸,再用人脸区域作为输入交给mask_detector口罩判断模型分类。官方已提供两种使用方式:直接下载编译好的 Demo 包,或从源码编译。
7.1 方式一:下载编译好的 Demo 包直接执行
下载压缩包mask_demo_v2.6.tgz(Paddle-Lite 2.6 版本,内含编译好的可执行文件、模型文件、测试图片、Paddle-Lite 2.6 版本动态库),解压到本地。官方声明该 Demo 已在 Paddle-Lite 2.6 和 2.8 版本上验证可准确执行。
电脑连接安卓手机后,在电脑 shell 端进入mask_demo目录,执行:
sh run.sh脚本会自动完成:push 文件到手机端 → 执行口罩检测 → pull 结果图片。执行后在电脑端查看test_img_result.jpg即为口罩检测结果。
7.2 方式二:从源码编译 Demo 并执行
第一步:准备编译环境。参考 docs/source_compile/compile_env.rst。
第二步:拉取 Paddle-Lite 代码并切换到 2.6 版本分支:
git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite git fetch origin release/v2.6:release/v2.6 git checkout release/v2.6第三步:编译预测库。进入 Paddle-Lite 根目录,执行(详细编译方法参考 docs/source_compile/linux_x86_compile_android.rst):
./lite/tools/build.sh \ --arm_os=android \ --arm_abi=armv8 \ --arm_lang=gcc \ --android_stl=c++_static \ --build_extra=ON \ --with_log=ON \ full_publish第四步:编译 Demo 可执行文件。进入 Demo 编译目录执行脚本,脚本会编译可执行文件,并将可执行文件、预测库、模型、图片统一收集到mask_demo目录:
cd build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/demo/cxx/mask_detection sh prepare.sh仓库中对应脚本为 lite/demo/cxx/mask_detection/prepare.sh,其工作内容一目了然:设置NDK_ROOT环境变量 →make -j编译 → 创建mask_demo目录并拷贝run.sh、mask_detection可执行文件、libpaddle_light_api_shared.so→ 自动下载mask_models_img.tar.gz及两个模型的.nb文件(pyramidbox_lite_fp32_for_cpu_v2_10_rc.tar.gz、mask_detector_fp32_128_128_for_cpu_v2_10_rc.tar.gz)并重命名。
第五步:运行。手机连接电脑后进入mask_demo目录执行sh run.sh,查看生成的test_img_result.jpg。lite/demo/cxx/mask_detection/run.sh 的核心命令为:
adb push ../mask_demo /data/local/tmp/ adb shell "cd /data/local/tmp/mask_demo && export LD_LIBRARY_PATH=...:${LD_LIBRARY_PATH} && \ ./mask_detection pyramidbox_lite_v2_10_rc_opt2.nb mask_detector_v2_10_rc_opt2.nb mask_models_img/test_img.jpg" adb pull /data/local/tmp/mask_demo/test_img_result.jpg .7.3 使用 PaddleHub 模型替换
除了官方模型,也可以通过 PaddleHub 下载人脸检测与口罩佩戴判断模型,再经 opt 转换后替换mask_demo目录下的模型文件:
import paddlehub as hub pyramidbox_lite_mobile_mask = hub.Module(name="pyramidbox_lite_mobile_mask") pyramidbox_lite_mobile_mask.processor.save_inference_model(dirname="test_program")上述代码会将模型保存在test_program目录:人脸检测与口罩佩戴判断模型分别存储在pyramidbox_lite和mask_detector子目录中,其中的__model__是模型结构文件、__param__是权重文件。从 PaddleHub 下载的是预测模型,需使用 Paddle-Lite 的 opt 工具转换为.nb格式后再替换。
7.4 关键超参数:shrink 与 detect_threshold
源码 lite/demo/cxx/mask_detection/mask_detection.cc 中暴露了两个可自由配置的常量,位于人脸检测与口罩判断的推理循环里:
- 缩放因子
shrink(默认 0.4):用于把输入图片按比例缩小后再送入人脸检测模型(s_width = width * shrink)。缩放因子越大,模型运行速度越慢,检测准确率越高;反之速度更快但可能漏检小脸。 - 检测阈值
detect_threshold(默认 0.7):人脸框置信度阈值(if (outptr[1] >= detect_threshold))。阈值越高,人脸筛选越严格,检测出的人脸框可能越少;调低可召回更多人脸,但可能引入误检。
实际调优时应根据目标设备算力与场景(如人流密度、口罩合规率)在精度与速度之间权衡。
8. 编译含 CV 预处理库的模型单测 Demo(test_cv)
test_cvDemo 用于验证Paddle-Lite CV 图像预处理库(图像缩放、颜色转换、旋转等)与模型的联合推理,其独立说明见 lite/demo/cxx/test_cv/README.md。
cd ../test_cv wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz tar zxvf mobilenet_v1.tar.gz ./model_optimize_tool optimize model make adb push test_model_cv /data/local/tmp/ adb push test.jpg /data/local/tmp/ adb push labels.txt /data/local/tmp/ adb push ../../../cxx/lib/libpaddle_full_api_shared.so /data/local/tmp/ adb shell chmod +x /data/local/tmp/test_model_cv adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/test_model_cv /data/local/tmp/mobilenetv1opt2 /data/local/tmp/test.jpg /data/local/tmp/labels.txt"注意此处使用libpaddle_full_api_shared.so全量库,且模型需经本地工具转换为mobilenetv1opt2目录格式。运行成功后在控制台输出预测结果前 10 个类别的预测概率。该目录下的源码 lite/demo/cxx/test_cv/test_model_cv.cc 与 lite/demo/cxx/test_cv/test_img_prepross.cc 演示了 CV 库预处理与 Full API 推理的组合调用方式,可作为"带图像预处理的完整推理流水线"参考模板。
9. 通用编译机制:Makefile 体系说明
上述所有 Android Demo 共用的编译基础设施在 lite/demo/cxx/Makefile.def 与 lite/demo/cxx/makefiles 目录中:
- 每个 Demo 均提供
Makefile.android.armv7与Makefile.android.armv8两份 Makefile(如 makefiles/mobile_light/Makefile.android.armv8),通过ARM_ABI = arm8或arm7切换目标架构; Makefile.def会根据NDK_ROOT环境变量自动探测 NDK 版本(grep -Eo "android-ndk-r[0-9]{2}"),并据此选择编译器:NDK r18 及以下使用aarch64-linux-android-g++/arm-linux-androideabi-g++(gcc 工具链),r19+ 使用 clang(aarch64-linux-android21-clang++/armv7a-linux-androideabi16-clang++);- 链接选项默认使用共享库
-lpaddle_light_api_shared,Makefile 注释中同时说明了如何切换到静态库libpaddle_api_light_bundled.a(需在源码中放开paddle_use_ops.h/paddle_use_kernels.h的 include,以避免unsupport ops or kernels链接错误); - armv7 编译默认开启
-mfpu=neon -mfloat-abi=softfp,所有目标默认-fopenmp多线程、-fPIE(Android 要求 PIE 可执行文件)。
10. 小结:从 Demo 验证到 App 部署
结合 lite/demo/cxx/README.md 与上述源码分析,可以总结出一条清晰的端侧部署路径:
- 准备环境:搭建可编译 Paddle-Lite 的环境(推荐 Docker),准备 armv7/armv8 安卓手机并通过 adb 连接;
- 获取预测库:自行编译(docs/source_compile/linux_x86_compile_android.rst)或直接下载 release 包;
- 转换模型:使用与预测库同版本的 opt 工具,将原始 Paddle 模型转换为
.nb格式(docs/user_guides/model_optimize_tool.md); - 验证正确性:编译并运行上述任一 C++ Demo,在 shell 端确认预测结果(Top-K 概率、检测框、口罩结果等)符合预期;
- App 集成:验证通过后,将 Light API 调用逻辑迁移到 Android App 中,正式部署。
对于有更复杂交互诉求(如图像实时采集、OpenGL 渲染)的移动端场景,可进一步参考仓库的 docs/demo_guides/android_app_demo.md 与 docs/demo_guides/arm_cpu.md,这些文档展示了 Android App 级别的集成方案,与本文的 shell 端验证 Demo 形成互补。总体而言,lite/demo/cxx 目录下的这 6 类 Demo 覆盖了分类、检测、人脸/口罩识别等最常见端侧任务,是学习 Paddle-Lite 双 API 用法、验证模型正确性、快速原型验证的"第一手教材"。
【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考