本篇将再讲讲paddleocr在图像OCR识别方面的应用。
一、paddlecor参数说明
字段 | 说明 | 默认值 |
---|---|---|
use_gpu | 是否使用GPU | TRUE |
gpu_mem | 初始化占用的GPU内存大小 | 8000M |
image_dir | 通过命令行调用时执行预测的图片或文件夹路径 | |
page_num | 当输入类型为pdf文件时有效,指定预测前面page_num页,默认预测所有页 | 0 |
det_algorithm | 使用的检测算法类型 | DB |
det_model_dir | 检测模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 ~/.paddleocr/det ;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
det_max_side_len | 检测算法前向时图片长边的最大尺寸,当长边超出这个值时会将长边resize到这个大小,短边等比例缩放 | 960 |
det_db_thresh | DB模型输出预测图的二值化阈值 | 0.3 |
det_db_box_thresh | DB模型输出框的阈值,低于此值的预测框会被丢弃 | 0.5 |
det_db_unclip_ratio | DB模型输出框扩大的比例 | 2 |
det_db_score_mode | 计算检测框score的方式,有'fast'和'slow',如果要检测的文字有弯曲,建议用'slow','slow'模式计算的box的score偏大,box不容易被过滤掉 | 'fast' |
det_east_score_thresh | EAST模型输出预测图的二值化阈值 | 0.8 |
det_east_cover_thresh | EAST模型输出框的阈值,低于此值的预测框会被丢弃 | 0.1 |
det_east_nms_thresh | EAST模型输出框NMS的阈值 | 0.2 |
rec_algorithm | 使用的识别算法类型 | CRNN |
rec_model_dir | 识别模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 ~/.paddleocr/rec ;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
rec_image_shape | 识别算法的输入图片尺寸 | "3,32,320" |
rec_batch_num | 进行识别时,同时前向的图片数 | 30 |
max_text_length | 识别算法能识别的最大文字长度 | 25 |
rec_char_dict_path | 识别模型字典路径,当rec_model_dir使用方式2传参时需要修改为自己的字典路径 | ./ppocr/utils/ppocr_keys_v1.txt |
use_space_char | 是否识别空格 | TRUE |
drop_score | 对输出按照分数(来自于识别模型)进行过滤,低于此分数的不返回 | 0.5 |
use_angle_cls | 是否加载分类模型 | FALSE |
cls_model_dir | 分类模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 ~/.paddleocr/cls ;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
cls_image_shape | 分类算法的输入图片尺寸 | "3, 48, 192" |
label_list | 分类算法的标签列表 | ['0', '180'] |
cls_batch_num | 进行分类时,同时前向的图片数 | 30 |
enable_mkldnn | 是否启用mkldnn | FALSE |
use_zero_copy_run | 是否通过zero_copy_run的方式进行前向 | FALSE |
lang | 模型语言类型,目前支持 目前支持中英文(ch)、英文(en)、法语(french)、德语(german)、韩语(korean)、日语(japan) | ch |
det | 前向时使用启动检测 | TRUE |
rec | 前向时是否启动识别 | TRUE |
cls | 前向时是否启动分类 (命令行模式下使用use_angle_cls控制前向是否启动分类) | FALSE |
show_log | 是否打印logger信息 | FALSE |
type | 执行ocr或者表格结构化, 值可选['ocr','structure'] | ocr |
ocr_version | OCR模型版本,可选PP-OCRv3, PP-OCRv2, PP-OCR。PP-OCRv3 支持中、英文的检测、识别、多语种识别,方向分类器等模型;PP-OCRv2 目前仅支持中文的检测和识别模型;PP-OCR支持中文的检测,识别,多语种识别,方向分类器等模型 | PP-OCRv3 |
二、基于python脚本进行图片OCR文字识别
paddleocr whl包会自动下载ppocr轻量级模型作为默认模型,运行以下代码加载。
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
本地有一张test.jpg图片:
我们运行以下代码,进行图片文字识别,并打印结果。
img_path = './img/test.jpg'
# 结果是一个list,每个item包含了文本框,文字和识别置信度
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)
识别内容如下,结果是一个list,每个item包含了文本框,文字和识别置信度。
[2024/06/01 23:35:00] ppocr DEBUG: dt_boxes num : 6, elapsed : 3.8749797344207764 [2024/06/01 23:35:01] ppocr DEBUG: cls num : 6, elapsed : 0.583005428314209 [2024/06/01 23:35:02] ppocr DEBUG: rec_res num : 6, elapsed : 1.3186604976654053 [[[195.0, 70.0], [336.0, 70.0], [336.0, 200.0], [195.0, 200.0]], ('R', 0.9454304575920105)] [[[175.0, 255.0], [617.0, 255.0], [617.0, 315.0], [175.0, 315.0]], ('当游戏数据遇上', 0.9989826083183289)] [[[649.0, 271.0], [722.0, 271.0], [722.0, 326.0], [649.0, 326.0]], ('R', 0.9735457897186279)] [[[174.0, 414.0], [526.0, 414.0], [526.0, 438.0], [174.0, 438.0]], ('第八届中国R语言大会(上海会场)', 0.9587013721466064)] [[[540.0, 415.0], [677.0, 415.0], [677.0, 436.0], [540.0, 436.0]], ('2015.11.22', 0.9998686909675598)] |
从结果来看,文字识别准确率还很高,模型还将两个R图片中的R字识别出来。
以下代码主要用于显示 OCR(Optical Character Recognition,光学字符识别)的结果,并将结果显示在一张图片上,然后将这张图片保存到本地。
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='/path/to/PaddleOCR/doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
运行后,我们在当前目录生成一张result.jpg的图片,内容如下:
三、基于python脚本对PDF文件进行OCR文字识别
如果我们输入的是pdf文件,也能进行文字识别。
假如本地有一个test.pdf文件:
运行以下代码,对pdf文件的文字进行识别:
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
img_path = './img/test.pdf'
result = ocr.ocr(img_path, cls=True)
运行以下代码,打印识别结果:
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)
可见,中英文都很好被识别出来。
同样,我们也想将OCR识别的结果在图片标注并保存到本地。通过以下代码实现。此处将官网代码报错地方进行了修正。
# 显示结果
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.page_count): # 将 原文的pageCount 修改为 page_count
page = pdf[pg]
mat = fitz.Matrix(2, 2)
pm = page.get_pixmap(matrix=mat, alpha=False) # 将原文的getPixmap 修改为 get_pixmap
# 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('pdf_result.jpg'.format(idx))
四、基于命令行使用进行图片OCR文字识别
基于代码行识别图片OCR是非常容易的,我们可以在Anaconda Prompt中运行以下代码实现:
paddleocr --image_dir ./img/test.jpg --use_angle_cls true --use_gpu false
其中,--image_dir
是要识别的图片地址,--use_angle_cls true
设置使用方向分类器识别180度旋转文字,--use_gpu false
设置不使用GPU。
看到以下输出,说明已经完成。
如果我们想在jupyter Notebook运行命令行,只需在前面添加!号即可。
!paddleocr --image_dir ./img/test.jpg --use_angle_cls true --use_gpu false
五、基于命令行使用进行PDF文件的文字识别
paddleocr也支持输入pdf文件,并且可以通过指定参数page_num
来控制推理前面几页,默认为0,表示推理所有页。在Jupyter Notebook输入以下命令:
!paddleocr --image_dir ./img/test.pdf --use_angle_cls true --use_gpu false --page_num 1
如果大家对想学习其他更多内容,包括ChatGPT大模型、数据挖掘、可视化、R语言、Python等专题,可关注“我爱数据科学”的公众号或视频号。
我爱数据科学公众号二维码:
如果公众号二维码过期,可在 微信 -> 公众号 -> + -> 搜索 “我爱数据科学” 进行关注。
我爱数据科学的视频号二维码: