PaddleOCR移动端部署完整指南:4步走通端侧OCR最短路径
PaddleOCR移动端部署完整指南:4步走通端侧OCR最短路径
【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR
PaddleOCR移动端部署没有想象中那么深。整个流程拆开看就是四件事:选对轻量模型、用paddle_lite_opt把它转成nb格式、通过adb推到手机上跑端侧OCR推理、再根据识别效果把几个参数调顺。这篇文章按实操路径带你走一遍,代码只保留跑通所必需的部分,跟着敲就行。
跑通之后你手里有什么
按下面的步骤做完,你会得到三样东西:
- 两个能在手机上直接被Paddle-Lite加载的.nb模型文件(检测+识别,方向分类器可选)
- 一个在真机上跑通完整OCR流水线的可执行程序
- 一套可以留作参考的config.txt参数,之后换图换模型都不用重学
移动端的模型选型围绕PP-OCRv5_mobile系列展开,整套模型体积只有3.5M,识别速度是毫秒级的。对绝大多数拍照取字、单据扫描类场景,这个体积加进App包用户基本无感。
模型选择:挑一个不会撑爆APK的
先立一条原则:服务器端训练出来的大模型不要往手机上搬。PaddleOCR本身备好了不同档位的超轻量模型,整套体积直接决定你的安装包大小:
| 模型系列 | 整体体积 | 推荐场景 |
|---|---|---|
| PP-OCRv5_mobile | 3.5M | 默认之选,体积与精度平衡最好,推理快 |
| PP-OCRv3(slim) | 5.9M | 3.5M精度不够用、但还想控制包体 |
| PP-OCRv3 | 16.2M | 精度优先、能接受更大体积的场景 |
取模型时顺便留意版本来源:release/2.0-rc1-0分支目前不支持移动端部署,别从这里拿模型文件。
模型转换:一条命令生成nb格式文件
手机端的Paddle-Lite只认naive_buffer序列化的.nb文件,而训练产出的标准推理模型不是这种格式,中间需要一次"模型转换"。工具是paddle_lite_opt,先装它——注意版本必须和你之后要用的Paddle-Lite预测库对齐,两边错开会在真机上连出一串难看的报错:
pip install paddlelite==2.10然后分别对检测、识别模型各跑一次转换:
# 检测模型转换 paddle_lite_opt --model_file=./ch_PP-OCRv3_det_slim_infer/inference.pdmodel \ --param_file=./ch_PP-OCRv3_det_slim_infer/inference.pdiparams \ --optimize_out=./ch_PP-OCRv3_det_slim_opt \ --valid_targets=arm --optimize_out_type=naive_buffer # 识别模型转换 paddle_lite_opt --model_file=./ch_PP-OCRv3_rec_slim_infer/inference.pdmodel \ --param_file=./ch_PP-OCRv3_rec_slim_infer/inference.pdiparams \ --optimize_out=./ch_PP-OCRv3_rec_slim_opt \ --valid_targets=arm --optimize_out_type=naive_buffer五个参数分工很清楚:前两个分别指向推理模型的网络结构与权重文件,--optimize_out是输出路径,--valid_targets=arm声明目标设备是ARM,--optimize_out_type=naive_buffer指定移动端必须用的轻量序列化格式。命令跑完,输出目录里多出的.nb文件就是能带去手机的模型了。
真机OCR推理:adb推上去就能跑
把两个.nb模型、方向分类器模型、测试图片、字典文件(中文用ppocr_keys_v1.txt)和config.txt放进同一个目录——仓库deploy/lite示例的debug目录已经按这个结构摆好。可执行程序在Paddle-Lite的交叉编译环境里make编译一次即可(Docker、Linux、macOS任选其一)。然后推送到手机:
adb devices # 确认手机已被识别 adb push debug /data/local/tmp/ # 整个目录推到手机 adb shell # 进入手机shell进手机shell后先设置动态库搜索路径,再执行完整流水线:
cd /data/local/tmp/debug export LD_LIBRARY_PATH=${PWD}:$LD_LIBRARY_PATH ./ocr_db_crnn system ch_PP-OCRv3_det_slim_opt.nb \ ch_PP-OCRv3_rec_slim_opt.nb ch_ppocr_mobile_v2.0_cls_slim_opt.nb \ arm8 INT8 10 1 ./test.jpg config.txt ppocr_keys_v1.txt True尾部参数是位置式的:system代表检测+识别+分类全流程,接下来依次是三个模型文件、设备架构、精度、线程数、批大小、测试图片、配置文件、字典文件和一个可视化开关。把开头的system换成det或rec,就能单独跑检测或识别,调试单模块时很方便。
一切顺利的话,终端会逐行打印识别出的文字。下面是示例图片在手机上的实际识别效果:
参数调优:第一次跑出效果之后看这里
config.txt里的默认值只是"通用",不是"最优"。漏检、切边、乱码这类问题,基本都出在下面五个参数没贴合你的场景:
| 参数 | 建议取值 | 作用 |
|---|---|---|
| max_side_len | 960 | 限制输入图最长边,防止手机端内存溢出 |
| det_db_box_thresh | 0.3 | 文本框漏检时,从默认0.5往下调,能多召回框 |
| det_db_unclip_ratio | 2.0 | 框太紧切掉字符边缘时,从默认1.6调大放宽文本框范围;框太松则反向降到1.2~1.5 |
| use_direction_classify | 1 | 启用方向分类器,旋转文本不再识别颠倒 |
| rec_image_height | 48 | 识别模型输入高度,PP-OCRv3必须是48,PP-OCRv2是32,不匹配会出乱码 |
调整节奏建议:一次只动一个参数,推一次真机看一眼,再动下一个。移动端图片普遍偏小,max_side_len用默认值即可,真正花时间的大概率是检测阈值这一对参数。
故障排查:新手最常碰到的4个现象
真机运行提示算子不支持
模型加载时报io_copy算子的kernel不被支持,通常不是模型坏了,而是转换工具和端侧预测库版本错位。把paddlelite和预测库都统一到2.10,重新转一遍模型,问题一般当场消失。
识别结果乱码
先查rec_image_height有没有跟模型代际对上(见上表)。再查字典编码:Windows上的C++ demo按ANSI读字典文件,UTF-8的ppocr_keys_v1.txt直接喂进去就是乱码,在Linux或WSL里转一次编码即可:
iconv -f UTF-8 -t GBK ppocr_keys_v1.txt > ppocr_keys_v1_ansi.txt换用转换后的字典重新推理。
检测框太紧或太松
这是unclip_ratio的事。低于1.6时框会贴着文字走、边缘被切;高于2.5又会和相邻行粘连。经验区间是"太紧"往2.0~2.5调、"太松"往1.2~1.5调,每次动0.2,两三轮就能落点。
只有第一次预测慢
首帧要做资源初始化、权重加载,慢是正常的,第二帧起就恢复。工程上的处理是App启动时先打一发"预热预测",不占交互时间,用户就感觉不到这个毛刺。
性能进阶:把速度再抠出来的3个手法
线程数对齐CPU核心数
前文命令里的10只是个示例。真实取值应等于手机CPU核心数,少了吃不满算力,多了上下文切换反而亏。在adb shell里用cat /proc/cpuinfo数一下processor行数即可。
打开内存优化
内存吃紧的设备,可以在预测代码里打开Paddle-Lite的内存优化开关:
config.enable_memory_optim()它让中间张量复用显存空间,峰值占用降一截,OOM风险小很多。
编译期裁剪预测库
Paddle-Lite库里装了很多算子的kernel,你的模型只用其中一小撮。编译时加一个开关就能把用不上的裁掉:
./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON --enable_trim=true--enable_trim=true会让编译产物只保留当前模型用到的kernel,.so体积随之明显变小,配合前面的模型瘦身,包体能再降一个台阶。
小结
从选模型、转格式、上真机到调参数,PaddleOCR移动端部署就是本文这四步,跑通一遍之后,换模型、换图片都只是替换文件的事。想进一步把它封装进App或接入其他加速方案,可以接着看官方移动端部署指南和FAQ。
【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
