PaddleOCR的快速使用

news2024/11/23 22:06:52

一、简介

PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助力开发者训练出更好的模型,并应用落地。

支持多种 OCR 相关前沿算法,在此基础上打造产业级特色模型PP-OCR、PP-Structure和PP-ChatOCRv2,并打通数据生产、模型训练、压缩、预测部署全流程。 

二、环境搭建 

2.1 源码开发环境搭建方法

onda create -n paddle python=3.9.12
conda activate paddle
 
python -m pip install paddlepaddle-gpu==2.5.1.post120 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
 
# 在Python解释器中顺利执行如下命令
>>> import paddle
>>> paddle.utils.run_check()
 
# 如果命令行出现以下提示,说明PaddlePaddle安装成功
# PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
 
# 查看PaddlePaddle版本
>>> print(paddle.__version__)
 
 
# 项目克隆
git clone https://github.com/PaddlePaddle/PaddleOCR
 
## 2. 安装第三方库
 
```
cd PaddleOCR
pip3 install -r requirements.txt
```

2.2 快速开始

1)环境搭建

参考链接:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/quickstart.md

#GPU
pip install paddlepaddle-gpu
#CPU
pip install paddlepaddle
#安装paddleocr
pip install paddleocr

2)快速执行应用 

#快速测试效果

1)检测+方向分类器+识别全流程:--use_angle_cls true设置使用方向分类器识别180度旋转文字,--use_gpu false设置不使用GPU
paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
结果是一个list,每个item包含了文本框,文字和识别置信度
[[[28.0, 37.0], [302.0, 39.0], [302.0, 72.0], [27.0, 70.0]], ('纯臻营养护发素', 0.9658738374710083)]
......

2)单独使用检测:设置--recfalse

paddleocr --image_dir ./imgs/11.jpg --rec false

结果是一个list,每个item只包含文本框

[[27.0, 459.0], [136.0, 459.0], [136.0, 479.0], [27.0, 479.0]]
[[28.0, 429.0], [372.0, 429.0], [372.0, 445.0], [28.0, 445.0]]
......

3)单独使用识别:设置--detfalse

paddleocr --image_dir ./imgs_words/ch/word_1.jpg --det false

结果是一个list,每个item只包含识别结果和识别置信度

['韩国小馆', 0.994467]

3)模型说明

版本说明 paddleocr默认使用PP-OCRv4模型(--ocr_version PP-OCRv4),如需使用其他版本可通过设置参数--ocr_version,默认的为最新的模型。

4)不同语言模型的设置

PaddleOCR目前支持80个语种,可以通过修改--lang参数进行切换,对于英文模型,指定--lang=en

paddleocr --image_dir ./imgs_en/254.jpg --lang=en

2.3使用python代码快速调用

2.3.1 中英文与多语言使用

通过Python脚本使用PaddleOCR whl包,whl包会自动下载ppocr轻量级模型作为默认模型。

  • 检测+方向分类器+识别全流程
from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memory
img_path = './imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
    res = result[idx]
    for line in res:
        print(line)

# 显示结果
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='./fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

2.3.2 大图像的OCR识别

要使用滑动窗口进行光学字符识别(OCR),可以使用以下代码片段:

from paddleocr import PaddleOCR
from PIL import Image, ImageDraw, ImageFont

# 初始化OCR引擎
ocr = PaddleOCR(use_angle_cls=True, lang="en")

img_path = "./very_large_image.jpg"
slice = {'horizontal_stride': 300, 'vertical_stride': 500, 'merge_x_thres': 50, 'merge_y_thres': 35}
results = ocr.ocr(img_path, cls=True, slice=slice)

# 加载图像
image = Image.open(img_path).convert("RGB")
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("./doc/fonts/simfang.ttf", size=20)  # 根据需要调整大小

# 处理并绘制结果
for res in results:
    for line in res:
        box = [tuple(point) for point in line[0]]
        # 找出边界框
        box = [(min(point[0] for point in box), min(point[1] for point in box)),
               (max(point[0] for point in box), max(point[1] for point in box))]
        txt = line[1][0]
        draw.rectangle(box, outline="red", width=2)  # 绘制矩形
        draw.text((box[0][0], box[0][1] - 25), txt, fill="blue", font=font)  # 在矩形上方绘制文本

# 保存结果
image.save("result.jpg")

2.4 参数设定说明

参考博文的链接:

【Python】paddleocr快速使用及参数详解_paddleocr python-CSDN博客

1)使用默认路径下的模型

import cv2

from paddleocr import PaddleOCR

