项目背景

如何在各种异构设备上部署深度学习模型?这个灵魂拷问往往是很多深度学习模型落地的拦路虎。因为部署这事实在有点复杂,一会儿是环境不匹配,要重新编译;一会儿是算子不支持,要重写算子……

我们不就是想把跑好的模型装到手机上/树莓派/平板上看看效果嘛,为什么这么难~~

不过没关系,最近,救星来了!

在这里插入图片描述

FastDeploy是飞桨社区最新推出的一款简单易用的推理部署工具箱。覆盖业界主流优质预训练模型并提供开箱即用的开发体验,包括图像分类、目标检测、图像分割、人脸检测、人体关键点识别、文字识别等多任务,满足开发者多场景,多硬件、多平台的快速部署需求。

作为电表宇宙的最新一集= =!,本项目将以电表检测模型在HarmonyOS设备部署为例,介绍如何利用FastDeploy,通过非常简单的几个步骤,在10分钟内完成OCR自定义模型在Andiord系统上的部署。

感兴趣的同学,可以参考FastDeploy的介绍,自行尝试模型在IOS等其它设备的部署。

实时部署效果如下:

在这里插入图片描述

接下来,我们就来看看具体的操作步骤。

1 模型准备

1.1 确认支持模型

首先我们要确认下我们使用的网络结构目前是否支持部署在目标设备上,省得白忙活~~

先翻翻FastDeploy项目的文档

  • 云端(含服务器、数据中心):
    • 支持一行命令启动 Serving 服务(含网页图形化展示)
    • 支持一行命令启动图像、本地视频流、本地摄像头、网络视频流预测
    • 支持 Window、Linux 操作系统
    • 支持 Python、C++ 编程语言
  • 边缘端:
    • 支持 NVIDIA Jetson 等边缘设备,支持视频流预测服务
  • 端侧(含移动端)
    • 支持 iOS、Android 移动端
    • 支持 ARM CPU 端侧设备
  • 支持主流硬件
    • 支持 Intel CPU 系列(含酷睿、至强等)
    • 支持 ARM CPU 全系(含高通、MTK、RK等)
    • 支持 NVIDIA GPU 全系(含 V100、T4、Jetson 等)
模型 任务 大小(MB)端侧移动端 移动端边缘端服务器+云端服务器+云端 服务器+云端 服务器+云端
-------------- Linux Android iOS Linux Linux Linux Windows Windows
--------- ARM CPU ARM CPU ARM CPU Jetson X86 CPU GPU X86 CPU GPU
PP-OCRv1OCR2.3+4.4
PP-OCRv2OCR2.3+4.4
PP-OCRv3OCR2.4+10.6
PP-OCRv3-tinyOCR2.4+10.7

在这里插入图片描述

上面是本项目的目标设备,从文档中我们发现,FastDeploy对OCR模型支持非常强悍!从PP-OCRv1到PP-OCRv3,甚至是PP-OCRv3-tiny都支持!

这下,我们可以放心继续下一步了~~

1.2 OPT模型转换

显然,FastDeploy也是“站在巨人肩膀上”的成果,其实它是基于PaddleLite等优秀项目的再次包装。

PaddleLite框架拥有优秀的加速、优化策略及实现,包含量化、子图融合、Kernel 优选等优化手段。优化后的模型更轻量级,耗费资源更少,并且执行速度也更快。 这些优化通过 PaddleLite提供的离线优化工具(OPT)实现。

OPT工具还可以统计并打印出模型中的算子信息,并判断不同硬件平台下PaddleLite的支持情况。我们在获取PaddlePaddle格式的模型之后,一般需要通该工具做模型优化。

在我们的部署目标ARM CPU上,OCR模型需要单独做一下离线优化也就是OPT模型转换。

注:FastDeploy的文档中,直接提供了Linux、M1、MAC上的模型转换工具下载链接,但因为托管在GitHub上,下载速度非常慢。因此,本文直接基于AI Studio,用原生的PaddleLite提供的opt工具完成模型转换。

我们使用之前电表检测部署应用:手把手教你把PPOCRLabel改成想要的模样这个项目提供的PP-OCRv3电表导出模型。不过需要注意的是,我们要先对导出文件重命名一下:

!ls -l -R inference
inference:
总用量 8
drwxr-xr-x 3 aistudio aistudio 4096 7月  26 23:50 infer_det
drwxr-xr-x 3 aistudio aistudio 4096 7月  26 23:51 infer_rec

inference/infer_det:
总用量 3736
-rw-r--r-- 1 aistudio aistudio   26392 7月  18 23:36 inference.pdiparams.info
-rw-r--r-- 1 aistudio aistudio 2377917 7月  18 23:36 model.pdiparams
-rw-r--r-- 1 aistudio aistudio 1416537 7月  18 23:36 model.pdmodel

