Loading...

PaddleOCR从零部署手记

笔记库 2年前 (2022) LINSIR
282 0 0

注:推荐先阅读官方的《PaddleHub一键OCR中文识别》,当然主要是原理性质的阐述,指导实际部署还是差了点

0x01:背景

因业务需要需要自行搭建OCR API服务(主要是场景消耗大,云上太贵了),初步决定选用最近比较火的PaddleOCR,由于疫情原因公司得Linux服务器暂时没法配置,现在一台Windows服务器上搭建临时服务,网上教程比较零散,特在此进行总结。

官方在线示例

0x02:使用版本

准备安装:

  • PaddleOCR:V2.5.0
  • Paddlepaddle(飞桨框架)V2.3 Win+pip+CUDA11.2
  • Paddlehub(飞桨管理,如实现web)V2.2
  • 模型:ch_ppocr_server_v2.0_rec预训练模型和ch_ppocr_server_v2.0_rec训练模型
  • CUDA:V11.2 64bit
  • cuDNN:V8.2.1.32 x86+Win+CUDA11.X

已有:

  • python:3.8 64bit(3.10的onnx安不上,退回来的)
  • Windows:10 19043.1055 64bit
  • GPU:2080TI

0x03:(非必需)文件准备

这段有比较详细但有点繁琐的官方说明

  1. 下载Github上PaddleOCR的最新版本并解压
  2. 下载OCR模型(注意这是POCR2.5版本的下载),根据需求,我选择的是ch_ppocr_server_v2.0_rec全量推理模型和ch_ppocr_server_v2.0_det全量推理模型(轻量模型已更新至V3,但我打算用全量的所以选用V2,原计划打算用预训练模型,最后被迫用的是推理模型,否则提示找不到文件错误,先不研究什么原因了)
  3. 在PaddleOCR文件夹中新建inference文件夹
  4. 将模型放入inference文件夹
  5. 打开PaddleOCR文件夹中的 \deploy\hubserving\ocr_recm\params.py
  6. cfg.rec_model_dir(识别模型路径)的值修改为./inference/ch_ppocr_server_v2.0_rec_pre/
  7. 打开PaddleOCR文件夹中的 \deploy\hubserving\ocr_system\params.py
  8. cfg.det_model_dir(检测模型路径)的值修改为./inference/ch_ppocr_server_v2.0_det_infer/
  9. cfg.rec_model_dir(识别模型路径)的值修改(不改好像也行?)为./inference/ch_ppocr_server_v2.0_rec_infer/
  10. 如果下载了方向分类模型也做类似配置,自己根据选用模型修改后边的路径!

0x04:安装环境

这段也有比较详细但有点繁琐的官方说明

注:本文中均参考《Python pip换源所有方法》使用清华镜像下载py模块

安装CUDA和cuDNN

