《PaddleOCR》—— OCR

文章目录

PaddleOCR简介

PaddleOCR 是百度基于飞桨(PaddlePaddle)框架开源的全场景文字识别工具,支持多语言、多场景、高精度的 OCR 能力,覆盖文本检测、识别、方向分类等全流程,广泛应用于文档扫描、车牌识别、票据处理、工业质检等场景。

核心功能与特点

  • 全流程覆盖
    • 检测:支持任意形状文本(弯曲、多方向),基于 DB、EAST 等算法。
    • 识别:支持中文(简 / 繁)、英文、日文、韩文、越南文等 80+ 语言,含高精度轻量模型(如 CRNN、SVTR)。
    • 方向分类:自动纠正文本方向(0°/90°/180°/270°)。
    • 端到端:单模型完成检测 + 识别,支持竖排文本、长文本。
  • 多场景适配
    • 通用文档、手写体、屏幕截图、低光照 / 模糊图片、小语种(如阿拉伯文、西里尔字母)。
    • 工业级优化:支持极小文本(3px)、复杂背景(如表格、海报)。
  • 高性能与轻量化
    • 提供超轻量模型(检测 3.5M + 识别 6.6M),CPU 端实时推理(Python 版本单张图 <0.5s)。
    • 支持 GPU 加速,CUDA 环境下速度提升 5-10 倍。
  • 开源与生态
    • 代码开源(GitHub 星标超 28k),提供预训练模型、数据增强工具(如 PP-OCRv4 数据合成)。
    • 支持自定义训练:提供标注工具(PaddleLabel)、迁移学习方案。

快速安装与使用

  • 安装
python 复制代码
# 安装 PaddleOCR(CPU 版本)
pip3 install "paddleocr>=2.6.0"

# 安装 GPU 版本(需 CUDA 11.2+)
pip3 install "paddleocr>=2.6.0" -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
  • 命令行一键识别
python 复制代码
paddleocr --image_dir "test.jpg" --use_angle_cls true --lang ch
# 参数说明:
# --use_angle_cls:开启方向分类(默认关闭)
# --lang:语言类型(ch=中文, en=英文, japan=日文等,默认 ch)
  • Python API 调用
python 复制代码
from paddleocr import PaddleOCR, draw_ocr

# 初始化(自动下载模型,首次运行需联网)
ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # 可指定 use_gpu=False 强制 CPU

# 预测
result = ocr.ocr("test.jpg", cls=True)

# 输出结果(格式:[[bbox], 文本, 置信度])
for line in result[0]:
    print(line[1][0])  # 提取文本

# 可视化结果
from PIL import Image
image = Image.open("test.jpg").convert('RGB')
boxes = [line[0] for line in result[0]]
txts = [line[1][0] for line in result[0]]
scores = [line[1][1] for line in result[0]]
im_show = draw_ocr(image, boxes, txts, scores)
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

典型应用场景

1、 文档处理:合同 / 发票扫描、表格文字提取(支持竖排、多列)。

2、场景文字:路标、广告牌、商品标签识别(如 PaddleOCR 曾用于淘宝拍照搜题)。

3、工业质检:PCB 字符检测、仪表盘数字识别。

4、移动端:手机相册 OCR(微信 / 支付宝扫码、翻译软件)。

5、古籍数字化:竖排古文、泛黄纸张文字恢复(结合图像增强算法)

实例

对摄像头中获取的文字进行OCR处理:

如图设计页面

一个按键、一个文本框、一个标签框

按键用来写控制函数,控制文本框和标签框。

代码:

这段代码的主要功能是创建一个基于 PyQt5 的图形用户界面,通过按钮控制摄像头的打开和关闭。当摄像头打开时,定时获取摄像头的帧图像,将其显示在界面上,并使用 PaddleOCR 对图像进行文字识别,将识别结果显示在文本编辑框中。

python 复制代码
# 导入joblib库,用于保存和加载Python对象,在机器学习模型保存和加载时常用
import joblib
# 导入OpenCV库,用于计算机视觉任务,如图像和视频处理
import cv2
# 从paddleocr模块导入PaddleOCR类,用于进行光学字符识别(OCR)
from paddleocr import PaddleOCR
# 导入NumPy库,用于科学计算和数组操作
import numpy as np
# 从PyQt5库导入QtCore、QtGui和QtWidgets模块,用于创建图形用户界面(GUI)
from PyQt5 import QtCore, QtGui, QtWidgets
# 从PyQt5.QtCore模块导入所有内容,方便使用其中的类和函数,如信号与槽机制、定时器等
from PyQt5.QtCore import *
# 从PyQt5.QtGui模块导入所有内容,用于处理图形、图像和字体等
from PyQt5.QtGui import *
# 从PyQt5.QtWidgets模块导入QFileDialog、QMainWindow和QMessageBox类
# QFileDialog用于文件选择对话框,QMainWindow是主窗口的基类,QMessageBox用于显示消息框
from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox
'''QFileDialog可以帮助用户选择文件路径
QMainWindow则是创建具有菜单、工具栏和状态栏的主窗口的起点。
QMessageBox可以用于向用户显示提示或警告信息'''

