PaddleOCR Linux-Centos7.6安装与部署

Elysian
2024-09-10 / 0 评论 / 44 阅读 / 正在检测是否收录...

1. 运行环境准备

本人环境为阿里云服务器centos 7.6(全新镜像系统)从0开始部署PaddleOCR

1.1 参考资料

PaddleOCR 运行环境准备
PaddleOCR 快速开始
手把手0基础Centos下安装与部署paddleOcr 教程 
PaddleOCR基于PaddleHub Serving的服务部署(docker环境)
新手Docker安装PaddleOCR快速指导(非长期有效具体看更新时间) (ziyoukaifa.com)
PaddleOCR Linux-Centos7.6安装与部署

1.2 PaddleOCR的环境

推荐环境:

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

2. centos下准备好docker工具

可以自己选择一个稳定的版本安装,或者不指定版本,直接安装最新版本

2.1 备份之前的yum源文件

cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo_bak

2.2 更换yum源为阿里云

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.3 清除缓存并生成新的缓存

yum.repos.d]# yum clean all
yum makecache

2.4测试发现还是报错

yum list docker-ce --showduplicates | sort -r



Error: No matching Packages to list
\* updates: mirrors.bfsu.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
\* extras: mirrors.bfsu.edu.cn
\* base: mirrors.bfsu.edu.cn

2.5 添加仓库

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.6 IF ERROR: yum-config-manager: command not found

yum -y install yum-utils
yum clean all
yum makecache

2.7 再次测试,发现OK

yum list docker-ce --showduplicates | sort -r

//显示如下
docker-ce.x86\_64            3:20.10.0-3.el7                     docker-ce-stable

2.8 yum install docker-ce接下来就是yum来安装docker完成

yum install docker-ce

2.9 启动docker服务

service docker start

2.10 查看docker版本,检查docker是否安装成功

docker --version

#显示如下
Docker version 24.0.2, build cb74dfc

2.11 配置docker服务开机自启动

systemctl enable docker

76a7941af6e12f690b368a01da2f27f4.png

3.Docker环境配置

切换到工作目录下

mkdir /home/Projects
cd /home/Projects

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

3.1镜像下载

接下来docker就会自动开始下载镜像了,然后就是漫长的下载等待,大概下载时间会有10分钟左右
在CPU环境下使用docker,使用docker而不是nvidia-docker创建docker

sudo 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

下载完毕后,会自动进入到镜像内部的shell里,进入下面这样的界面中。
我们先直接输入exit退出
2dsfssdf.png
exit

3.2查看docker中的运行进程

docker ps

3.3启动ppocr这个容器

docker start ppocr

3.4进入ppocr容器

sudo docker container exec -it ppocr /bin/bash

3.5 检查docker内的python3以及pip3版本

python>=3.7.0

4.安装最新PaddlePaddle(2.4.2)

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

4.1 安装PaddleOCR whl包

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

这个包一般下载得会比较久
3dsfssdf.png

4.2 包版本依赖不兼容报错问题

4dsfssdf.png
Paddlepaddle 2.4.2需要protobuf<=3.20.0,>=3.1.0,但你有protobuf 4.23.2,这是不兼容的。

4.2.1 重新换一个 protobuf 版本

/home pip uninstall protobuf
/home pip install protobuf==3.20.0

5dsfssdf.png
OK没有其它包不兼容了,如果还存在包兼容问题根据错误提示升级或降级对应包即可

4.3 clone PaddleOCR仓库代码

cd /home
git clone https://github.com/PaddlePaddle/PaddleOC   #【推荐】
#如果无法访问github 的小伙伴们也可以通过gitee仓库里面将源码下载下来:
git clone https://gitee.com/paddlepaddle/PaddleOCR

5. 安装paddlehub(2.2.0)

cd /home/PaddleOCR

安装paddlehub

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

5.0.1 jupyter-console 包依赖冲突