inference/infer_rec:
总用量 9852
-rw-r--r-- 1 aistudio aistudio   21964 7月  18 23:34 inference.pdiparams.info
-rw-r--r-- 1 aistudio aistudio 8916816 7月  18 23:34 model.pdiparams
-rw-r--r-- 1 aistudio aistudio 1143994 7月  18 23:34 model.pdmodel

也就是说,我们要先确保导出的.pdiparams.pdmodel文件名字叫model.pdiparamsmodel.pdmodel

# 下载paddlelite模型库
!pip install paddlelite==2.9
# 导出DB检测模型
!paddle_lite_opt --model_dir=./inference/infer_det/ --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=./ocr_det
Loading topology data from ./inference/infer_det//model.pdmodel
Loading params data from ./inference/infer_det//model.pdiparams
1. Model is successfully loaded!
2. Model is optimized and saved into ./ocr_det.nb successfully
# 导出REC识别模型
模型
!paddle_lite_opt --model_dir=./inference/infer_rec/ --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=./ocr_rec
Loading topology data from ./inference/infer_rec//model.pdmodel
Loading params data from ./inference/infer_rec//model.pdiparams
1. Model is successfully loaded!
2. Model is optimized and saved into ./ocr_rec.nb successfully

于是我们得到了离线优化后的ocr_det.nbocr_rec.nb,模型准备工作至此完成。

2 Andorid开发环境准备

2.1 下载FastDeploy提供的SDK

FastDeploy的SDK生成和下载使用了EasyEdge中的免费开放能力,所以我们只需要直接到EasyEdge中下载对应的SDK源码就行。
在这里插入图片描述

源码结构如下:

.EasyEdge-Android-SDK
├── app
│   ├── src/main
│   │   ├── assets
│   │   │   ├── demo                 
│   │   │   │   └── conf.json        # APP名字
│   │   │   ├── infer                # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
│   │   │   │   ├── model            # 模型结构文件 
│   │   │   │   ├── params           # 模型参数文件
│   │   │   │   ├── label_list.txt   # 模型标签文件
│   │   │   │   └── infer_cfg.json   # 模型前后处理等配置文件
│   │   ├── java/com.baidu.ai.edge/demo
│   │   │   ├── infertest                          # 通用ARM精简版测试
│   │   │   │   ├── TestInferClassifyTask.java     # 图像分类
│   │   │   │   ├── TestInferDetectionTask.java    # 物体检测
│   │   │   │   ├── TestInferSegmentTask.java      # 实例分割
│   │   │   │   ├── TestInferPoseTask.java         # 姿态估计
│   │   │   │   ├── TestInferOcrTask.java          # OCR
│   │   │   │   └── MainActivity.java              # 精简版启动 Activity
│   │   │   ├── MainActivity.java          # Demo APP 启动 Activity
│   │   │   ├── CameraActivity.java        # 摄像头UI逻辑
│   │   │   └── ...
│   │   └── ...
│   ├── libs
│   │   ├── armeabi-v7a            # v7a的依赖库
│   │   ├── arm64-v8a              # v8a的依赖库
│   │   └── easyedge-sdk.jar       # jar文件
│   └── ...
├── camera_ui    # UI模块,包含相机逻辑
├── README.md
└── ...          # 其他 gradle 等工程文件

2.2 安装 Android Studio

这个安装过程可以参考手把手教你部署移动端迁移学习模型(PaddleX、Paddle-Lite)项目的准备Android Studio开发环境章节,导入我们刚才下载的SDK源码。

值得注意的是,目标设备系统是鸿蒙2.0,我们需要先确定它对应的安卓版本,百度后知道是Android 11,所以下载SDK和NDK的时候要先配置好。

在这里插入图片描述

在这里插入图片描述

3 OCR识别APP的部署

手机打开USB开发模式连接Android环境。

3.1 跑通初始模型

首先我们还是run一下,测试下SDK能否直接部署,发现原模型能够顺利跑通,效果如下:
在这里插入图片描述

这步跑通后,说明原始PP-OCRv3模型能够部署在设备上,接下来,我们只需要做好电表检测模型替换就行。

3.2 替换电表检测模型

首先需要对导出的模型文件重命名,然后下载到本地

ocr_det.nb 修改成 model  # 将 检测模型 修改名称成 model
ocr_rec.nb 修改成 params  # 将 识别模型 修改名称成 params

模型替换只需要关注EasyEdge-Android-**/app/src/assets/infer/目录下的几个文件:

在这里插入图片描述

在这里插入图片描述

4 部署效果

重新构建下模型,这时候可以到手机的APP上看电表检测模型的部署效果了:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5 参考资料

电表检测识别全系列

(主线篇)

(众人拾柴——应用篇)

此文仅为搬运,原作链接:https://aistudio.baidu.com/aistudio/projectdetail/4379834

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