# 从ocr模块导入Ui_MainWindow类,该类可能是使用Qt Designer设计的主窗口界面类
from ocr import Ui_MainWindow
# 导入sys模块,用于访问与Python解释器紧密相关的变量和函数,如命令行参数
import sys

# 定义一个继承自QMainWindow和Ui_MainWindow的类,用于创建主窗口
class PyQtMainEntry(QMainWindow, Ui_MainWindow):
    def __init__(self):
        # 调用父类的构造函数,进行初始化
        super().__init__()
        # 调用setupUi方法,根据Ui_MainWindow类中的设计设置界面
        self.setupUi(self)
        # 创建一个PaddleOCR对象,设置使用角度分类、使用GPU加速、不显示日志信息,语言为英文
        self.ocr = PaddleOCR(use_angle_cls=True, use_gpu=True, show_log=False, lang='en')
        # 打开编号为0的摄像头,用于视频捕获
        self.camera1 = cv2.VideoCapture(0)
        # 初始化摄像头打开状态为False,表示摄像头未打开
        self.is_camera_opened = False
        # 创建一个Qt定时器对象,用于定时触发事件
        self._timer = QtCore.QTimer(self)
        # 当定时器超时时,连接到_queryFrame方法,即定时调用_queryFrame方法
        self._timer.timeout.connect(self._queryFrame)
        # 设置定时器的间隔时间为30毫秒,即每30毫秒触发一次超时事件
        self._timer.setInterval(30)

    # 定义一个槽函数,用于处理打开或关闭摄像头的操作
    def slot1(self):
        # 切换摄像头打开状态
        self.is_camera_opened = not self.is_camera_opened
        if self.is_camera_opened:
            # 如果摄像头打开,修改按钮文本为"关闭"
            self.pushButton.setText('关闭')
            # 启动定时器,开始定时获取摄像头帧
            self._timer.start()
        else:
            # 如果摄像头关闭,修改按钮文本为"打开"
            self.pushButton.setText('打开')
            # 停止定时器,停止获取摄像头帧
            self._timer.stop()

    # 定义一个方法,用于定时查询摄像头帧并进行OCR识别
    def _queryFrame(self):
        # 从摄像头读取一帧图像,ret1表示是否成功读取,self.frame1为读取的图像
        ret1, self.frame1 = self.camera1.read()
        # 将读取的图像调整为640x480的大小
        self.frame1 = cv2.resize(self.frame1, (640, 480))
        if ret1:
            # 如果成功读取到图像,将图像从BGR颜色空间转换为RGB颜色空间
            qimage = cv2.cvtColor(self.frame1, cv2.COLOR_BGR2RGB)
            # 将转换后的图像数据封装为QtGui.QImage对象
            qimage = QtGui.QImage(qimage.data, qimage.shape[1], qimage.shape[0],
                                  QtGui.QImage.Format_RGB888)
            # 将QImage对象转换为QPixmap对象
            pixmap = QtGui.QPixmap.fromImage(qimage)
            # 将QPixmap对象设置到名为label的标签上进行显示
            self.label.setPixmap(pixmap)
        # 使用PaddleOCR对象对当前帧图像进行OCR识别,返回识别结果
        result = self.ocr.ocr(self.frame1, cls=True)
        # 初始化一个空列表,用于存储识别出的文本
        a_list = []
        # 遍历识别结果中的每一项
        for i in result[0]:
            # 将每一项中的文本添加到列表中
            a_list.append(i[1][0])
        # 将列表中的文本用换行符连接成一个字符串
        zz = '\n'.join(a_list)
        # 将连接后的字符串显示在名为textEdit的文本编辑框中
        self.textEdit.setText(zz)

# 程序的入口点
if __name__ == "__main__":
    # 创建一个Qt应用程序实例,传入命令行参数
    app = QtWidgets.QApplication(sys.argv)
    # 创建主窗口实例
    window = PyQtMainEntry()
    # 显示主窗口
    window.show()
    # 进入应用程序的事件循环,等待用户操作,直到窗口关闭,然后退出程序
    sys.exit(app.exec_())

可以看出准确率还是很高的。

相关推荐
成风693几秒前
c++比较与对比动态内存分配和回收运算符new,new[],delete,delete[]。
开发语言·c++
咩咩觉主6 分钟前
C# &Unity 唐老狮 No.8 模拟面试题
开发语言·unity·c#
四念处茫茫6 分钟前
【C语言系列】字符函数和字符串函数
c语言·开发语言·visual studio
PfCoder34 分钟前
C#结构体(Struct)详解
开发语言·c#·visual studio
我想发发发1 小时前
48. 旋转图像(C++)
开发语言·c++
卡布奇诺-海晨1 小时前
JVM之Arthas排查问题
开发语言·jvm
九溪弥烟、2 小时前
python编写的一个打砖块小游戏
开发语言·python·pygame
stars2 小时前
搞定python之三----序列、字典及集合
开发语言·python
Matrix702 小时前
Scala编程_实现Rational的基本操作
开发语言·python·scala
0wioiw02 小时前
C++基础(VScode环境安装)
开发语言·c++