《PaddleOCR》—— OCR
文章目录
- PaddleOCR简介
- 核心功能与特点
- 快速安装与使用
- 典型应用场景
- 实例
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)、迁移学习方案。
快速安装与使用
- 安装
# 安装 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
- 命令行一键识别
paddleocr --image_dir "test.jpg" --use_angle_cls true --lang ch
# 参数说明:
# --use_angle_cls:开启方向分类(默认关闭)
# --lang:语言类型(ch=中文, en=英文, japan=日文等,默认 ch)
- Python API 调用
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 对图像进行文字识别,将识别结果显示在文本编辑框中。
# 导入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_())
可以看出准确率还是很高的。