当前位置: 首页 > news >正文

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_countpage = 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 imageif 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等专题,可关注“我爱数据科学”的公众号或视频号。

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

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

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

相关文章:

  • Qt 自定义代理类
  • ubuntu下搭建Supervisor
  • prometheus-alert使用
  • 达梦8 内存泄漏泄漏原因分析之一
  • IDM的优势
  • 安卓手机APP开发____持久性工作
  • TimeDao-一篇文章了解清楚Subspace项目
  • ssm324基于javaweb的企业人事信息管理系统+jsp-手把手调试搭建
  • HCIP-Datacom-ARST自选题库__MAC【14道题】
  • Git 恢复已删除的branch
  • 2022年ICPC亚洲区域赛南京站题解
  • 关于linux程序的查看、前台运行、后台运行、杀死的管理操作。
  • C#WPF数字大屏项目实战04--设备运行状态
  • 《KAN》论文笔记
  • JavaScript原生+jQuery 事件委托
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • C++类的相互关联
  • CAP理论的例子讲解
  • Docker: 容器互访的三种方式
  • Java Agent 学习笔记
  • js继承的实现方法
  • Laravel 实践之路: 数据库迁移与数据填充
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Python学习笔记 字符串拼接
  • 从零搭建Koa2 Server
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 机器学习学习笔记一
  • 聊聊directory traversal attack
  • 如何合理的规划jvm性能调优
  • 使用 QuickBI 搭建酷炫可视化分析
  • -- 数据结构 顺序表 --Java
  • 温故知新之javascript面向对象
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • FaaS 的简单实践
  • 进程与线程(三)——进程/线程间通信
  • #NOIP 2014#Day.2 T3 解方程
  • (回溯) LeetCode 77. 组合
  • (强烈推荐)移动端音视频从零到上手(上)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ***通过什么方式***网吧
  • *p++,*(p++),*++p,(*p)++区别?
  • .jks文件(JAVA KeyStore)
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net6使用Sejil可视化日志
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 第一章] JavaScript 简史
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [autojs]逍遥模拟器和vscode对接
  • [C#]winform基于深度学习算法MVANet部署高精度二分类图像分割onnx模型高精度图像二值化
  • [CakePHP] 在Controller中使用Helper
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!