# 使用默认模型路径
paddleocr = PaddleOCR(lang='ch', show_log=False)
img = cv2.imread('ch2.jpg')  # 打开需要识别的图片
result = paddleocr.ocr(img)
for i in range(len(result[0])):
    print(result[0][i][1][0])   # 输出识别结果

2)设定模型路径

import cv2

from paddleocr import PaddleOCR


# 设定模型路径
paddleocr = PaddleOCR(lang='ch', show_log=False, 
                      det_model_dir='.paddleocr\\whl\\det\\ch\\ch_PP-OCRv4_det_infer',
                      rec_model_dir='.paddleocr\\whl\\rec\\ch\\ch_PP-OCRv4_rec_infer') # 推理模型路径
img = cv2.imread('ch2.jpg')  # 打开需要识别的图片
result = paddleocr.ocr(img)
for i in range(len(result[0])):
    print(result[0][i][1][0])   # 输出识别结果

3)其他参数介绍

在使用PaddleOCR进行模型推理时,可以自定义修改参数,来修改模型、数据、预处理、后处理等内容,详细的参数解释如下所示。

  • 全局信息

  • 预测引擎相关

  • 文本检测模型相关

  • 文本识别模型相关

  • 端到端文本检测与识别模型相关

  • 方向分类器模型相关

 三、目前常用的开源OCR识别框架

参考博文:开源的OCR工具基本使用:PaddleOCR/Tesseract/CnOCR_cnocr 只支持cudn吗-CSDN博客

3.1 EasyOCR

EasyOCR官方仓库:https://github.com/JaidedAI/EasyOCR
安装EasyOCR:

pip install easyocr

 测试例程:

import easyocr
reader = easyocr.Reader(['ch_sim','en']) # this needs to run only once to load the model into memory
result = reader.readtext('chinese.jpg')

对正向的文本检测效果是可以的,但是对倒置的文本的检测效果不好。 

       图片越大,OCR耗时越长,如果你只需要识别图片特定部分,可以先把图片裁剪了,减少识别区域,加快OCR识别速度(我当时的需求,只需要识别图片上半部分,于是就将上半张图片另存为新图。识别半张图比完整图快2.6倍)

  • 优点
    • 支持pip安装,但需要自己手动下载模型
    • ocr识别效果尚可,优于一般开源模型
  • 缺点
    • 速度很慢,900 * 1200像素图片平均需要30s左右
    • 不支持补充训练

3.2 CnOCR

CnOCR官方仓库:https://github.com/breezedeus/CnOCR
CnOCR安装:

pip install cnocr

CnOCR的环境要求比较严格,其在requirements.txt写了非常多的依赖版本号,因此如果在现有环境中直接安装,它会将Pytorch等依赖卸载重装,比较坑,使用最好先单开新环境。

 测试例程:

from cnocr import CnOcr

img_fp = 'img/output_2.png'
ocr = CnOcr()  # 所有参数都使用默认值
out = ocr.ocr(img_fp)
print(out)

实测在我的业务场景下,使用默认模型效果不太行。

  • 优点
    • 轻量模型,执行速度快,速度略快于paddle ocr
    • 支持pip直接安装
    • ocr识别效果好,识别效果比肩paddle ocr
    • 支持训练自己的模型
  • 缺点
    • 部分符号识别效果差
    • 部分场景下会出现空格丢失情况
    • 模型补充训练没有paddle ocr方便

3.3 Tesseract

Tesseract官方仓库:https://github.com/tesseract-ocr/tesseract
Tesseract是用C++进行开发的,因此如果要在python中进行使用,需要借助第三方依赖pytesseract

首先需要在本机上安装Tesseract
安装包下载地址:https://digi.bib.uni-mannheim.de/tesseract/
安装过程可参考:https://blog.csdn.net/weixin_51571728/article/details/120384909
配置完成后,在命令行输入tesseract -v打印出版本信息则表示安装成功。

之后安装pytesseract

pip install pytesseract

测试例程:

img_path = 'img/img_1.png'
# 添加tesseract的路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Users\zxy\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
"""
image_to_string():如果识别英文或数字可以不必额外参数,如果识别其他语言则需要加上lang参数
lang='chi_sim'表示要识别的是中文简体
没有识别出来时,返回空白
"""
text = pytesseract.image_to_string(Image.open(img_path), lang='chi_sim')
print(text)

实测这个效果在我的场景也表现一般,并且tesseract对于中英文有不同的模型,泛用性不是很好。

  • 优点
    • 支持补充训练
  • 缺点
    • 安装使用困难,不支持pip安装
    • 中文识别效果差