如果是用GPU跑,先安装CUDA(建议V11.2),在CUDA安装目录(默认C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2)下新建一个CUDNN文件夹,再在里面新建一个版本文件夹,下载对应版本的cuDNN将解压后的内容丢入其目录,将该目录设置Path环境变量(我设置的:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\CUDNN\v8.2.1\bin

  • CUDA详细安装方法参见这里
  • cuDNN详细安装方法参见这里
  • 个人认为只要版本找对,安装没啥难度

如果安装时遇到You already have a newer version of the NVIDIA Frameview SDK installed,需要将驱动自带的NVIDIA Frameview SDK卸载掉才能安装。

新建一个名字为CUDA_VISIBLE_DEVICES的环境变量,值一般为0(即0号显卡,具体显卡列表请在C:\Program Files\NVIDIA Corporation\NVSMI(路径自己改)下执行nvidia-smi

安装paddlepaddle及Python依赖模块

注意根据不同硬件、环境在此选择不同命令,我的是:

python -m pip install paddlepaddle-gpu==2.3.0.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html

如果上述执行不成功,可以尝试先执行这些命令

#该Module依赖于这些第三方库:
pip3 install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple 
pip3 install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install scikit-build -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple

另外还有说法(我没遇到,原文在这)是shapely不能直接用pip install shapely命令安装,需要先执行下方脚本(做个py文件),获取python支持的whl:

import pip._internal.pep425tags
print(pip._internal.pep425tags.get_supported())

下载对应的shapely whl文件,并运行(后边文件路径自己按需改):

pip3 install .Shapely-1.7.1-cp37-cp37m-win_amd64.whl

如果安装成功,提示如下:

Installing collected packages: paddlepaddle
Successfully installed paddlepaddle-1.8.3

在python解释器(也就是python主程序,或者做个py跑也行)中执行

import paddle.fluid
paddle.fluid.install_check.run_check()

如果出现Your Paddle Fluid is installed successfully!即为安装成功

安装PaddleHub

执行命令:

pip3 install --upgrade paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple

安装chinese_ocr_db_crnn_server模型即软件

如果直接用来用,可以执行命令,否则参照第四部分部署

hub install chinese_ocr_db_crnn_server==1.1.2

0x04:(可选)在Paddlehub中安装PaddleOCR模块

先安装PaddleOCR的Python依赖模块

在PaddleOCR文件夹中运行(理论上都已经安装完毕了,如果错误,可能需要多次执行)

pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

在PaddleOCR文件夹中运行

#安装检测服务模块
hub install deploy/hubserving/ocr_det/
#安装识别服务模块,其实貌似我个人安这个就可以了
hub install deploy/hubserving/ocr_rec/
#安装检测+识别串联服务模块
hub install deploy/hubserving/ocr_system/

安装成功会提示Successfully installed,也可以运行hub list查看列出的表格有没有对应的模块,例如我的输出是:

+--------------------+----------------------------------------+
|     ModuleName     |Path                                    |
+--------------------+----------------------------------------+
|      ocr_det       |C:\Users\linsir.cc\.paddlehub\modules\ocr_d|
|                    |et                                      |
+--------------------+----------------------------------------+
|      ocr_rec       |C:\Users\linsir.cc\.paddlehub\modules\ocr_r|
|                    |ec                                      |
+--------------------+----------------------------------------+
|     ocr_system     |C:\Users\linsir.cc\.paddlehub\modules\ocr_s|
|                    |ystem                                   |
+--------------------+----------------------------------------+

如果报错可以按照提示查看日志,一般是依赖模块未能安装成功(如:ModuleNotFoundError: No module named 'skimage')或者模型路径不对(如:not find model file path ./inference/ch_PP-OCRv3_rec_infer//inference.pdmodel

0x05:运行和使用

配置文件启动方式:

到PaddleOCR文件夹中的\deploy\hubserving\ocr_system\config.json文件,打开并修改相应的参数(use_gpu:false是用CPU而不是GPU进行运算,如果出现Please compile with gpu to EnableGpu()则说明你现在按的是CPU版,得把PP换成GPU版本)

{
    "modules_info": {
        "ocr_system": {
            "init_args": {
                "version": "1.0.0",
                "use_gpu": false
            },
            "predict_args": {
            }
        }
    },
    "port": 8868,
    "use_multiprocess": false,
    "workers": 2
}

命令启动方式:

hub serving start -m chinese_ocr_db_crnn_server –-use_gpu

如果成功,会提示使用的接口地址(一般是http://127.0.0.1:8866/predict/chinese_ocr_db_crnn_server),调用接口即可(POST传JSON)

{
"images":["这里是base64后的图片,不含data:image/png;base64,,并注意用=将长度补齐为四的倍数"]
}

官方的启动示例代码

hub serving start -m chinese_ocr_db_crnn_mobile -p 8866

下方是官方的py调用代码:

# coding: utf8
import requests
import json
import cv2
import base64

def cv2_to_base64(image):
    data = cv2.imencode('.jpg', image)[1]
    return base64.b64encode(data.tostring()).decode('utf8')

# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/chinese_ocr_db_crnn_mobile"
r = requests.post(url=url, headers=headers, data=json.dumps(data))

# 打印预测结果
print(r.json()["results"])
版权声明:LINSIR 发表于 2022-05-13 19:23。
转载请注明:PaddleOCR从零部署手记 | LINSIR的博客

相关文章

没有相关内容!

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...