python PaddleOCR库用法及知识点详解

1. PaddleOCR简介

PaddleOCR是一个基于PaddlePaddle深度学习框架的OCR(Optical Character Recognition,光学字符识别)库,能够识别包括中文在内的多种语言的文字,具有高准确率、高效率和易用性等优点。它提供了多种OCR模型和预处理工具,支持图像文字检测、文字识别、关键信息提取等OCR应用场景。

2. PaddleOCR安装

2.1 环境要求

在安装PaddleOCR之前,需要先安装PaddlePaddle深度学习框架。PaddleOCR支持的PaddlePaddle版本为PaddlePaddle 2.0及以上版本。安装PaddlePaddle可以参考官方文档https://www.paddlepaddle.org.cn/install/quick

2.2 安装PaddleOCR

可以通过pip命令安装最新版本的PaddleOCR:

pip install paddleocr

安装完成后,可以使用以下命令进行测试:

import paddleocr

ocr = paddleocr.OCR()

result = ocr.ocr('example.png')

print(result)

以上代码中,`example.png`是需要识别的图像文件名,OCR()函数是PaddleOCR的初始化函数,返回一个OCR实例,ocr()函数实现OCR功能,返回识别结果。

3. PaddleOCR使用

PaddleOCR提供了多种OCR模型,适用于不同的场景,并且支持多种图像预处理技术,可以提高OCR识别的准确率和效率。下面介绍PaddleOCR的相关使用方法。

3.1 基础OCR识别

以下代码实现了对一幅图像文件的文字识别,返回结果以列表形式保存,每个元素都是一个字典,包含识别结果、文本框位置等信息。

import paddleocr

ocr = paddleocr.OCR()

result = ocr.ocr('example.png')

for line in result:

print(line)

除了传入图像文件名,还可以直接传入图像数据和图像路径列表,例如:

import paddleocr

import cv2

ocr = paddleocr.OCR()

img = cv2.imread('example.png')

result = ocr.ocr(img)

print(result)

path_list = ['example1.png', 'example2.png']

result = ocr.ocr(path_list=path_list)

print(result)

3.2 高精度OCR识别

PaddleOCR提供了多个高精度OCR模型,如DB(Detection and Recognition)、 CRNN(Convolutional Recurrent Neural Network)等。以下代码实现了基于DB模型对一幅图像文件的高精度文字识别。

import paddleocr

ocr = paddleocr.OCR(use_angle_cls=True, use_gpu=False, use_tensorrt=False, lang='ch')

result = ocr.ocr('example.png', cls=True)

print(result)

以上代码中,use_angle_cls表示是否使用文字方向分类模型,默认为False。use_gpu表示是否使用GPU加速,默认为False,use_tensorrt表示是否使用TensorRT加速,默认为False。lang表示识别语言,'ch'为中文。

3.3 文字方向检测

以下代码实现了对一幅图像文件中文本行的文字方向检测,返回一个文字方向值,0表示水平方向,90表示逆时针旋转90度,以此类推。

import paddleocr

ocr = paddleocr.OCR(use_angle_cls=True, use_gpu=False, use_tensorrt=False)

result = ocr.ocr('example.png', cls=True)

angle = result[-1]['degree']

print(angle)

3.4 文本行检测

以下代码实现了对一张图像进行文本区域检测,返回文本区域的坐标信息,可以用矩形框标出文本区域。

import paddleocr

import cv2

ocr = paddleocr.OCR(det=True)

img = cv2.imread('example.png')

result = ocr.ocr(img, det=True)

for line in result:

print(line)

4. PaddleOCR应用案例

PaddleOCR适用于多种OCR应用场景,下面介绍一个数字短信验证码识别的应用案例。

4.1 数据集准备

收集一定数量的数字短信验证码图片,并手动标注标签,生成训练集和测试集。可以使用如下脚本,对数据集进行随机划分,保证训练集和测试集的分布相似。

