paddleocr快速入门:基于python脚本及命令行两种方式实现图片OCR识别

本篇将再讲讲paddleocr在图像OCR识别方面的应用。

一、paddlecor参数说明

字段说明默认值
use_gpu是否使用GPUTRUE
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_threshDB模型输出预测图的二值化阈值0.3
det_db_box_threshDB模型输出框的阈值,低于此值的预测框会被丢弃0.5
det_db_unclip_ratioDB模型输出框扩大的比例2
det_db_score_mode计算检测框score的方式,有'fast'和'slow',如果要检测的文字有弯曲,建议用'slow','slow'模式计算的box的score偏大,box不容易被过滤掉'fast'
det_east_score_threshEAST模型输出预测图的二值化阈值0.8
det_east_cover_threshEAST模型输出框的阈值,低于此值的预测框会被丢弃0.1
det_east_nms_threshEAST模型输出框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是否启用mkldnnFALSE
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_versionOCR模型版本,可选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")

本地有一张t​est.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等专题,可关注“我爱数据科学”的公众号或视频号。

         我爱数据科学公众号二维码:

如果公众号二维码过期,可在 微信 -> 公众号 -> + -> 搜索 “我爱数据科学” 进行关注。

我爱数据科学的视频号二维码:

  • 17
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiabiao1602

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值