如今AI正火,大量AI教程不断涌现。然而,将模型整合到移动端应用的关键内容,非常值得深入探究。下面就给大家详细讲讲这一过程中的要点。
模型集成通用流程各类模型集成到移动端应用,流程大体是一样的。模型训练阶段很重要。需要利用标注数据得出模型文件。就拿Paddle模型来讲。先训练出Paddle模型。但它没办法直接用于Paddle Lite部署。得依靠Paddle Lite的opt离线优化工具来优化。最终得到Paddle Lite nb模型。
预编译库使用Paddle Lite的新版本想得很周全。它提供了预编译库。对开发者而言,无需再手动编译。直接下载已编译好的推理库文件就行。如此能大幅节省时间与精力。下载后使用这些推理库,可为后续模型的推理计算做好准备。
推理计算步骤使用已编译好的推理库和优化后的模型文件,要先进行模型初始化。要配置模型位置、线程数等参数。接着要对图像预处理。比如图形转换、归一化处理。之后把处理好的数据输入模型做推理计算。进而获得结果。
|-app # 程序module的主目录|-build # app模块编译输出的文件(包括最终生成的apk)|-libs # 依赖库|-OpenCV # OpenCV库|-PaddleLite # PaddleLite库,用于调用模型进行推理预测|-src # app应用的源代码目录 |-src/main/assets # 模型文件、测试图片 |-src/main/cpp # (C++源代码方式)C++ 程序代码目录 |-src/main/java # java程序代码目录 |-src/main/jniLibs # (so方式)与cpp 目录的操作二选一 |-src/main/res #存放app中显示的图形、文本、声音等一些资源文件 |-src/main/res/drawable # 各种位图文件(.png、.jpg等)和drawable类型的XML文件 |-src/main/res/ # 布局文件 |-src/main/AndroidManifest.xml # 项目的清单文件(名称、版本、SDK、权限等配置信息)|-build.gradle # 项目的gradle编译文件
模型文件assets中有两个深度学习模型。将图片作为输入。把模型导入Paddle Lite。之后便可输出检测结果。C++程序代码负责向下调用OpenCV库的函数。C++程序代码还负责向下调用Paddle Lite库的函数。通过这些操作来实现模型推理预测的底层工作
预测准备工作|-app/src/main/cpp |-CMakeLists.txt # 重新编译C++的源代码和库,TrustWallet钱包官网地址生成能被本项目中的C++的程序所使用的库 |- common.h # 常量定义和日志函数 |- native.cpp # 和java层交互的c++函数 |- native.h # jni的封装函数 |- ocr_clipper.cpp # 检测模型DB后处理用到的第三方库 |- ocr_clipper.hpp |- ocr_crnn_process.cpp # 识别模型CRNN预处理函数, Trust钱包官网入口 获取OpenCV的Mat图片后再放到preprocess做DB模型的预处理 |- ocr_crnn_process.h |- ocr_db_post_process.cpp #检测模型DB后处理函数 |- ocr_db_post_process.h |- ocr_predictor.cpp # OCR 模型预测函数 |- ocr_predictor.h |- ppredictor.cpp # 准备模型预测所需要的初始化,加载模型,从网络结果中获取输出等步骤 |- ppredictor.h |- predictor_input.cpp # 输入数据 |- predictor_input.h |- predictor_output.cpp # 获取预测结果的输出结果信息 |- predictor_output.h |- preprocess.cpp # 图片预处理函数,用于检测模型DB |- preprocess.h
模型预测前要做好准备工作。准备工作包括模型初始化。还要给输入数据分配内存。在MiniActivity.java里修改代码。用predictor.init( )初始化Predictor。配置预测参数。比如输入尺寸、模型路径等。这样能保证模型运行准确无误。
|- preprocess.cpp 识别模型CRNN预处理函数|- preprocess.h|- ocr_db_post_process.cpp 检测模型DB后处理函数|- ocr_db_post_process.h项目开发要点
本项目新增了三个控件。这些控件靠.java文件里的ID来调用。同时添加了abiFilters,值为'armeabi-v7a'和'arm64-v8a'。这么做是为了指定编译平台。如此能避免默认编译所有平台目标文件。因为我们的库仅支持arm - v7和arm - v8。要是不指定,可能会运行报错代码存于src/main/下的java文件夹与cpp文件夹。上层开发用Java,底层开发用C++,这两者都要做开发。此外,OpenCV库可从官网下载,此次用的是4.2 android版本。现在飞桨为开发者提供了端计算模型SDK和Demo APP,借助它们能迅速体验端计算模型
|- ocr_crnn_process.cpp 识别模型CRNN模型的预处理,结果是OpenCv的Mat,然后再放到preprocess.cpp做图片的预处理|- ocr_crnn_process.h
大家将AI模型集成到移动端应用时,是否遇到特别难解决的问题?欢迎在评论区留言分享。别忘了给本文点赞。也别忘了分享本文。
|- ocr_predictor.cpp OCR 模型预测函数|- ocr_predictor.h