import os

import random

import shutil

data_dir = 'data'

train_dir = 'train'

test_dir = 'test'

train_ratio = 0.8

if not os.path.exists(train_dir):

os.makedirs(os.path.join(train_dir, '0'))

os.makedirs(os.path.join(train_dir, '1'))

os.makedirs(os.path.join(train_dir, '2'))

os.makedirs(os.path.join(train_dir, '3'))

os.makedirs(os.path.join(train_dir, '4'))

os.makedirs(os.path.join(train_dir, '5'))

os.makedirs(os.path.join(train_dir, '6'))

os.makedirs(os.path.join(train_dir, '7'))

os.makedirs(os.path.join(train_dir, '8'))

os.makedirs(os.path.join(train_dir, '9'))

if not os.path.exists(test_dir):

os.makedirs(os.path.join(test_dir, '0'))

os.makedirs(os.path.join(test_dir, '1'))

os.makedirs(os.path.join(test_dir, '2'))

os.makedirs(os.path.join(test_dir, '3'))

os.makedirs(os.path.join(test_dir, '4'))

os.makedirs(os.path.join(test_dir, '5'))

os.makedirs(os.path.join(test_dir, '6'))

os.makedirs(os.path.join(test_dir, '7'))

os.makedirs(os.path.join(test_dir, '8'))

os.makedirs(os.path.join(test_dir, '9'))

for root, dirs, files in os.walk(data_dir):

for file in files:

if file.endswith('.png'):

path = os.path.join(root, file)

label = int(file[0])

if random.random() < train_ratio:

shutil.copy(path, os.path.join(train_dir, str(label)))

else:

shutil.copy(path, os.path.join(test_dir, str(label)))

4.2 模型训练

使用PaddleOCR提供的OCR模型进行训练。以下代码实现了基于CRNN模型对数字验证码进行训练。

import os

import paddleocr

train_dir = 'train'

test_dir = 'test'

model_dir = 'models'

if not os.path.exists(model_dir):

os.makedirs(model_dir)

ocr = paddleocr.OCR(rec_algorithm='CRNN', lang='ch', use_gpu=False)

ocr.train(train_dir, test_dir, save_dir=model_dir, epochs=10, batch_size=32)

以上代码中,rec_algorithm指定了OCR模型的算法,lang表示识别语言,use_gpu表示是否使用GPU加速。train()方法进行训练,epochs表示训练轮数,batch_size表示每个批次的大小。

4.3 模型测试

使用PaddleOCR进行数字验证码识别时,需要先进行文字区域检测和文字方向检测,再进行文字识别。以下代码实现了对一幅数字验证码图像的识别。

import paddleocr

import cv2

model_dir = 'models'

ocr = paddleocr.OCR(rec_algorithm='CRNN', lang='ch', use_gpu=False)

ocr.load(model_dir)

img = cv2.imread('example.png')

result = ocr.ocr(img, det=True, rec=True, cls=True)

for line in result:

print(line)

以上代码中,load()方法加载训练好的模型。ocr()方法中,det参数为True表示进行文本区域检测和文字方向检测,rec参数为True表示进行文本识别。

5. PaddleOCR常见问题

5.1 GPU训练失败

在使用PaddleOCR进行模型训练时,如果使用GPU进行加速,可能会出现GPU训练失败的情况。这时可以尝试将batch_size调小,避免显存不足。

5.2 文本识别准确率低

在使用PaddleOCR进行文字识别时,可能会出现识别结果准确率低的情况。这时可以尝试使用高精度OCR模型,或者调整模型参数,如temperature、dropout等。

6. 总结

PaddleOCR是一个高效、易用的OCR库,可用于一系列OCR应用场景。本文介绍了PaddleOCR的安装、使用方法和一个数字短信验证码识别的应用案例。希望本文能对初学者了解OCR实现有所帮助。

后端开发标签