前言

最近在公司项目中使用到OCR服务,刚开始使用的是百度云上的通用文字识别接口,后来无意中了解到百度开源的飞浆平台的PaddleOCR模块直接有现成的模型可以使用,于是在公司服务器上搭了一个CPU版本OCR识别服务,由于公司服务器性能加上CPU版本问题,性能达不到要求,所以就购买了华为云的GPU服务器部署GPU版本的OCR服务。

如何在华为云服务器上搭建GPU版本的PaddlePaddle环境请参考以下文章: https://blog.csdn.net/loutengyuan/article/details/126527326

安装PaddleOCR

PaddleOCR是百度基于PaddlePaddle开源的OCR文字识别服务,Github地址:https://github.com/PaddlePaddle/PaddleOCR/
安装,输入以下命令,安装好了之后就可以在命令行体验OCR识别服务了

pip install "paddleocr>=2.0." -i https://mirror.baidu.com/pypi/simple

下载一个测试图片体验包:

wget https://paddleocr.bj.bcebos.com/dygraph_v2.1/ppocr_img.zip #下载
unzip ppocr_img.zip #解压

进入刚刚解压的目录,开始体验OCR识别

cd ppocr_img #进入刚才下载解压的图片目录

执行OCR识别

paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu true

执行可能会报错,这里需要安装 两个 lib libX11 和 libXext

yum install -y libX11
yum install -y libXext

这样就是识别出来啦,使用GPU服务器识别超快的

部署OCR识别API服务

部署的话,Paddle 提供了 PaddleHub 和 Paddle Serving 两个方式,使用PaddleHub是最方便的,命令行直接执行就可以了, Paddle Serving 部署的话更稳定,而且支持 c++ 编译部署。
这里讲一下 PaddleHub 和 Paddle Serving python 部署 (推荐还是 Paddle Serving 部署)

PaddleHub 部署 OCR 识别API

安装 PaddleHub

pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple

启动 API 服务

# 前台启动
hub serving start -m ch_pp-ocrv3 --use_gpu   #会自动下载OCR模型
# 后台启动
nohup hub serving start -m ch_pp-ocrv3 --use_gpu > log.log 2>&1 &

这样就启动了一个 OCR 识别服务

默认最大使用GPU显存大小是8000M,如果需要修改可以找到 /root/.paddlehub/modules/ch_pp_ocrv3/module.py_set_config 方法,将8000改成你想要的值。

    def _set_config(self, pretrained_model_path):"""predictor config path"""model_file_path = pretrained_model_path + '.pdmodel'params_file_path = pretrained_model_path + '.pdiparams'config = paddle_infer.Config(model_file_path, params_file_path)try:_places = os.environ["CUDA_VISIBLE_DEVICES"]int(_places[0])use_gpu = Trueexcept:use_gpu = Falseif use_gpu:# 原本最大显存是8000M,这里改成2000M。config.enable_use_gpu(2000, 0)# config.enable_use_gpu(8000, 0)else:config.disable_gpu()if self.enable_mkldnn:# cache 10 different shapes for mkldnn to avoid memory leakconfig.set_mkldnn_cache_capacity(10)config.enable_mkldnn()config.disable_glog_info()config.delete_pass("conv_transpose_eltwiseadd_bn_fuse_pass")config.switch_use_feed_fetch_ops(False)predictor = paddle_infer.create_predictor(config)input_names = predictor.get_input_names()input_handle = predictor.get_input_handle(input_names[0])output_names = predictor.get_output_names()output_handles = []for output_name in output_names:output_handle = predictor.get_output_handle(output_name)output_handles.append(output_handle)return predictor, input_handle, output_handles

查看进程

ps -ef|grep python

关闭进程

kill -9 19913

查看日志

tail -f 1000 log.log

如何查看端口占用

$: netstat -anp | grep 8888
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      13404/python3
tcp        0      1 172.17.0.10:34036       115.42.35.84:8888       SYN_SENT    14586/python3

强制杀掉进程:通过pid

$: kill -9 13404
$: kill -9 14586
$: netstat -anp | grep 8888
$:
  • Postman测试请求

识别的时候需要把图片转为base64, 然后 json 请求去提交参数

请求地址:http://127.0.0.1:8866/predict/ch_pp-ocrv3
请求方式:json
请求参数:{“images”: [“图片的base64内容,不需前面的base64标识”]}

  • Python 测试脚本