错误:pip的依赖解析器目前没有考虑所有已安装的包。这种行为是下列依赖冲突的根源。Jupyter-console 6.4.0需要prompt-toolkit!=3.0.0,!=3.0.1,❤️.1.0,>=2.0.0,但您有不兼容的prompt-toolkit 1.0.18

5.0.2 更换 Jupyter-console 版本

卸载Jupyter-console

pip3 uninstall jupyter-console
pip3 install jupyter-console==4.0.2

5.1 安装requirements.txt 依赖

pip install -r requirements.txt -i https://pypi.douban.com/simple

#如果提示albumentations包版本不存在则将requirements.txt中的albumentations包版本替换成
#albumentations==1.3.1

6. 下载轻量的推理模型

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

检测模型:./inference/ch_PP-OCRv3_det_infer/
识别模型:./inference/ch_PP-OCRv3_rec_infer/
方向分类器:./inference/ch_ppocr_mobile_v2.0_cls_infer/
进入/home/PaddleOCR/deploy/hubserving/ocr_system下

cd /home/PaddleOCR/deploy/hubserving/ocr_system
# 下载并解压检测模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_infer.tar && rm -rf ch_PP-OCRv3_det_infer.tar
# 下载并解压识别模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar && tar -xf ch_PP-OCRv3_rec_infer.tar && rm -rf ch_PP-OCRv3_rec_infer.tar
# 下载并解压方向分类器
wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar -xf ch_ppocr_mobile_v2.0_cls_infer.tar && rm -rf ch_ppocr_mobile_v2.0_cls_infer.tar

全部下载解压完后输ls查看目录确认
6dsfssdf.png

6.1 修改模型路径

修改三个dir,注意要绝对路径,以及rec_imgage_shape最新PP-OCR3为3.48.320
7dsfssdf.png

6.2 单张图片识别测试

回到 cd /home/paddleOCR 目录下
图片测试
用官方自带的图片来测试识别,官方自带图片目录为
/home/PaddleOCR/doc/imgs

python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="/home/PaddleOCR/deploy/hubserving/ocr_system/ch_PP-OCRv3_det_infer/"  --rec_model_dir="/home/PaddleOCR/deploy/hubserving/ocr_system//ch_PP-OCRv3_rec_infer/" --cls_model_dir="/home/PaddleOCR/deploy/hubserving/ocr_system/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls true --use_gpu false

8dsfssdf.png

7. PaddleHub Server 服务部署

这种部署形式也是官方推荐的部署方式之一。

7.1 安装服务模块

PaddleOCR提供3种服务模块,根据需要安装所需模块

安装检测+识别串联服务模块即可
cd /home/PaddleOCR
安装检测服务模块:
hub install deploy/hubserving/ocr_det/
或,安装分类服务模块:
hub install deploy/hubserving/ocr_cls/
或,安装识别服务模块:
hub install deploy/hubserving/ocr_rec/
或,安装检测+识别串联服务模块:
hub install deploy/hubserving/ocr_system/

7.2 自定义修改服务模块(后续,现可跳过)

如果需要修改服务逻辑,你一般需要操作以下步骤(以修改ocr_system为例):

7.2.1 停止服务

hub serving stop --port/-p XXXX

7.2.2 修改参数

到相应的module.pyparams.py等文件中根据实际需求修改代码。

例如,如果需要替换部署服务所用模型,则需要到 params.py 中修改模型路径参数det_model_dirrec_model_dir,如果需要关闭文本方向分类器,则将参数use_angle_cls置为False,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。 强烈建议修改后先直接运行module.py调试,能正确运行预测后再启动服务测试。

7.2.3 卸载旧服务包

hub uninstall ocr_system

7.2.4 安装修改后的新服务包

hub install deploy/hubserving/ocr_system/

7.2.5 重新启动服务

hub serving start -m ocr_system

7.3 hub 配置文件

9dsfssdf.png
10dsfssdf.png
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

7.4 启动 hub 服务命令

hub serving start -c config.json
成功会出现以下说明,后续测试记得将8868端口放开
11dsfssdf.png

8. 部署 web 服务程序

8.1 安装flask,flask-cors

