目录
更新时间:2022年02月07日 新增: 本地调用OCR
什么是Paddle OCR?
Paddle OCR特性:
- 超轻量级中文OCR,总模型仅8.6M
- 单模型支持中英文数字组合识别、竖排文本识别、长文本识别
- 检测模型DB(4.1M)+识别模型CRNN(4.5M)
- 多种文本检测训练算法,EAST、DB
- 多种文本识别训练算法,Rosetta、CRNN、STAR-Net、RARE
本教程旨在帮助使用者快速了解PaddleOCR,并掌握PaddleOCR的使用方式,包括:
-
- PaddleOCR快速使用
-
- 文本检测模型的训练方式
-
- 文件识别模型的训练方式
以上摘抄至: PaddleOCR使用教程 - 飞桨AI Studio - 人工智能学习与实训社区
导言
上文是官方的教程和介绍,但是属于部署在Linux端口上的,所以就希望每个喜欢代码的小伙伴也能简单易上手,所以出了个在window端的部署,使用的版本如下:
Window 10 系统
python 3.8
Pycharm
下载源码
配置环境
安装依赖库
在下载的文件夹下运行cmd命令:
pip install -r requirments.txt -i https://mirror.baidu.com/pypi/simple
报错处理办法:
这里有个很奇怪的报错问题,官方教程里命令行的安装,出现了找不到文件的提示:
[Errno 2] No such file or directory: 'requirments.txt'
后来我才发现原来下载的代码和官方教程出现的偏差
这个地方少了个E,所以各位小伙伴运行报错找不到文件可以查看一下文件名是否正确
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
运行前需要确认pip的版本是否满足要求,要求pip版本为9.0.1+。可通过事先升级pip,运行如下命令:
pip install --upgrade pip
下载模型
文本检测模型
https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
配置模型
手动创建: inference 文件夹 在文件夹内再创建个det 文件
将下载的三个文件放置到 PaddleOCR-release-2.3 \ inference \ det 文件夹下
执行以下代码
(作者图片文件路径:E:\ png\2.jpg)
python tools/infer/predict_det.py --image_dir="E:\png\2.jpg" --det_model_dir="./inference/det/" --use_gpu=False
文本效果:
执行成功会有个新的文件夹 inference_results
文档识别效果(还不错,大部分都识别出来了)
到这一步就都差不多了,可以开始识别文字了,在文件夹PaddleOCR下新建py文件
文字OCR识别
from paddleocr import PaddleOCR
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
from paddleocr import PaddleOCR, draw_ocr
font=cv2.FONT_HERSHEY_SIMPLEX
# Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换
# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch",use_gpu=False,
rec_model_dir='./models/ch_ppocr_server_v2.0_rec_infer/',
cls_model_dir='./models/ch_ppocr_mobile_v2.0_cls_infer/',
det_model_dir='./models/ch_ppocr_server_v2.0_det_infer/') # need to run only once to download and load model into memory
img_path = r'E:\png\1643776550(1).jpg'
result = ocr.ocr(img_path, cls=True)
# 显示结果
from PIL import Image
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.png')
print(txts)
文字OCR识别结果:
(这一步会自己下载文件,有个进度条稍微等待一下就行了)
左边的是文字,后面的小数点是文字的置信区间
做到这一步基本已经实现了本地部署OCR,但是我们有时候需要OCR给我们返回正确的识别文字结果。
在PddleOCR文件夹下,新建一个py文件,叫什么都行。
我们使用flask,在本地主机上开一个后端接口,方便我们调用。
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=["GET"])
def hello_world():
return 'hello world'
@app.route("/ocr", methods=["POST"])
def ocr_html_post():
data = request.files
file = data['file']
# print(file.filename)
# 文件写入磁盘
file.save(file.filename)
ocr_str = ocr(file.filename)
return str(ocr_str)
def ocr(img_path):
import cv2
from paddleocr import PaddleOCR
# font = cv2.FONT_HERSHEY_SIMPLEX
# Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换
# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False,
rec_model_dir='./models/ch_ppocr_server_v2.0_rec_infer/',
cls_model_dir='./models/ch_ppocr_mobile_v2.0_cls_infer/',
det_model_dir='./models/ch_ppocr_server_v2.0_det_infer/') # need to run only once to download and load model into memory
# img_path = r'E:\png\1643776550(1).jpg'
result = ocr.ocr(img_path, cls=True)
# 显示结果
# image = Image.open(img_path).convert('RGB')
# boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
# scores = [line[1][1] for line in result]
# im_show = draw_ocr(image, boxes, txts, scores, font_path='./simfang.ttf')
# im_show = Image.fromarray(im_show)
# im_show.save('result.png')
# print(txts)
return txts
if __name__ == '__main__':
app.run(port=5001, debug=True)
运行之后就部署了本地OCR识别服务,我们在使用的时候就可以直接调用就行。
这个后端就需要一直保持开启,直到使用完毕再关闭
然后我们调用OCR
本地调用代码:
import os
import requests
def ocr_Paddle(root, name):
# root = 'E:\\png'
# name = '2.png'
file = os.path.join(root, name)
files_t = {'file': (name, open(file, 'rb'))}
headers = {'File-Name': name}
r = requests.post("http://127.0.0.1:5001/ocr", files=files_t, headers=headers)
print(eval(r.text))
return eval(r.text)
root是路径,name是文件名运行之后就返回识别文字结果。
识别结果:
这样我们就完成了OCR的本地部署