探索PaddleOCR:从安装到实战应用指南
PaddleOCR 是一个基于百度飞桨(PaddlePaddle)深度学习框架的开源OCR工具包。它提供了一系列高效、准确的文字识别模型,旨在简化从图像中提取文本的过程,并且适用于多种语言。PaddleOCR的主要特点包括:
高精度:通过先进的深度学习技术,PaddleOCR能够实现非常高的文字识别精度,适合于对准确性有较高要求的应用场景。
超轻量级:为了适应不同设备和环境的需求,PaddleOCR提供了轻量化模型选项,在保持良好性能的同时减少计算资源消耗。
易用性:PaddleOCR设计时考虑到了用户的使用便捷性,提供简单直观的API接口以及详细的文档支持,使得即使是初学者也能快速上手。
多语言支持:除了中文外,PaddleOCR还支持英文以及其他多种语言的文字识别,满足国际化的应用场景需求。
丰富的功能:不仅限于基本的文字检测与识别,PaddleOCR还包括了角度矫正、版面分析等功能模块,可以处理更复杂的OCR任务。
持续更新与发展:作为活跃开发中的项目,PaddleOCR定期更新并引入最新的研究成果和技术改进,以不断提高其性能及适用范围。
社区支持:拥有活跃的开发者社区,用户可以通过论坛等方式交流经验、解决问题,同时也鼓励贡献代码共同推动项目进步。
应用场景广泛:无论是移动应用、桌面软件还是云端服务,PaddleOCR都能够很好地集成其中;此外,在证件识别、票据处理等领域也有着广泛应用
官方文档:PaddleOCR 文档 (paddlepaddle.github.io)
安装
PaddlePaddle
基于GPU的用户,首先使用如下命令查看cuda版本:
nvidia-smi
进入paddlepaddle的安装网址:开始使用_飞桨-源于产业实践的开源深度学习平台 (paddlepaddle.org.cn)
找到属于自己的cuda版本(注意,并不需要完全等于网址的cuda版本,稍微低一点也是可以的。比如说,查到本机的cuda版本为12.6,但是该网址支持的cuda版本最高只有12.3,那么使用这个12.3版本的paddlepaddle也是可以的),直接用命令安装该库即可(以cuda12.3为例):
pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu123/
如果是CPU的用户,则安装CPU版本的paddlepaddle即可(安装命令同样也是在网址上获取):
pip install paddlepaddle==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
paddleocr
安装 paddleocr,推荐使用2.6版本
pip install paddleocr
pip install paddleocr>=2.6.0.3
其他依赖包
安装 图像方向分类依赖包paddleclas(如不需要图像方向分类功能,可跳过)
pip install paddleclas
pip install paddleclas>=2.4.3
其他可能用到的依赖包:
pip install premailer openpyxl fitz
模型介绍
paddleocr包含以下主要的模型:
PP-OCR
PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。在实现前沿算法的基础上,考虑精度与速度的平衡,进行模型瘦身和深度优化,使其尽可能满足产业落地需求。
PP-OCR是一个两阶段的OCR系统,其中文本检测算法选用DB,文本识别算法选用CRNN,并在检测和识别模块之间添加文本方向分类器,以应对不同方向的文本识别。
PP-OCR文档:概述 - PaddleOCR 文档 (paddlepaddle.github.io)
PP-Structure
PP-Structure是PaddleOCR团队自研的智能文档分析系统,旨在帮助开发者更好的完成版面分析、表格识别等文档理解相关任务。
PP-StructureV2的主要特性如下:
支持对图片/pdf形式的文档进行版面分析,可以划分文字、标题、表格、图片、公式等区域;
支持通用的中英文表格检测任务;
支持表格区域进行结构化识别,最终结果输出Excel文件;
支持基于多模态的关键信息抽取(Key Information Extraction,KIE)任务-语义实体识别(Semantic Entity Recognition,SER)和关系抽取(Relation Extraction,RE);
支持版面复原,即恢复为与原始图像布局一致的word或者pdf格式的文件;
支持自定义训练及python whl包调用等多种推理部署方式,简单易用;
与半自动数据标注工具PPOCRLabel打通,支持版面分析、表格识别、SER三种任务的标注。
PP-Structure文档:概述 - PaddleOCR 文档 (paddlepaddle.github.io)
PP-ChatOCR
官方开源文档暂未收录PP-ChatOCR的使用方法
总结
PP-OCR适合做普通的OCR识别,PP-Structure适合做表格识别和版面识别
PP-OCR
对于PP-OCR的使用,最基础的流程为引用paddleocr -> 初始化paddleocr类 -> 调用ocr函数
可以在命令行中输入paddleocr --help
去查看或者进入如下网址查看paddleocr类中的参数:
paddleocr package使用说明 - PaddleOCR 文档 (paddlepaddle.github.io)
基础引入
from paddleocr import PaddleOCR
Quickstart
image_path = "test.jpg"
# 初始化PaddleOCR
ocr = PaddleOCR(lang="ch", ocr_version="PP-OCRv4")
results = ocr.ocr(image_path) # 识别图片中的文字
print(results)
在PaddleOCR
中,ocr_version
参数指定的是PP-OCR的版本(这里指定的是PP-OCRv4
)
lang指定的是扫描语言,具体支持的语言可以查看:多语言模型 - PaddleOCR 文档 (paddlepaddle.github.io)
文本检测与识别
PP-OCR的进行OCR扫描有两个步骤:
扫描图片,检测图片中的文本位置
识别文本是什么
这两个步骤,分别由执行识别ocr.ocr
函数中的det
和rec
参数控制,在默认情况下会同时执行检测和识别,其结果是一个list,每个item包含文本框在图片中的位置和识别结果和识别置信度
[[[[[8.0, 7.0], [244.0, 7.0], [244.0, 33.0], [8.0, 33.0]], ('中国平安PINGAN', 0.993087887763977)], [[[15.0, 38.0], [107.0, 38.0], [107.0, 61.0], [15.0, 61.0]], ('
保险·银行·投资', 0.9485485553741455)], [[[404.0, 71.0], [831.0, 71.0], [831.0, 101.0], [404.0, 101.0]], ('中国平安财产保险股份有限公司', 0.9995205998420715)], [[[484.0, 121.0], [754.0, 121.0], [754.0, 144.0], [484.0, 144.0]], ('儿童综合医疗保险保险单', 0.9979095458984375)], [[[963.0, 163.0], [1195.0, 163.0], [1195.0, 182.0], [963.0, 182.0]], ('扫一扫,获取更多在线服务!', 0.9972683787345886)], ....
假设只想执行检测(即只扫描图片中的文本位置,而不识别文本):
image_path = "test.jpg"
# 初始化PaddleOCR
ocr = PaddleOCR(lang="ch", ocr_version="PP-OCRv4")
results = ocr.ocr(image_path, rec=False) # 识别图片中的文字
print(results)
结果是一个list,每个item只包含文本框在图片中的位置
[[[[1013.0, 1216.0], [1212.0, 1216.0], [1212.0, 1235.0], [1013.0, 1235.0]], [[1040.0, 1187.0], [1186.0, 1187.0], [1186.0, 1210.0], [1040.0, 1210.0]], .....
假设只想执行识别(即只扫描图片中的文本位置,而不识别文本)
image_path = "test.jpg"
# 初始化PaddleOCR
ocr = PaddleOCR(lang="ch", ocr_version="PP-OCRv4")
results = ocr.ocr(image_path, det=False) # 识别图片中的文字
print(results)
结果是一个list,每个item只包含识别结果和识别置信度
[[('一', 0.07427263259887695)]]
建议不要将两个功能单独拆开用,其识别结果似乎不太准,默认同时用识别准
提取结果并保存至图片中
在对图片进行扫描后,可以提取结果:
result = results[0] # 取出识别结果
# 在扫描结果中,result[0]是文字的坐标,result[1]是文字的内容和置信度
# 将它们分别提取出来
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
提取出坐标、文字和置信度后,使用from paddleocr import draw_ocr
将其绘制在图片中
from PIL import Image
from paddleocr import draw_ocr
image = Image.open(image_path).convert('RGB') # 读取原图片
# 将它们绘制到图片上
img_ocr = draw_ocr(image, boxes, txts, scores)
im_show = Image.fromarray(img_ocr)
im_show.save('result.jpg') # 保存图片
调整占用的GPU大小
在初始化PaddleOCR时,我们可以调整初始化该类所占用的GPU大小,从而达到加速检测速度或减少显卡压力的目的
设置gpu_mem
参数即可,传入一个数字用来指定占用的GPU大小,单位为MB
from paddleocr import PaddleOCR
image_path = "test.img"
ocr = PaddleOCR(show_log=True, lang="ch", use_gpu=True, gpu_mem=2048) # 执行GPU占用的大小为2048MB
results = ocr.ocr(image_path) # 识别图片中的文字
print(results)
如果设置的GPU占用过大(超过GPU显存)时,会出现类似以下的错误警报:
E1009 21:19:06.519114 16068 analysis_predictor.cc:2137] Allocate too much memory for the GPU memory pool, assigned 8000 MB
然后会自动降低GPU占用
所以请在设置的时候给出合适的数字