import requests
import json
import cv2
import base64def 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("你的图片地址"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ch_pp-ocrv3"
r = requests.post(url=url, headers=headers, data=json.dumps(data))# 打印预测结果
print(r.json())

  • curl 测试请求
curl --location --request POST 'http://127.0.0.1:8866/predict/ch_pp-ocrv3' \
--header 'Content-Type: application/json' \
--data-raw '{"images":["图片的base64内容,不需前面的base64标识"]}'

结果返回:

{"msg":[{"data":[{"confidence":0.9314630627632141,"text":"(paddle env][root@M-1-2-centos","text_box_position":[[6,10],[231,10],[231,23],[6,23]]},{"confidence":0.9092367887496948,"text":"ppocr imgl# hub serving start -m chpp-ocrv3 --use_gpu","text_box_position":[[227,10],[612,12],[612,25],[227,23]]},{"confidence":0.939938485622406,"text":"[2022-05-30 19:49:34 +0800]","text_box_position":[[5,25],[191,25],[191,38],[5,38]]},{"confidence":0.8236835598945618,"text":"[28320]","text_box_position":[[200,26],[246,26],[246,37],[200,37]]},{"confidence":0.6653339862823486,"text":"LINFO]","text_box_position":[[256,26],[295,26],[295,37],[256,37]]},{"confidence":0.842379093170166,"text":"starting gunicorn 2o.1.0","text_box_position":[[301,26],[474,26],[474,38],[301,38]]},{"confidence":0.939938485622406,"text":"[2022-05-30 19:49:34 +0800]","text_box_position":[[5,40],[191,40],[191,53],[5,53]]},{"confidence":0.8367705345153809,"text":"[28320]","text_box_position":[[200,41],[247,41],[247,52],[200,52]]},{"confidence":0.86468505859375,"text":"[INFO]","text_box_position":[[257,41],[297,41],[297,52],[257,52]]},{"confidence":0.9211856722831726,"text":"Listening at: http://0.0.0.0:8866 (28320)","text_box_position":[[302,40],[589,40],[589,53],[302,53]]},{"confidence":0.9346868395805359,"text":"[2022-05-3019:49:34+0800]","text_box_position":[[4,55],[191,54],[191,67],[4,68]]},{"confidence":0.9421297311782837,"text":"[28320]","text_box_position":[[199,55],[247,55],[247,68],[199,68]]},{"confidence":0.9394086003303528,"text":"[INFO]","text_box_position":[[256,55],[298,55],[298,68],[256,68]]},{"confidence":0.9321832656860352,"text":"Using worker: sync","text_box_position":[[302,56],[430,56],[430,68],[302,68]]},{"confidence":0.9334865808486938,"text":"[2022-05-30 19:49:34 +0800]","text_box_position":[[4,70],[191,70],[191,83],[4,83]]},{"confidence":0.8994974493980408,"text":"[INFO] ","text_box_position":[[256,70],[305,70],[305,84],[256,84]]},{"confidence":0.8855429887771606,"text":"[28324]","text_box_position":[[200,71],[246,71],[246,82],[200,82]]},{"confidence":0.9438435435295105,"text":"Booting worker with pid: 28324","text_box_position":[[300,70],[515,69],[515,83],[300,84]]}],"save_path":""}],"results":"","status":"000"}

这样就可以正常使用啦,识别速度的话大概在 100-300ms 左右,挺快的。
官方的部署教程:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/deploy/hubserving/readme.md

通过Paddle Serving 部署OCR识别服务

相比较于hubserving部署,PaddleServing具备以下优点:

  • 支持客户端和服务端之间高并发和高效通信
  • 支持 工业级的服务能力 例如模型管理,在线加载,在线A/B测试等
  • 支持 多种编程语言开发客户端,例如C++, Python和Java

先准备PaddleOCR 环境,这里拉去github代码的话会好慢,可以自己先科学下载,然后上传到服务器

git clone https://github.com/PaddlePaddle/PaddleOCR --depth=1

进入到工作目录

cd PaddleOCR/deploy/pdserving/

安装PaddleServing的运行环境,步骤如下

# 安装serving,用于启动服务
wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server_gpu-0.8.3.post102-py3-none-any.whl
pip3 install paddle_serving_server_gpu-0.8.3.post102-py3-none-any.whl# 安装client,用于向服务发送请求
wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.8.3-cp38-none-any.whl
pip3 install paddle_serving_client-0.8.3-cp38-none-any.whl# 安装serving-app
wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_app-0.8.3-py3-none-any.whl
pip3 install paddle_serving_app-0.8.3-py3-none-any.whl
  • 模型转换

使用PaddleServing做服务化部署时,需要将保存的inference模型转换为serving易于部署的模型。

首先,下载PP-OCR的inference模型

# 下载并解压 OCR 文本检测模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar -O ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_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

接下来,用安装的paddle_serving_client把下载的inference模型转换成易于server部署的模型格式。

# 转换检测模型
python3 -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_det_infer/ \--model_filename inference.pdmodel          \--params_filename inference.pdiparams       \--serving_server ./ppocr_det_v3_serving/ \--serving_client ./ppocr_det_v3_client/# 转换识别模型
python3 -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_rec_infer/ \--model_filename inference.pdmodel          \--params_filename inference.pdiparams       \--serving_server ./ppocr_rec_v3_serving/  \--serving_client ./ppocr_rec_v3_client/

检测模型转换完成后,会在当前文件夹多出ppocr_det_v3_serving 和ppocr_det_v3_client的文件夹,具备如下格式:

|- ppocr_det_v3_serving/|- __model__  |- __params__|- serving_server_conf.prototxt  |- serving_server_conf.stream.prototxt|- ppocr_det_v3_client|- serving_client_conf.prototxt  |- serving_client_conf.stream.prototxt
  • Paddle Serving pipeline部署
# 启动服务,运行日志保存在log.txt
nohup python3 -u web_service.py > log.log 2>&1 &


运行日志,没有报错的话就是启动成功啦

然后可以使用他提供的client代码去请求测试一下

查看进程

ps -ef|grep python

关闭进程

kill -9 19913

查看日志

tail -f 1000 log.log

如何查看端口占用

$: netstat -anp | grep 8888
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      13404/python3
tcp        0      1 172.17.0.10:34036       115.42.35.84:8888       SYN_SENT    14586/python3

强制杀掉进程:通过pid

$: kill -9 13404
$: kill -9 14586
$: netstat -anp | grep 8888
$:
  • HTTP请求测试

请求地址:http://127.0.0.1:9998/ocr/prediction
请求方式: json
请求参数:{“key”: “image”, “value”: “图片的base64”}

  • curl请求测试
curl --location --request POST 'http://127.0.0.1:9998/ocr/prediction' \--header 'Content-Type: application/json' \--data-raw '{"key":"image","value":"图片的base64"}'

返回的数据格式:

{"err_no": 0,
"err_msg": "",
"key": ["result"
],
"value": ["[[('(padde env)[root@M-1-2-centoppocrimghub servingstart -m chpp-ocrv3--usegpu', 0.84638405), [[5.0, 10.0], [611.0, 12.0], [611.0, 24.0], [5.0, 22.0]]], [('[2022-05-3019:49:34+0800][28320】[INF0]Startingqunicorm20.1.', 0.81580645), [[5.0, 25.0], [472.0, 25.0], [472.0, 38.0], [5.0, 37.0]]], [('[2022-05-3019:49:34+0800][28320][INF0]Listeningat:http://0.0.0.0:8866(28320)', 0.84695405), [[5.0, 40.0], [589.0, 40.0], [589.0, 54.0], [5.0, 54.0]]], [('[2022-05-319:49:34+0800][28320】[INF0]Usingworker:sync', 0.7949861), [[5.0, 54.0], [430.0, 56.0], [430.0, 68.0], [5.0, 66.0]]], [('[2022-05-319:49:34+080】[28324】[INFO】Bootingworkerwith pid:28324', 0.85473406), [[4.0, 70.0], [515.0, 70.0], [515.0, 84.0], [4.0, 84.0]]]]"
],
"tensors": []
}

这样就完成啦,可以正常使用啦,如果提供其他语言调用的话可以查看他们的官方文档
官方的部署教程:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/deploy/pdserving/README_CN.md

结语

部署这个相对还是挺简单的,Paddle 官方的文档也挺齐全,不过一些特殊文字识别的话还是需要自己去定制训练的。

华为云GPU服务器部署PaddleOCR中英文识别服务相关推荐

  1. 华为云GPU服务器使用PaddleClas和PaddleServing训练、部署车辆类型分类模型服务

    0 前言 以下针对最近使用PaddleClas和PaddleServing在华为云GPU服务器上训练和部署一个车辆类型识别模型过程进行记录,以供日后自己参考和其他有需要的朋友一些帮助,接触这方面东西时 ...

  2. 华为云鲲鹏服务器部署文档--java微服务

    华为云鲲鹏服务器部署文档 河南中电高科计算机技术有限公司 2020.5.9 适用于java微服务技术栈. CentOS 7.6 64bit ISO 适用于鲲鹏服务器arm架构的CentOS 7.6.1 ...

  3. 华为云鲲鹏服务器部署文档-修正版-CentOS+java微服务开发

    华为云鲲鹏服务器部署文档 河南中电高科计算机技术有限公司 http://www.ceht.com.cn 2020.5.12 适用于java微服务开发运行基础软件环境部署,实测通过. CentOS 7. ...

  4. 华为云GPU服务器使用PaddleServing方式部署PaddleClas多个自己训练的识别模型服务

    前言 最近公司需要对图片中的不同的货车品牌和车系进行识别,通过PaddleClas进行模型训练后得到一个品牌识别模型和一个车系识别模型,现在对两个模型部署到一台华为云的GPU服务器上,要对多个模型同时 ...

  5. 腾讯云GPU服务器部署Ai绘画Stable Diffusion 小白可用

    一.服务器购买 本人本地是个win10的PC 安装了 显示GPU 算力不够,升级配置也需要钱 云服务商的选择上,很普通,大家随意选择腾讯云/阿里云/移动云/华为云-都可以.我是之前用的腾讯云,在腾讯云 ...

  6. 华为云GPU服务器深度学习环境搭建

    Author:ZERO-A-ONE Date:2021-02-26 ​ 想了想还是给华为云做一个环境搭建的文档吧,因为某些私人问题 ​ 下面是本人购买的服务器的配置,选择的是按需付费: 机型: CPU ...

  7. 华为云ECS服务器中通过docker部署ELK-kibana

    华为云ECS服务器中通过docker部署ELK-kibana 0.阅读说明 1.ELK简介 2.在华为云ECS中通过docker部署kibana 4.关于Kibana server is not re ...

  8. 在华为云 CCE 上部署 EMQX MQTT 服务器集群

    云进入以「应用为中心」的云原生阶段,Operator 模式的出现,则为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范.通过将运维知识固化成高级语言 Go/Java 代 ...

  9. 华为云ECS服务器中通过docker部署ELK-elasticsearch

    华为云ECS服务器中通过docker部署ELK-elasticsearch 0.阅读说明 1.ELK简介 2.在华为云ECS中通过docker部署Elasticsearch 3.设置elasticse ...

最新文章

  1. Serverless 在大厂都怎么用?
  2. 工业机器人发展现状:硬件制造大同小异,视觉感知绘新蓝图
  3. 极客广州——EOS Asia郭达峰担任SegmentFault思否黑客马拉松技术顾问
  4. HDU 3157 Crazy Circuits(有源汇上下界最小流)
  5. Jenkins系统上的时间不正确问题
  6. easyUI创建人员树
  7. SAP系统和微信集成的系列教程之七:使用Redis存储微信用户和公众号的对话记录
  8. 机器学习:sklearn数据集与机器学习组成
  9. hbase 核心知识
  10. Vuex的核心概念state
  11. 2018自然语言处理与机器学习论文发表统计
  12. ADADELTA: AN ADAPTIVE LEARNING RATE METHOD
  13. linux cisco路由器,Linux用dynamic模拟cisco路由器
  14. 2021-2022 AI工程师薪水趋势:美国、印度、加拿大等
  15. PC解决电子签名的方法
  16. HTML压缩(JSP的GZIP实现)
  17. Excel表数据很少,内存占用很大
  18. Mac电脑C语言开发的入门帖
  19. 自我介绍(思维导图)
  20. deepin允许root登录_deepin官网发布深度操作系统15.10

热门文章

  1. Python控制AutoCAD画换热器,一下解决一个班的课设绘图
  2. SQL 基础篇 SQL 16 查找GPA最高值
  3. FCKEditor用法
  4. 2022-10-15(Linux应急响应、配置漏洞之DNS域传送、内网渗透之内网主机发现技巧)
  5. android root 无法卸载应用,关于卸载android 手机预装应用的方法,无需root
  6. 音视频开发之旅(58) -H.264 帧内预测
  7. dd大牛的背包九讲-背包问题汇总
  8. 工业相机的靶面尺寸怎么算
  9. 制作导出App各尺寸图标:appicontemplace
  10. OBS编译vs2019