PaddleOCR文字识别API搭建


最近有个需求是进行验证码识别,之前一直用百度的开放OCR API。突然有一天应用报错,一看原来是免费API调用额度用光了。花钱是不可能花钱的,正好之前有用过PaddlePaddle飞桨这个深度学习框架 还是百度的,逮着薅羊毛呢,里面有个开源的PaddleOCR,测试下来文本识别效果不输于商用的开放API,那还不整一个?

运行环境准备

Windows和Mac用户推荐使用Anaconda搭建Python环境,Linux用户建议使用docker搭建Python环境。

推荐环境:

  • PaddlePaddle >= 2.1.2
  • Python 3.7
  • CUDA10.1 / CUDA10.2
  • CUDNN 7.6

我用Windows没搭起来,始终报cv2的DLL动态链接库错误,最后还是采用docker方案。

Docker环境配置

注意:第一次使用这个镜像,会自动下载该镜像,请耐心等待。您也可以访问DockerHub获取与您机器适配的镜像。

# 切换到工作目录下
cd /home/Projects
# 首次运行需创建一个docker容器,再次运行时不需要运行当前命令
# 创建一个名字为ppocr的docker容器,并将当前目录映射到容器的/paddle目录下

#如果您希望在CPU环境下使用docker,使用docker而不是nvidia-docker创建docker
sudo docker run --name ppocr -v $PWD:/paddle --network=host -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash

#如果使用CUDA10,请运行以下命令创建容器,设置docker容器共享内存shm-size为64G,建议设置32G以上
# 如果是CUDA11+CUDNN8,推荐使用镜像registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda11.2-cudnn8
sudo nvidia-docker run --name ppocr -v $PWD:/paddle --shm-size=64G --network=host -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash

# ctrl+P+Q可退出docker 容器,重新进入docker 容器使用如下命令
sudo docker container exec -it ppocr /bin/bash

安装PaddlePaddle

PaddleOCR是基于PaddlePaddle框架的,首先需要安装PaddlePaddle

  • 您的机器安装的是CUDA9或CUDA10,请运行以下命令安装

    python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
    
  • 您的机器是CPU,请运行以下命令安装

    python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
    

更多的版本需求,请参照飞桨官网安装文档中的说明进行操作。

安装PaddleOCR whl包

pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本

项目克隆

【推荐】git clone https://github.com/PaddlePaddle/PaddleOCR

如果因为网络问题无法pull成功,也可选择使用码云上的托管:

git clone https://gitee.com/paddlepaddle/PaddleOCR

注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先使用推荐方式。

安装第三方库

cd PaddleOCR
pip3 install -r requirements.txt

服务部署

基于PaddleHub Serving的服务部署

hubserving服务部署目录下包括检测、识别、2阶段串联三种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下:

deploy/hubserving/
  └─  ocr_cls     分类模块服务包
  └─  ocr_det     检测模块服务包
  └─  ocr_rec     识别模块服务包
  └─  ocr_system  检测+识别串联服务包

我这里只是用识别模块,目录如下:

deploy/hubserving/ocr_rec/
  └─  __init__.py    空文件,必选
  └─  config.json    配置文件,可选,使用配置启动服务时作为参数传入
  └─  module.py      主模块,必选,包含服务的完整逻辑
  └─  params.py      参数文件,必选,包含模型路径、前后处理参数等参数

快速启动服务

1. 准备环境

# 安装paddlehub  
# paddlehub 需要 python>3.6.2
pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple

2. 下载推理模型

安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是PP-OCRv2模型,默认模型路径为:

检测模型:./inference/ch_PP-OCRv2_det_infer/
识别模型:./inference/ch_PP-OCRv2_rec_infer/
方向分类器:./inference/ch_ppocr_mobile_v2.0_cls_infer/

模型路径可在params.py中查看和修改。 更多模型可以从PaddleOCR提供的模型库下载,也可以替换成自己训练转换好的模型。

3. 安装服务模块

  • 在Linux环境下,安装示例如下:
    # 安装识别服务模块:  
    hub install deploy/hubserving/ocr_rec/
    

4. 启动服务

配置文件启动(支持CPU、GPU)

启动命令:
hub serving start -c config.json

其中,config.json格式如下:

{
    "modules_info": {
        "ocr_rec": {
            "init_args": {
                "version": "1.0.0",
                "use_gpu": false
            },
            "predict_args": {
            }
        }
    },
    "port": 8867,
    "use_multiprocess": false,
    "workers": 2
}
  • init_args中的可配参数与module.py中的_initialize函数接口一致。其中,use_gputrue时,表示使用GPU启动服务
  • predict_args中的可配参数与module.py中的predict函数接口一致。

注意:

  • 使用配置文件启动服务时,其他参数会被忽略。
  • 如果使用GPU预测(即,use_gpu置为true),则需要在启动服务之前,设置CUDA_VISIBLE_DEVICES环境变量,如:export CUDA_VISIBLE_DEVICES=0,否则不用设置。
  • use_gpu不可与use_multiprocess同时为true

5. 发送预测请求

配置好服务端,可使用以下命令发送预测请求,获取预测结果:

python tools/test_hubserving.py server_url image_path

需要给脚本传递2个参数:

  • server_url:服务地址,格式为
    http://[ip_address]:[port]/predict/[module_name]
    例如,如果使用配置文件启动识别服务,那么发送请求的url将分别是: http://127.0.0.1:8867/predict/ocr_rec

  • image_path:测试图像路径,可以是单张图片路径,也可以是图像集合目录路径

访问示例:
python tools/test_hubserving.py http://127.0.0.1:8867/predict/ocr_rec ./doc/imgs/

返回结果格式说明

返回结果为列表(list),列表中的每一项为字典(dict),信息如下:

字段名称 数据类型 意义
text str 文本内容
confidence float 文本识别置信度或文本角度分类置信度

效果

ocr1

可以看到置信度还不错99%,并且能分清字母o和数字0。

后期还可以自己训练模型,以达到更好的识别效果。