手把手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
可以自己选择一个稳定的版本安装,或者不指定版本,直接安装最新版本
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.参考资料
手把手0基础Centos下安装与部署paddleOcr 教程的更多相关文章
- centos下安装docker最新版教程
1.通过yum安装需要root或者能sudo的权限 yum包更新到最新$ sudo yum update 添加Docker yum源$ sudo tee /etc/yum.repos.d/docker ...
- centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'
centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法 3.7版本需要一个新的包libffi-de ...
- 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 ...
- centos下kubernetes+flannel部署(旧)
更合理的部署方式参见<Centos下Kubernetes+Flannel部署(新)> 一.准备工作 1. 三台centos主机 k8s(即kubernetes,下同)master: 10. ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- CentOS下安装hadoop
CentOS下安装hadoop 用户配置 添加用户 adduser hadoop passwd hadoop 权限配置 chmod u+w /etc/sudoers vi /etc/sudoers 在 ...
- CentOS下安装setuptools、pip和virtualenv
已经安装了Python,现在我们可以最终确定完成应用程序生产和部署的基础知识.为此,我们将设立两个最常用的工具:PIP封装经理和virtualenv中的环境管理. 一.安装setuptools set ...
- Linux CentOS下安装Tomcat9
本文讲解在Linux CentOS下安装Tomcat9,以及Web项目的部署发布. 环境:阿里云ECS 云服务器Linux CentOS 使用XShell客户端连接服务器,进行操作实践. 1.下载To ...
- CentOS下利用Docker部署Surging
原文:CentOS下利用Docker部署Surging 1. 安装Centos, 配置固定ip配置文件地址vi /etc/sysconfig/network-scripts/ifcfg-ens33`` ...
随机推荐
- Python+Selenium学习笔记2 - 字符串
跟着网络课程学了几个小程序. 1.判断a字符串是否为b字符串的子串 1 # coding = utf-8 2 3 # 判断str_a字符串是否为str_b字符串的子串 4 5 str_a = &quo ...
- TinyML-TVM如何驯服TinyML
TinyML-TVM如何驯服TinyML 低成本,以人工智能为动力的消费类设备的激增,导致机器学习研究人员和从业人员对"裸机"(低功耗,通常没有操作系统)设备产生了广泛的兴趣.尽管 ...
- 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式
直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...
- 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础
欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...
- 【NX二次开发】Block UI 线宽
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- docker2-镜像原理及创建新的镜像
1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...
- base64的实现原理
base64是处理二进制数据的一种编码方式,可用于把二进制数据编码成64个可打印的字符. 学习base64之前,先了解一下什么是字节与编码 什么是字节 互联网中的数据都是用字节来表示的,一个字节有8位 ...
- 重新整理 .net core 实践篇————熔断与限流[三十五]
前言 简单整理一下熔断与限流,跟上一节息息相关. 正文 polly 的策略类型分为两类: 被动策略(异常处理.结果处理) 主动策略(超时处理.断路器.舱壁隔离.缓存) 熔断和限流通过下面主动策略来实现 ...
- Unity il2cpp加密
防市面上百分之九十的破解者,下面是Mono改为il2cpp的面板 点击:File > BuildSettings > PlayerSettings > OtherSettings & ...
- Docker减小镜像体积
导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...