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

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

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

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

启动docker服务

  • service docker start 启动docker服务

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

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

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分钟左右

下载完毕后,会自动进入到镜像内部的shell里,进入下面这样的界面中。

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

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

docker start ppocr 重启这个ppocr容器

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容器内部

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

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

升级安装python3

容器内已经有python3 的源码安装文件 在/home 目录下,有3.7.0 和 3.8.0 我们直接选择3.8.0 编译安装。

cd /Python-3.8.0 进入到Python-3.8.0目录下

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

make && make install 源码安装,稍等几分钟,等待安装完成。

安装完成,重新检查一下python3,pip3版本,确保版本已经升级到3.8.0

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

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

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

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

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

升级pip3

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

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

安装paddlepaddle2.0

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

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

稍微等待几分钟的下载与更新

cd /home 切换回目录下

clone PaddleOcr  仓库代码

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

安装第三方库

cd /home/PaddleOCR 切换到PaddleOcr目录下:

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

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

5.下载官方模型

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

docker 镜像中创建模型目录

mkdir /home/PaddleOCR/inference && cd /home/PaddleOCR/inference 在paddleOCR下创建inference模型目录

下载、解压模型

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

下载检测模型  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
复制代码

解压完成后的目录如下

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
复制代码

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

7.服务部署

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

PaddleHub Server 服务部署

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

安装paddlehub 环境

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

修改部署参数文件

部署参数文件地址为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/
其它参数暂时不需要修改
复制代码

安装服务模块

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

安装flask

下面使用flask 部署web框架 pip3 install flask

安装flask-cors

pip3 install flask-cors

新建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 & 成功会出现如下说明

启动web服务

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

8.服务测试

Postman工具调用测试

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

Vue简单页面测试

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

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版)

手把手0基础Centos下安装与部署paddleOcr 教程的更多相关文章

  1. centos下安装docker最新版教程

    1.通过yum安装需要root或者能sudo的权限 yum包更新到最新$ sudo yum update 添加Docker yum源$ sudo tee /etc/yum.repos.d/docker ...

  2. centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'

    centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法 3.7版本需要一个新的包libffi-de ...

  3. Centos下Kubernetes+Flannel部署(新)

    一.准备工作 1) 三台centos主机 k8s master: 10.11.151.97  tc-151-97 k8s node1: 10.11.151.100  tc-151-100 k8s no ...

  4. centos下kubernetes+flannel部署(旧)

    更合理的部署方式参见<Centos下Kubernetes+Flannel部署(新)> 一.准备工作 1. 三台centos主机 k8s(即kubernetes,下同)master: 10. ...

  5. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...

  6. CentOS下安装hadoop

    CentOS下安装hadoop 用户配置 添加用户 adduser hadoop passwd hadoop 权限配置 chmod u+w /etc/sudoers vi /etc/sudoers 在 ...

  7. CentOS下安装setuptools、pip和virtualenv

    已经安装了Python,现在我们可以最终确定完成应用程序生产和部署的基础知识.为此,我们将设立两个最常用的工具:PIP封装经理和virtualenv中的环境管理. 一.安装setuptools set ...

  8. Linux CentOS下安装Tomcat9

    本文讲解在Linux CentOS下安装Tomcat9,以及Web项目的部署发布. 环境:阿里云ECS 云服务器Linux CentOS 使用XShell客户端连接服务器,进行操作实践. 1.下载To ...

  9. CentOS下利用Docker部署Surging

    原文:CentOS下利用Docker部署Surging 1. 安装Centos, 配置固定ip配置文件地址vi /etc/sysconfig/network-scripts/ifcfg-ens33`` ...

随机推荐

  1. cmodel模拟器开发

    cmodel模拟器开发 对于一个公司来说,产品的设计周期就是生命线,一般来说都会在设计功能级仿真的c-model后直接转向RTL设计. 在目前的技术下,做cycle-by-cycle的设计和直接RTL ...

  2. AIFramework框架Jittor特性(上)

    AIFramework框架Jittor特性(上)

  3. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...

  4. 将HLSL射线追踪到Vulkan

    将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...

  5. DMS是临时解决方案?

    DMS是临时解决方案? Who Says DMS Is an Interim Solution? 现在是认真对待DMS驱动程序监控系统的时候了. 特斯拉(Tesla)在台湾高速公路上撞上翻倒卡车的镜头 ...

  6. Contos8 安装 MariaDb 时报错:Could not open mysql.plugin table: table mysql.plugin

    导语: 因个人服务器误删了一些文件导致MariaDB崩溃,一直在报错,所以想着重装一下,没想到在重装后启动时再次报错(与之前报错不同),这次的报错原因大致是因为某些插件表找不到. 因此又开启了漫长的寻 ...

  7. Python批量重命名 工具贴(一)

    说明 由于在处理图片数据和其他数据时,经常需要对数据进行批量重命名操作,每次使用时都需要重写,非常不便,因此记录下重命名代码方便后续使用. 文件结构说明 参数说明: path为输入路径 image_t ...

  8. 四、缓存DNS

    作用:缓存解析结果,提高解析速度 搭建方式: 1.全局转发,所有的DNS解析请求全部转发给公网DNS 2.根域迭代,所有的DNS解析请求全部发给根域DNS服务器 真机上实现缓存DNS服务器 1.搭建Y ...

  9. JVM 内存溢出 实战 (史上最全)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  10. Java8中一个极其强悍的新特性,很多人没用过(非常实用)

    Java8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream.如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中.这篇文章由简入繁逐步介绍Str ...