注:推荐先阅读官方的《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:(非必需)文件准备
这段有比较详细但有点繁琐的官方说明
- 下载Github上PaddleOCR的最新版本并解压
- 下载OCR模型(注意这是POCR2.5版本的下载),根据需求,我选择的是
ch_ppocr_server_v2.0_rec
全量推理模型和ch_ppocr_server_v2.0_det
全量推理模型(轻量模型已更新至V3,但我打算用全量的所以选用V2,原计划打算用预训练模型,最后被迫用的是推理模型,否则提示找不到文件错误,先不研究什么原因了) - 在PaddleOCR文件夹中新建
inference
文件夹 - 将模型放入
inference
文件夹 - 打开PaddleOCR文件夹中的
\deploy\hubserving\ocr_recm\params.py
- 将
cfg.rec_model_dir
(识别模型路径)的值修改为./inference/ch_ppocr_server_v2.0_rec_pre
/ - 打开PaddleOCR文件夹中的
\deploy\hubserving\ocr_system\params.py
- 将
cfg.det_model_dir
(检测模型路径)的值修改为./inference/ch_ppocr_server_v2.0_det_infer/
- 将
cfg.rec_model_dir
(识别模型路径)的值修改(不改好像也行?)为./inference/ch_ppocr_server_v2.0_rec_infer/
- 如果下载了方向分类模型也做类似配置,自己根据选用模型修改后边的路径!
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
)
如果安装时遇到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"])