PaddleOCR
PaddleOCR 是什么?
PaddleOCR 是百度推出的一款基于 PaddlePaddle 深度学习框架的 OCR 工具,支持中英文、数字、小数、日期、二维码、表格、公式、身份证、名片、火车票、护照、行驶证、驾驶证、车牌、营业执照、银行卡
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install "paddleocr>=2.0.1" --upgrade PyMuPDF==1.21.1
# 或者
# 首先安装依赖库:CPU 版本的 paddlepaddle
poetry add paddlepaddle
# 如果要安装 GPU 版本,使用指令
poetry add paddlepaddle-gpu
# 然后安装 PaddleOCR
poetry add PyMuPDF==1.21.1 # 由于 paddleocr 依赖的 PyMuPDF 版本有问题,所以需要指定版本
poetry add paddleocr>=2.0.1
加上
[[tool.poetry.source]]
name = "mirror"
url = "https://mirror.baidu.com/pypi/simple"
default = true
安装完成后您可以使用 python 进入 python 解释器,输入 import paddle ,再输入 paddle.utils.run_check()
> python
import paddle
paddle.utils.run_check()
如果出现 PaddlePaddle is installed successfully!,说明您已成功安装。
下载预训练模型
PaddleOCR 分为 Detection(文本检测)、 Direction classifier(方向分类器)和Recognition(文本识别)三部分,因此需要三个模型。
- 文本检测:定位出图像中的文字区域
- 方向分类器:将各种方向的文本框通过仿射变换变为水平方向,文本方向分类器用来判断文本是不是上下颠倒的
- 文本识别:文本行图像解码为文本
其中文本检测有三个模型,分别是 MobileNetV3、ResNet18_vd 和 ResNet50,其中最常使用的是MobileNetV3 模型,整体比较小,适合应用于手机端。文本识别只有一个MobileNetV3预训练模型。方向分类器使用默认的模型。
参考官方的demo:PaddleOCR demo
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
# load model
# Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改 lang参数进行切换
# lang参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`
ocr = PaddleOCR(lang="ch",
use_gpu=False,
det_model_dir="../paddleORC_model/ch_ppocr_server_v2.0_det_infer/",
cls_model_dir="ch_ppocr_mobile_v2.0_cls_infer/",
rec_model_dir="ch_ppocr_server_v2.0_rec_infer/")
# load dataset
img_path = 'test.jpg'
resul = ocr.ocr(img_path)
for line in result:
print(line)
# 注:
# result是一个list,每个item包含了文本框,文字和识别置信度
# line的格式为:
# [[[3.0, 149.0], [43.0, 149.0], [43.0, 163.0], [3.0, 163.0]], ('人心安', 0.6762619018554688)]
# 文字框 boxes = line[0],包含文字框的四个角的(x,y)坐标
# 文字 txts = line[1][0]
# 识别置信度 scores = line[1][1]
# visual
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)
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
PaddleOCR 和 PP-Structure 的区别
PaddleOCR 和 PP-Structure 都是由PaddlePaddle生态提供的工具,它们虽然有相似之处,但主要服务于不同的场景和需求:
PaddleOCR
- 主要功能:PaddleOCR 主要专注于光学字符识别(OCR),包括文本检测和文本识别。它可以识别图片中的文字信息,并将这些信息转换为电子文本格式。
- 用途:它适用于各种图片和场景中的文字识别,如身份证、名片、街道标志、商品信息等。
- 特点:
- 高精度和高性能的文字识别。
- 支持多语言识别。
- 提供丰富的预训练模型和轻量级模型选项。
- 易于集成和使用在各种应用中。
假设你有一张街道的照片,照片中包含了一些商店招牌和路标上的文本。你想从这张照片中提取出所有文本信息。
使用 PaddleOCR,你可以轻松实现这个目标。PaddleOCR会首先通过文本检测模型识别出照片中所有文本的位置,然后通过文本识别模型将这些文本转换为可编辑的电子文本格式。最终,你会得到一个包含了所有招牌和路标上文本的文本文件。
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR() # 默认调用英文模型,可以通过参数选择或自定义模型
img_path = 'path_to_your_image.jpg'
result = ocr.ocr(img_path, cls=True)
for line in result:
print(line)
# 可视化结果
image = draw_ocr(img_path, result, font_path='path_to_font')
image.show()
PP-Structure
- 主要功能:PP-Structure 是PaddleOCR的一个扩展,专注于结构化文档分析,能够处理更复杂的文档布局和结构,如表格、表单等。
- 用途:它适合于处理和解析具有固定格式或者复杂结构的文档,如发票、财务报表、科学论文等,不仅识别文本内容,还能理解文档中的结构信息。
- 特点:
- 能够识别和解析文档中的表格、列表和其他结构化数据。
- 支持从复杂布局的文档中提取结构化信息。
- 可以与PaddleOCR结合使用,提供从文本检测到结构化信息提取的端到端解决方案。
- 面向更复杂的文档分析和信息提取需求。
现在假设你有一张纸质发票,你不仅想识别出发票上的文本,还希望能够理解这些文本的结构,例如知道哪些数字是日期、哪些是金额、商品名称等,并且希望能按照一定的格式将这些信息导出。
这时,PP-Structure 就派上了用场。PP-Structure 不仅能识别出发票上的文本,还能理解发票的布局和结构。它能够区分不同的信息块,如表头、表格行和列,然后根据这些结构化的信息提取出有用的数据,比如将发票上的商品名称、数量、单价和总价分别识别并提取出来,最终生成一个结构化的数据文件,如CSV或JSON,方便进一步的数据处理和分析。
from ppstructure import predict_system
from ppstructure.utility import draw_structure_result, save_structure_res
# 初始化 PP-Structure系统
system = predict_system.StructureSystem()
# 读取发票图像路径
img_path = "path_to_your_invoice_image.jpg"
# 使用PP-Structure处理图像,并获取结构化结果
result = system(img_path)
# 保存和可视化结构化结果
save_structure_res(result, save_folder="./output", img_name="output.jpg")
draw_structure_result(img_path, result, save_name="visualized_output.jpg")