PaddleCloud基于 Tekton 为OCR模型套件提供了镜像持续构建的能力,并支持CPU、GPU以及常见CUDA版本的镜像。 您可以查看 PaddleOCR 镜像仓库 来获取所有的镜像列表。 同时我们也将PP-OCRv3识别模型的训练与推理实战案例放置到了AI Studio平台上,您可以点击 PP-OCRv3识别训推一体项目实战 在平台上快速体验。
PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测、检测框矫正和CRNN文本识别三部分组成。
image.pngPaddleServing 服务化部署框架是什么?
Paddle Serving依托深度学习框架PaddlePaddle旨在帮助深度学习开发者和企业提供高性能、灵活易用的工业级在线推理服务。Paddle Serving支持RESTful、gRPC、bRPC等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案,和多种经典预训练模型示例。
image.png一、启动容器
拉取预安装paddlepaddle的镜像
image.pngdocker pull registry.baidubce.com/paddlepaddle/paddle:2.4.2
clone paddleOCR代码
git clone https://gitee.com/paddlepaddle/PaddleOCR
启动并进入docker容器:
docker run --name ppocr \ -v $PWD:/paddle \ --network=host \ -it registry.baidubce.com/paddlepaddle/paddle:2.4.2 /bin/bash
二、安装依赖和部署模型
安装paddleOCR的python依赖
cd /paddle/PaddleOCR
python -V
python 3.7.13
pip3 install -r requirements.txt
image.png
安装服务模块
PaddleOCR提供3种服务模块,分别为检测、识别、检测+识别,根据需要安装所需模块。(这里我们是安装的ocr_system)
pip uninstall typing-extensions -y
pip uninstall flask-babel -y
pip uninstall astroid -y
pip install astroid==2.11.6
pip install flask-babel==2.0.0
pip install typing-extensions==4.7.1
# 安装paddlehub(用于启动服务)
pip3 install paddlehub
# 安装检测+识别串联服务模块:
hub install ./deploy/hubserving/ocr_system/
# 或,只安装检测服务模块:
hub install deploy/hubserving/ocr_det/
# 或,只安装识别服务模块:
hub install deploy/hubserving/ocr_rec/
image.png
image.png
下载并安装模型
下载PPOCR的inference模型:
# 切换到 OCR 的 inference 目录
mkdir /paddle/PaddleOCR/inference
cd /paddle/PaddleOCR/inference
# 下载并解压 OCR 文本检测模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_infer.tar
# 下载并解压 OCR 方向分类器模型
wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar -O ch_ppocr_mobile_v2.0_cls_infer.tar && tar -xf ch_ppocr_mobile_v2.0_cls_infer.tar
# 下载并解压 OCR 文本识别模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar -O ch_PP-OCRv3_rec_infer.tar && tar -xf ch_PP-OCRv3_rec_infer.tar
修改参数文件 - 模型路径
image.pngvi /paddle/PaddleOCR/deploy/hubserving/ocr_system/params.py
三、启动模型服务
修改启动配置文件,不使用gpu
此时启动后端口为8868,需注意use_multiprocess 和user_gpu不能同时为true。
image.pngvi /paddle/PaddleOCR/deploy/hubserving/ocr_system/config.json
如果gpu = true,可以修改显存占用的配置
image.pngvi /paddle/PaddleOCR/deploy/hubserving/ocr_system/module.py
启动paddleocr服务(hubserving启动),
# config文件启动
hub serving start -c deploy/hubserving/ocr_system/config.json
# 命令行方式启动
hub serving start -m ocr_system -modules k==v --port 8866 --use_multiporcess false --workers 1
命令行方式启动参数:
参数 用途
--modules/-m PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出当不指定Version时,默认选择最新版本
--port/-p 服务端口,默认为8866
--use_multiprocess 是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式,Windows操作系统只支持单进程方式
--workers 在并发方式下指定的并发任务数,默认为2*cpu_count-1,其中cpu_count为CPU核数
四、测试
4.1 通过test_hubserving.py文件验证
image.pngdocker exec -it ppocr bash python /paddle/PaddleOCR/tools/test_hubserving.py --server_url http://127.0.0.1:8868/predict/ocr_system --image_dir /paddle/PaddleOCR/doc/imgs/
4.2 通过python请求request单个文件测试
python ocr.py
import requests
import json
import base64
def cv2_to_base64(image):
return base64.b64encode(image).decode('utf8')
headers = {"Content-type": "application/json"}
img = open(r'/paddle/id3.jpg', 'rb').read()
b = cv2_to_base64(img)
data = {'images': [cv2_to_base64(img)]}
r = requests.post(url='http://127.0.0.1:8868/predict/ocr_system', headers=headers, data=json.dumps(data))
# data数据写入文件
#with open('data.txt', 'w') as f:
# f.write(json.dumps(data))
# 打印data数据和返回结果
print(data)
print(r.json()["results"][0])
image.png
4.3 通过curl命令测试
计算待识别图片的Base64编码,可以通过免费的在线工具实现,如:http://tool.chinaz.com/tools/imgtobase/,也可以通过python的cv2_to_base64包实现。
或者直接使用\deploy\docker\hubserving路径下的sample_request.txt样例。
# 服务请求
curl -H "Content-Type:application/json" -X POST --data "{\"images\": [\"填入图片Base64编码(需要删除'data:image/jpg;base64,')\"]}" http://localhost:8868/predict/ocr_system
# 服务返回
{"msg":"","results":[[{"confidence":0.8403433561325073,"text":"约定","text_region":[[345,377],[641,390],[634,540],[339,528]]},{"confidence":0.8131805658340454,"text":"最终相遇","text_region":[[356,532],[624,530],[624,596],[356,598]]}]],"status":"0"}
网友评论