3.4  chinese_lite OCR

环境配置方法参考博文:

chinese_lite OCR使用教程_chineseliteocr-CSDN博客

  • 优点
    • 轻量模型,执行速度快,速度优于CnOCR和Paddle OCR
    • ocr识别效果尚可,优于一般开源模型,但比不上CnOCR和Paddle OCR
    • 作者提供了多种语言下的Demo
  • 缺点
    • 不支持pip安装
    • 文本位置识别略差
    • 不支持补充训练
    • 类手写字体识别效果一般
    • 部分场景下会出现误识别竖版文字的情况
      例如:

          

3.4 PaddleOCR

根据PP-OCRv4的介绍文档,PP-OCRv4在训练时以(32,320), (48,320), (64,320)三个不同尺度上进行训练。

    实测发现当文字区域小于这个范围时,效果会受到影响,因此,可以引入padding策略,即在文字区域范围周边加一圈白边,使输入模型的图片分辨率提升。 

import cv2
from paddleocr import PaddleOCR

def add_padding_to_image(image, output_size=(640, 640), color=(255, 255, 255)):
    h, w = image.shape[:2]
    # 计算需要添加的padding大小
    delta_w = max(output_size[0] - w, 0)
    delta_h = max(output_size[1] - h, 0)
    top, bottom = delta_h // 2, delta_h - (delta_h // 2)
    left, right = delta_w // 2, delta_w - (delta_w // 2)
    # 添加padding
    padded_image = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
    return padded_image

if __name__ == '__main__':
    ocr = PaddleOCR(use_angle_cls=True, lang="ch", ocr_version='PP-OCRv4')
    image_input_fullname = 'img/output_5.png'
    img = cv2.imread(image_input_fullname)
    padded_img = add_padding_to_image(img)
    result = ocr.ocr(img, cls=True)
    print(result)

在我的业务场景中,PaddleOCR的表现最好,基本能达到80%以上的识别准确率,如果还需要提升,还可以根据自己的数据再训练。

标注工具:PPOCRLabelv2

使用文档:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/PPOCRLabel/README_ch.md

训练文档:https://aistudio.baidu.com/modelsdetail/270?modelId=270

优缺点:

  • 优点
    • 轻量模型,执行速度快
    • 支持pip直接安装
    • ocr识别效果好,效果基本可以比肩大厂收费ocr(非高精版)
    • 支持表格和方向识别
    • 支持补充训练且很方便
  • 缺点
    • 部分符号识别效果一般,如 '|‘识别为’1’
    • 对于部分加粗字体可能出现误识别,需要自己补充训练
    • 偶尔会出现部分内容丢失的情况

3.5 总结 

        整体来看推荐使用paddle ocr和cnocr,某些场景下,如小图片且对速度要求较高可以尝试使用chinese_lite ocr.

四、特殊场景下新出的模型的总结

4.1 弧状文本检测

参考博文:

DPText-DETR: 基于动态点query的场景文本检测,更高更快更鲁棒 | 京东探索研究院_querydetr-CSDN博客

【论文】https://arxiv.org/abs/2207.04491

【代码】https://github.com/ymy-k/DPText-DETR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1877791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-cli 搭建项目

创建 router 目录 在一个.js文件中添加 打开外部命令 打开外部命令后,在指令栏输入npm i vue-router3.5.3 ,等待下载 下载完成后 在 main.js 中配置路由 输入这些后,基本的配置就实现了 最后进行测试,验证是否配置 或者打开外部命…

解决指南:如何应对错误代码 0x80070643

在使用Windows操作系统过程中,用户可能会遭遇各种错误代码,其中错误 0x80070643是比较常见的一种。这个错误通常在安装更新或某些软件时发生,尤其是在微软的Windows Defender或其他Microsoft安全产品以及.NET Framework更新过程中更为常见。本…

Linux的fwrite函数

