「OCR」paddleOCR

背景

paddleOCR 是百度基于 PaddlePaddle 开发的一款开源 OCR(Optical Character Recognition 光学字符识别) 工具集,旨在提供高精度、高效率的文字识别和文本检测服务,支持包括中英文在内的多种语言。本文将介绍 PaddleOCR 的主要特点和使用方法。

网站

官网: https://www.paddlepaddle.org.cn/

Github: https://github.com/PaddlePaddle/PaddleOCR

特点

  1. 高精度识别:PaddleOCR 提供多种预训练模型,可以处理各种不同类型的文档和图片,包括通用场景、特定行业领域、手写体等。它还支持 FineTune 模式,可以让用户自行训练模型以适应特定场景的需求。
  2. 多种文本检测算法:PaddleOCR 支持 EAST、DB、SAST、PSENet 等多种文本检测算法,可以适应不同类型的文档和图片,并提供多种参数配置和优化选项,以满足不同场景的需求。
  3. 多种输出格式:PaddleOCR 支持输出多种格式的识别结果,包括 bbox、quad、mask 等,可以方便地进行后续处理和分析。
  4. 快速和高效:PaddleOCR 基于 PaddlePaddle 深度学习框架,提供了高效、可扩展的计算能力,在保证识别精度的同时,也可以快速地处理大量数据。

使用

PaddleOCR 的使用方法非常简单,只需要三步即可完成文本识别和检测任务:

  1. 安装 PaddleOCR:可以通过 pip 或源码编译的方式安装 PaddleOCR。具体的安装方法可以参考 PaddleOCR 的官方文档。
  2. 加载模型:PaddleOCR 提供多个预训练模型可供选择,包括通用场景 OCR、身份证 OCR、车牌 OCR 等。可以使用 PaddleOCR 的 API 加载所需的模型。
  3. 进行文本识别和检测:加载模型后,就可以调用相应的 API 对文本进行识别和检测了。

安装 paddlepaddle

1
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple\

安装PaddleOCR whl包

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

图片

在图片目录中使用命令行执行识别:

1
paddleocr --image_dir ./imgs/示例图片.jpg --use_angle_cls true --use_gpu false
  • 检测+方向分类器+识别全流程:--use_angle_cls true设置使用方向分类器识别180度旋转文字,--use_gpu false设置不使用GPU

PDF

1
paddleocr --image_dir ./xxx.pdf --use_angle_cls true --use_gpu false --page_num 2
  • 可以通过指定参数page_num来控制推理前面几页,默认为0,表示推理所有页。

如需新增自己训练的模型,可以在paddleocr中增加模型链接和字段,重新编译即可。

更多whl包使用可参考whl包文档

多语言

1
paddleocr --image_dir ./imgs_en/254.jpg --lang=en

PaddleOCR目前支持80个语种,可以通过修改--lang参数进行切换,对于英文模型,指定--lang=en

常用的多语言简写包括

语种缩写语种缩写语种缩写
中文ch法文fr日文japan
英文en德文german韩文korean
繁体中文chinese_cht意大利文it俄罗斯文ru

全部语种及其对应的缩写列表可查看多语言模型教程

Python

入门

可以使用以下 Python 代码来进行通用 OCR 识别:

1
2
3
4
5
import paddleocr
ocr = paddleocr.OCR()
result = ocr.ocr('image.jpg')
for line in result:
print(line)

以上代码将加载通用 OCR 模型,并对名为 image.jpg 的图片进行识别。识别结果将以列表形式返回,每个元素表示一行文字。

图片

  • 检测+方向分类器+识别全流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory
img_path = './imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)

# 显示结果
# 如果本地没有simfang.ttf,可以在doc/fonts目录下下载
from PIL import Image
result = result[0]
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='doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

可以将这个方法包装成函数,提供给接口调用,返回 res 结果

1
2
3
4
5
6
7
8
9
10
11
12
from paddleocr import PaddleOCR

def read(filePath):
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory
img_path = filePath
result = ocr.ocr(img_path, cls=True)
res = []
for idx in range(len(result)):
res = result[idx]
return res

PDF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=2) # need to run only once to download and load model into memory
img_path = './xxx.pdf'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)

# 显示结果
import fitz
from PIL import Image
import cv2
import numpy as np
imgs = []
with fitz.open(img_path) as pdf:
for pg in range(0, pdf.pageCount):
page = pdf[pg]
mat = fitz.Matrix(2, 2)
pm = page.getPixmap(matrix=mat, alpha=False)
# if width or height > 2000 pixels, don't enlarge the image
if pm.width > 2000 or pm.height > 2000:
pm = page.getPixmap(matrix=fitz.Matrix(1, 1), alpha=False)

img = Image.frombytes("RGB", [pm.width, pm.height], pm.samples)
img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
imgs.append(img)
for idx in range(len(result)):
res = result[idx]
image = imgs[idx]
boxes = [line[0] for line in res]
txts = [line[1][0] for line in res]
scores = [line[1][1] for line in res]
im_show = draw_ocr(image, boxes, txts, scores, font_path='doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result_page_{}.jpg'.format(idx))

其他

  • 稳定版本:python 3.7.9,numpy 要指定安装 1.19.3 及以下版本
1
pip install numpy==1.19.3
  • 提示 ModuleNotFoundError: No module named 'common' 异常

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import common, dual, tight, data, prox
    ModuleNotFoundError: No module named 'common'
    [end of output]

    note: This error originates from a subprocess, and is likely not a problem with pip.
    error: metadata-generation-failed

    × Encountered error while generating package metadata.
    ╰─> See above for output.

    需要安装common、dual、tight、data、prox模块:

    1
    2
    3
    4
    5
    pip install common -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install dual -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install tight -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install data -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install prox -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 提示 ModuleNotFoundError: No module named 'paddle’ 或者 No module named ‘paddle.fluid’

    重新安装依赖包 Image \ paddleOCR

    1
    2
    pip install Image -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple

总结

PaddleOCR 是一款高精度、高效率的 OCR 工具集,可以适应不同类型的文档和图片,并支持多种输出格式。通过简单的 API 调用就可以进行文本识别和检测,并在实际应用中发挥重要作用。

参考

PaddleOCR 快速开始