下面使用flask 部署web框架

cd /home/PaddleOCR/tools
pip3 install flask

安装flask-cors

pip3 install flask-cors

8.2 新建web服务程序

在 /home/PaddleOCR/tools 目录下新建一个新的py文件,文件名为testmyocr.py 并且给权限为 775
testmyocr.py的内容如下:

# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.  


#  


# Licensed under the Apache License, Version 2.0 (the "License");  


# you may not use this file except in compliance with the License.  


# You may obtain a copy of the License at  


#  


#     http://www.apache.org/licenses/LICENSE-2.0  


#  


# Unless required by applicable law or agreed to in writing, software  


# distributed under the License is distributed on an "AS IS" BASIS,  


# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  


# See the License for the specific language governing permissions and  


# limitations under the License.  


import os  


import sys  


__dir__ = os.path.dirname(os.path.abspath(__file__))  


sys.path.append(__dir__)  


sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))

 

from ppocr.utils.logging import get_logger  


logger = get_logger()

 

import cv2  


import numpy as np  


import time  


from PIL import Image  


from ppocr.utils.utility import get_image_file_list  


from tools.infer.utility import draw_ocr, draw_boxes

 

import requests  


import json  


import base64

 

from flask import Flask,request  


from flask_cors import CORS

 

import requests  


app = Flask(__name__)  


CORS(app)  # 解决跨域问题

 

def cv2_to_base64(image):  


    return base64.b64encode(image).decode('utf8')

 

def draw_server_result(image_file, res):  


    img = cv2.imread(image_file)  


    image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  


    if len(res) == 0:  


        return np.array(image)  


    keys = res[0].keys()  


    if 'text_region' not in keys:  # for ocr_rec, draw function is invalid  


        logger.info("draw function is invalid for ocr_rec!")  


        return None  


    elif 'text' not in keys:  # for ocr_det  


        logger.info("draw text boxes only!")  


        boxes = []  


        for dno in range(len(res)):  


            boxes.append(res[dno]['text_region'])  


        boxes = np.array(boxes)  


        draw_img = draw_boxes(image, boxes)  


        return draw_img  


    else:  # for ocr_system  


        logger.info("draw boxes and texts!")  


        boxes = []  


        texts = []  


        scores = []  


        for dno in range(len(res)):  


            boxes.append(res[dno]['text_region'])  


            texts.append(res[dno]['text'])  


            scores.append(res[dno]['confidence'])  


        boxes = np.array(boxes)  


        scores = np.array(scores)  


        draw_img = draw_ocr(  


            image, boxes, texts, scores, draw_txt=True, drop_score=0.5)  


        return draw_img

 

@app.route("/test")  


def test():  


    return 'Hello World!'

 

@app.route("/myocr", methods=["POST"] )  


def myocr():  


    # 输入参数  


    image_file = request.files['file']  


    basepath = os.path.dirname(__file__)

 

    logger.info("{} basepath".format(basepath))

 

    savepath = os.path.join(basepath, image_file.filename)  


    image_file.save(savepath)  


    img = open(savepath, 'rb').read()  


    if img is None:  


        logger.info("error in loading image:{}".format(image_file))

 

    # 转为 base64  


    data = {'images': [cv2_to_base64(img)]}  


    # 发送请求  


    url = "http://127.0.0.1:8868/predict/ocr_system"  


    headers = {"Content-type": "application/json"}  


    r = requests.post(url=url, headers=headers, data=json.dumps(data))

 

    # 返回结果  


    res = r.json()["results"][0]  


    logger.info(res)  


    return  json.dumps(res)  


if __name__ == '__main__':  


    app.run(host='0.0.0.0', port=5000)

8.3 启动web服务

cd /home/PaddleOCR/tools 目录切换到tools下 python3 testmyocr.py & 启动web服务,启动成功会出现如下说明
12dsfssdf.png

9. Postman工具调用测试**

使用postman向 5000端口去发起请求,可以看到服务正常返回识别的结果
13dsfssdf.png

0

评论

博主关闭了所有页面的评论