zoukankan      html  css  js  c++  java
  • 手把手0基础Centos下安装与部署paddleOcr 教程

    !!!以下内容为作者原创,首发于个人博客园&掘金平台。未经原作者同意与许可,任何人、任何组织不得以任何形式转载。原创不易,如果对您的问题提供了些许帮助,希望得到您的点赞支持。

    0.paddleOcr简介

    paddleOcr 是基于paddlepaddle飞桨这一开源的深度学习平台下训练出来的一个轮子,它的作用正如名称:提取并识别图片中的文字。
    目前paddleOcr 官方已经发布了80+语言的识别模型,针对日常的使用来说是足够了。
    下面就以官方的 中英文通用OCR模型 为例,来一步步教大家如何在centos7的系统中下载、安装、测试、部署服务等全部过程

    下面的教程全程非常详细,适合0基础小伙伴们来学习操作。

    1.写在教程前

    为什么会想着写这样一篇教程?

       其实paddleOcr的github里已经有很详细的教程,有能力和基础的小伙伴完全可以自己看着官方说明搞定所有的问题。但是对没那么熟悉的小伙伴来说就教程显得不那么友好,自己在网上东拼西找一些相关资料,最后还是可能会卡住在1、2个小问题上,导致无法部署成功;

    在教程的最后我会将本次参考到的所有资料与链接放在下面。

    下面直接进入本次教程

    2.centos下准备好docker工具

    正所谓工欲善其事,并先利其器;我们直接用官方准备好的docker环境来安装,会避免掉大部分的问题,但是也会碰到一些小坑,下面会一一说明

    centos下找到在docker安装包并安装

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

    可以自己选择一个稳定的版本安装,或者不指定版本,直接安装最新版本docker-ce.x$6_64.png

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

    Pasted Graphic 1.png

    启动docker服务

    • service docker start 启动docker服务

    Lrootelocalhost ~

    • docker --version 查看docker版本,以检查docker是否正常启动

    [root@localhost ~]# docker --version.png

    • systemctl enable docker 配置一下docker服务开机自启动

    Pasted Graphic 4.png

    3.下载paddleOcr官方docker镜像

    官方github仓库地址 官方gitee仓库地址
    官方建议是去github地址上,但github的访问速度懂的都懂。
    下面的例子以github地址为例,无法访问github的小伙伴去gitee中找到替换的地址

    创建paddleOcr目录

    该目录是用于存放paddleOcr镜像,官方建议是在/home/Projects下
    mkdir /home/Projects 创建项目目录
    cd /home/Projects 进入项目目录

    下载官方镜像

    docker run --name ppocr  -v $PWD:/paddle --network=host -it paddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82 /bin/bash
    说明一下:
    官方的docker命令没有映射运行端口,这里要说明一下:官方启动docker的方式为 network=host,即容器内用的端口就是宿主机的端口
    复制代码

    接下来docker就会自动开始下载镜像了,然后就是漫长的下载等待,大概下载时间会有10分钟左右

    Pasted Graphic 7.png

    下载完毕后,会自动进入到镜像内部的shell里,进入下面这样的界面中。0fgest Sha25693072d145036423016038e088490G0340b1299300143d55026€e469487254cdo.png

    不用理睬,直接exit退出来。

    Localhost home exit.png

    docker ps -a 查看一下docker的运行进程,发现这个这个刚刚下载来的ppocr已经被关闭掉了。Pasted Graphic 11.png

    docker start ppocr 重启这个ppocr容器Pasted Graphic 12.png

    4.安装paddlepaddle2.0

    之前在0.简介里面也说了,paddleOcr是基于paddlepaddle这个平台下的,所以它的运行理所当然离不开paddlepaddle这个平台

    【很重要】检查docker内的python3以及pip3版本

    进入docker容器中,一定要检查一下python3 的版本和 pip3用的版本,要确保版本在3.7及以上,这是官方要求的版本。 但是很坑的是,官方docker你镜像中竟然是3.5.1 的python3。这里必须手动去升级安装新版本

    docker exec -it ppocr /bin/bash 进入docker容器内部[rootelocalhost Projects]# docker exec -it ppocr binbash.png

    python3 --version 检查python3 版本,如图版本是3.5.1,必须要进行升级localhost home python3 --version.png

    pip3 --version 检查pip3版本,如果pip3是3.5.1下的,也要跟着一起升级Pasted Graphic 15.png

    升级安装python3

    容器内已经有python3 的源码安装文件 在/home 目录下,有3.7.0 和 3.8.0 我们直接选择3.8.0 编译安装。E POM..8822084.800 rwon .S.10w R L& 1ee .2.2.0w.png

    cd /Python-3.8.0 进入到Python-3.8.0目录下Pasted Graphic 17.png

    ./configure 编译器会执行一些安装前检查,稍等片刻就会检查完成。ocalnost.png

    make && make install 源码安装,稍等几分钟,等待安装完成。(cd usrlocooini in -s pythons.i pythons.png

    安装完成,重新检查一下python3,pip3版本,确保版本已经升级到3.8.0Localhost homePython-3.8.0 python3 --version.png

    pipJ--verston.png

    【很重要】更新用户环境变量参数

    安装一个vim,方便容器内进行文本编辑

    apt-get update
    apt-get install vim
    复制代码

    locolrost apt-qet update.png

    ne mone or2 T vir atkpr2 1vie stasp MIRIERNGRe 3Y2 1VIR ROSFY.png

    vi ~/.bashrc 修改.bashrc中指定的python环境变量
    在文件编辑中将所有的 python3.5.1 的配置全部删除掉,将下面截图红框处的内容删除掉并保存Pasted Graphic 29.png

    source ~/.bashrc 重新生效配置文件localhost.png

    升级pip3

    解决掉python3版本问题后,就要安装paddleOcr 所需要的环境paddlepaddle2.0

    pip3 install --upgrade pip 升级一下 pip3 (官方安装指导)
    稍等片刻即可Pasted Graphic 22.png

    安装paddlepaddle2.0

    这一步官方的指导里面是区分gpu 还是 cpu版本,下面的例子都是以cpu版本为例。 (请需要安装gpu版本的小伙伴执行到此处稍微移步到官方文档链接中去找一下gpu版本的安装指令)

    python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple
    复制代码

    稍微等待几分钟的下载与更新Pasted Graphic 23.png

    cd /home 切换回目录下

    clone PaddleOcr  仓库代码

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

    tocolhost.png

    安装第三方库

    cd /home/PaddleOCR 切换到PaddleOcr目录下:Pasted Graphic 25.png

    pip3 install -r requirements.txt 安装第三方库

    进入稍微漫长的下载等待。这一步我在实际安装过程中因为网络原因失败过一次,请大家耐心安装,如遇 HTTPSConnectionPool Read timed out. 这样的问题,请多尝试安装几次,等其安装完成。

    Kfre PeanPennS.TA Ce 29)1 N0).png

    5.下载官方模型

    以官方的服务器端模型为例说明。 (官方另为模型包更小的适合移动端的模型,感兴趣的小伙伴小移步官方的文档说明中 github.com/PaddlePaddl…

    docker 镜像中创建模型目录

    mkdir /home/PaddleOCR/inference && cd /home/PaddleOCR/inference 在paddleOCR下创建inference模型目录lecelrost hosefotdleo Rinference leoe2.png

    下载、解压模型

    官方模型分为检测,方向,识别模型,分别下载与解压

    下载检测模型  wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar
    下载方向分类器 wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
    下载识别模型 wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar
    
    解压压缩包
    
    tar xf ch_ppocr_mobile_v2.0_cls_infer.tar
    tar xf ch_ppocr_server_v2.0_det_infer.tar 
    tar xf ch_ppocr_server_v2.0_rec_infer.tar
    复制代码

    解压完成后的目录如下Pasted Graphic 34.png

    6.单张图片识别测试

    回到/home/paddleOCR目录下

    cd /home/PaddleOCR

    图片测试

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

    测试命令为:
    python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_server_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_server_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False
    复制代码

    以下分别是原图,识别后标识图,以及识别结果

    纯臻营养护发素.png

    纯臻营养护发素.png

    Pasted Graphic 35.png

    7.服务部署

    单张图片测试通过后,我们就需要把服务以WEB方式部署上,以供其它服务以接口形式来调用了。

    PaddleHub Server 服务部署

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

    安装paddlehub 环境

    在docker镜像中执行以下命令
    pip3 install paddlehub==1.8.3 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
    稍等片刻即可下载完成Pasted Graphic 38.png

    修改部署参数文件

    部署参数文件地址为docker镜像中: /home/PaddleOCR/deploy/hubserving/ocr_system 下的 params.py

    用vi 打开params.py ,将下图红框处的3个文件地址分别修改为下面地址:
    /home/PaddleOCR/inference/ch_ppocr_server_v2.0_det_infer/
    /home/PaddleOCR/inference/ch_ppocr_server_v2.0_rec_infer/
    /home/PaddleOCR/inference/ch_ppocr_mobile_v2.0_cls_infer/
    其它参数暂时不需要修改
    复制代码

    fo. .olgorktr.png

    安装服务模块

    安装检测+识别串联服务模块:
    hub install deploy/hubserving/ocr_system/localhost.png

    安装flask

    下面使用flask 部署web框架 pip3 install flasksnaoed aikcoor.12 tn Maeforoin(enheny waftepol Kfroe faty c.e.1).png

    安装flask-cors

    pip3 install flask-corsPasted Graphic 43.png

    新建web服务程序

    在 /home/PaddleOCR/tools 目录下新建一个新的py文件,文件名为test_myocr.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:8866/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)
    复制代码

    启动服务

    服务分为hub服务、web服务

    启动hub服务

    【很重要】 export PATHONPATH=.这步很重要,血泪教训哇;

    如果少了这一步设置环境变量,在下面的执行中会报错,提示找不到tools module

    hub serving start -m ocr_system & 成功会出现如下说明lecalhost oneMolrod reioasoel hdb stcog Srart KotL.png

    启动web服务

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

    grp BrLNg sIPeeTECA ss drgrecene. oleore see on olfes or Merip.png

    8.服务测试

    Postman工具调用测试

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

    Vue简单页面测试

    使用vue写一个简单的图片上传页面,后端接口负责转发数据与请求到5000接口中 这块后面有时间再单独写篇介绍下截屏2021-07-19 22.36.19.png

    9.性能分析

    测试机配置

    测试机器是在实体机器中使用VM虚拟化出来的

    实体机:
    cpu: AMD Ryzen 5 2600X Six-Core Processor
    内存:32G
    操作系统:window10 x64
    
    虚拟Centos:
    处理器:4核单线程
    内存:8GB
    操作系统:Centos 7.8
    复制代码

    以下解析时间仅供参考
    在没做任何优化情况下,且不考虑网络传输速度的影响,单张6.中的官方自带测试图片,解析时间分别为:

    docker中直测:11秒
    postman:17秒
    vue中:18秒
    复制代码

    10.参考资料

    PaddleOCR github
    PaddleOCR安装与实践(CPU版)

  • 相关阅读:
    git reset 用法
    print、println、printf的区别
    GoLang(2)
    GoLang
    OpenCV 图像叠加or图像混合加权实现
    openpyxl
    EJB 的理解
    inotify-tool实时监控服务器文件状态变化 学习总结
    使用docker 安装maven私服 nexus
    dockerfile 学习总结
  • 原文地址:https://www.cnblogs.com/jedi2015/p/15038727.html
Copyright © 2011-2022 走看看