函数原型: 向文件fp中写入writeBuff里面的内容 int fwrite(void*buffer,intsize,intcount,FILE*fp) /* * description : 对已打开的流进行写入数据块 * param ‐ ptr :指向 数据块的指针 * param ‐ size :指定…

19.《C语言》——【如何理解static和extern?】

🎇开场语 亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能&a…

操作系统速成笔记五

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、前言🚀🚀🚀二、正文☀️☀️☀️1.内存映射文件(1)方便程序员访问文件数据(2&#xff09…

小红书多账号管理平台哪个好用?可以快速监测多个小红书账号的数据吗?

随着品牌营销战线的不断扩展,小红书已经成为企业和个人品牌竞相展示的舞台。但是,随之而来的多账号管理问题也让众多运营者头疼不已。一个优秀的多账号管理平台,能让你事半功倍,轻松监控和分析账号数据。 如今,市面上出…

【proteus 51单片机入门】8*8led点阵

文章目录 前言如何点亮led点阵仿真图代码点亮led核心代码解析 爱心代码 滚动总结 前言 在嵌入式系统的开发中,LED点阵显示器是一种常见的显示设备,它可以用来显示各种图形和文字,为用户提供直观的信息反馈。本文将介绍如何使用Proteus软件和…

亿发微商城:从社交流量到生意增量,拓客+变现双收益

亿发微商城提供私域经营必备的系统 、服务和技术支持等全套解决方案。省去开发成本,还原品牌调性,打通社交渠道,经营私域会员,带来传统电商和线下门店之外的生意增量。

【linux/shell案例实战】解决Linux和Windows的换行符CRLF和LF问题

目录 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF 二.使用Linux 中命令 dos2unix 和 unix2dos 实现CRLF 和LF的转换 三.使用 windows 中的代码编辑器实现 CRLF 和 LF 的转换(Notepad) 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF CR是Carria…

<sa8650>QCX ID16_UsecaseRawLiteAuto 使用详解

<sa8650>QCX ID16_UsecaseRawLiteAuto 使用详解 一、前言二、ID16_UsecaseRawLiteAuto拓扑图三、UsecaseRawLiteAuto拓扑图 解析3.1 camxUsecaseRawLiteAuto.xml3.2 camxRawLiteAuto.xml四、测试一、前言 我们在使用QCX时,如果由于使用的摄像头自带了ISP,那么可能不需要使…

iOS开发中用到的自定义UI库

文章目录 前言cell 左右滑动菜单日历组件仿QQ 侧滑抽屉仿探探、陌陌的卡牌滑动库头部缩放视图自定义UITabbar刮刮乐广告横幅 前言 本文中的UI组件,是作者在移动应用开发中都用到过的。 确实,找到对的三方库可以快速帮助我们构建App, 极大程度上提高了生…

吉利银河L6(官方小订送的3M) 对比 威固vk70+ks15

吉利送的号称价值2000的3M效果 撕膜重贴 威固vk70ks15 之后的效果 // 忘记测反射的热量了 可以验证金属膜是反射热而不是吸热 金属膜 手机GPS还能用吗 亲测 能用 太阳能总阻隔率 3M貌似20%出头 威固前档55% 侧后挡高一点不超过60% 夏天真实太阳发热能量 即阻隔率55%到60% …

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目: 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大…

python 图像数据

//***********************安装库***********************// pip install pillow //安装Pillow库,Image类是Pillow库中的类 pip install numpy //安装numpy库,numpy是数值计算扩展库 pip install matplotlib import numpy as np from PIL import Imag…

webpack源码深入--- webpack的编译主流程

webpack5的编译主流程 根据watch选项调用compiler.watch或者是compiler.run()方法 try {const { compiler, watch, watchOptions } create();if (watch) {compiler.watch(watchOptions, callback);} else {compiler.run((err, stats) > {compiler.close(err2 > {callb…

Linux 生产消费者模型

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 前言 1. 生产消费者模型 1.1 什么是生产消…

FastAPI-Cookie

fastapi-learning-notes/codes/ch01/main.py at master Relph1119/fastapi-learning-notes GitHub 1、Cookie的作用 Cookie可以充当用户认证的令牌,使得用户在首次登录后无需每次手动输入用户名和密码,即可访问受限资源,直到Cookie过期或…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Semaphore做同步使用

信号量作为同步使用 创建一个Semaphore对象,并指定一个初始的计数值(通常称为“许可”或“令牌”的数量)。这个计数值表示当前可用的资源数量或可以同时访问共享资源的线程数。当一个线程需要访问共享资源时,它会尝试从Semaphore…

c++用什么软件编程?都有哪些?

c用什么软件编程?都有哪些? C 作为一种高效、面向对象的编程语言,广泛应用于软件开发、游戏开发、嵌入式系统等领域。那么在进行 C 编程时,我们通常会使用哪些软件呢?下面就来具体分析。 1. Visual Studio Visual Stu…

python selenium 打开网页

selenium工具类 - 文件名 seleniumkit.py 代码如下 # -*- coding:utf-8 _*-from selenium import webdriverimport os import timefrom selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from seleniu…