目录
前言
随着人工智能的不断发展,大模型技术的发展也加速迭代,由此衍生出来的RAG等技术也在不断进入使用场景。对于OCR的需求也在不断增加。
正好用到了PaddleOCR,然后借机就对其使用和部署做了一些工作,然后把过程与问题解决正好记录下,以备不时之需。
一、PaddleOCR是什么?
PaddleOCR是一个基于飞桨(PaddlePaddle)深度学习平台开发的开源OCR工具库。OCR(Optical Character Recognition)即光学字符识别,是指将图片中的文字转化为可编辑、可搜索的文本。PaddleOCR能够识别图片、视频等多种形式的文字信息,并且支持中、英、法、德、韩、日等多种语言的识别。该工具库提供了丰富的预训练模型和API接口,可用于快速、高效地进行文字识别任务的开发。
PaddleOCR具有较高的性能表现和良好的扩展性,广泛应用于文档识别、车牌识别、票据识别、表格识别、印刷体识别等领域。
二、使用与部署
1.初步使用
我们先从简单的使用入手,开发环境Windows 11
import os
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
import matplotlib.pyplot as plt
# 初始化 PaddleOCR,选择使用的语言('ch' 表示中文,'en' 表示英文,可以指定多个语言)
ocr = PaddleOCR(use_angle_cls=True, lang='ch') # 需要识别中文
# 读取图片
img_path = 'orc_test.png' # 替换为你的图片路径
img = Image.open(img_path).convert('RGB')
# 使用 PaddleOCR 识别图片中的文本
result = ocr.ocr(img_path, cls=True)
如上就是最简单的调用,定义PaddleOCR对象,读取一个图片对象,调用.ocr方法即可。
返回结果是一个多层级数组,每个文字识别结果是一个键值对,大概格式如下:
[[[位置信息],(文字,可信度)]]
第一层数组是代表图片数组,第二层数组就是每个图片的所有识别结果
可以通过如下代码对结果进行打印
# 打印识别结果
for line in result:
print(line)
for part in line:
pos=part[0]
txt,r=part[1]
print(pos,txt,r)
我测试的时候,正好用到了一个比较长的微信聊天截图,然后调用ocr结果过了好几秒返回结果为空,然后问了下AI反正意思是可能图片太大,需要对图片切分后分别调用再对结果合并处理。
后来又看了下,其实PaddleOCR已经解决了这个问题,有个参数就是可以进行分片识别的
slice = {
"horizontal_stride": w,
"vertical_stride": 10 * w,
"merge_x_thres": 30,
"merge_y_thres": 30,
}
# 使用 PaddleOCR 识别图片中的文本
result = ocr.ocr(img_path, cls=True, slice=slice)
如上,增加slice参数即可。slice参数主要是设置每一帧识别的范围,我这里是按照宽就是图片宽,长是10被图片宽。因为我要识别微信聊天记录截图就是因为非常长,ocr一次读入会导致内存溢出的问题,所以这么设置的。大家根据自己的情况设置即可。后两个参数大意是x、y方向在一个距离范围内识别为一个结果,设置一个比较小的值即可
2.服务调用
按如上方式测试了下,效果基本还行,但是为了更方便的应用,我就需要将这个ocr功能封装为一个服务接口,方便调用。
那么,首先就需要将ocr方法提取为一个通用方法
# ocrpaddle.py
import io
im