PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别)
PaddleOCR 是一个 OCR 框架或工具包,它提供多语言实用的 OCR 工具,帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型,使 OCR 高度准确并接近商业产品。它提供文本检测、文本方向分类器和文本识别。
引言: PaddleOCR 是一个 OCR 框架或工具包,它提供多语言实用的 OCR 工具,帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型,使 OCR 高度准确并接近商业产品。它提供文本检测、文本方向分类器和文本识别。PaddleOCR 在其工具包中提供了多种模型,包括旗舰 PP-OCR 和最新算法,如 SRN、NRTR 等。
PaddleOCR 还根据大小提供不同的模型。
- 轻量级模型 ——占用更少内存、速度更快但准确性有所妥协的模型。
- 服务器模型(重量级)——占用更多内存但更准确但速度有所妥协的模型。
PaddleOCR 支持 80 多种语言(取决于使用的 OCR 算法)。但是旗舰级的PP-OCR提供了中英文两种语言的支持。旗舰 OCR 算法 PP-OCR 是可用的最佳 OCR 工具之一。到目前为止,它已经有PP-OCR、PP-OCRv2 和 PP-OCRv3三个版本。如前一节所述,所有这些模型都建立在 CRNN 之上,并且是超轻量级的。让我们来看看并将其应用到一些各种类型的场景中。
一、OCR环境搭建
接下来我们将实现 PaddleOCR 的 PP-OCRv3。
首先,让我们安装所需的工具包和依赖项。这些依赖项和工具将帮助我们访问 OCR 实验环境所需的所有必需文件和脚本。
Windows 下的 PIP 安装:
更多环境安装请参考官方文档:Windows 下的 PIP 安装-使用文档-PaddlePaddle深度学习平台
1.1 环境准备
1)查看你的环境
需要确认 python 的版本是否满足要求。WIN键+R打开CMD命令窗口,使用以下命令确认是 3.6/3.7/3.8/3.9/3.10
python --version
参考结果:
2)需要确认 pip 的版本是否满足要求,要求 pip 版本为 20.2.2 或更高版本
python -m pip --version
参考结果:
3)需要确认 Python 和 pip 是 64bit,并且处理器架构是 x86_64(或称作 x64、Intel 64、AMD64)架构
python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"
下面的第一行输出的是”64bit”,第二行输出的是”x86_64”、”x64”或”AMD64”即可:
1.2 开始安装
如果你的计算机有 NVIDIA GPU,请在 CMD 模式中运行以下命令安装 GPU 版的 PaddlePaddle:
pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
如果你的计算机没有 NVIDIA GPU,请在 CMD 模式中运行以下命令安装 CPU 版的 PaddlePaddle(小编用的是CPU环境)
# 安装最新版本方式
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 安装指定版本方式
pip install paddlepaddle==2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
1.3 验证安装
安装完成后你可以使用 python 进入 python 解释器,输入import paddle ,再输入 paddle.utils.run_check()
如果出现 PaddlePaddle is installed successfully!,说明你已成功安装。
1.4 如何卸载
如需卸载或重新安装,请使用以下命令卸载 PaddlePaddle:
- CPU 版本的 PaddlePaddle: python -m pip uninstall paddlepaddle
- GPU 版本的 PaddlePaddle: python -m pip uninstall paddlepaddle-gpu
二、OCR便捷使用
下载 opencv 开源项目: https://github.com/spmallick/learnopencv/tree/master/Optical-Character-Recognition-using-PaddleOCR
2.1 命令行使用
PaddleOCR 源码提供了一系列测试图片,位置:.\Optical-Character-Recognition-using-PaddleOCR\PaddleOCR\doc\imgs
如果没有,点击 这里 下载并解压,然后在终端中切换到相应目录。
如果不使用提供的测试图片,可以将下方 --image_dir
参数替换为自己相应的测试图片路径。
2.1.1 中英文模型
在源码中找一张中文图片:
检测 + 方向分类器 + 识别全流程:
--use_angle_cls true
设置使用方向分类器识别180度旋转文字--use_gpu false
设置不使用 GPU
paddleocr --image_dir ./doc/imgs/11.jpg --use_angle_cls true --use_gpu false
结果是一个list,每个item包含了文本框,文字和识别置信度:
查看源码可知,默认开启的是中文 ch 模式,检测(–det)默认已开启,识别(–rec)默认已开启。
- img:这是ocr函数中的第一个参数。在此,传递图像数组或图像路径以执行OCR
- det:以 bool 作为参数并指定是否使用检测器
- rec:以 bool 作为参数并指定是否使用识别器
- cls:以bool为参数,指定是否使用角度分类器
单独使用检测:设置 --rec
为 false
paddleocr --image_dir ./doc/imgs/11.jpg --rec false
单独使用识别:设置 --det
为 false
paddleocr --image_dir ./doc/imgs_words/ch/word_4.jpg --det false
2.1.2 多语言模型
1)英语
PaddleOCR 目前支持80个语种,可以通过修改 --lang
参数进行切换,比如使用英文模型,指定 --lang=en
。
paddleocr --image_dir ./doc/imgs_en/model_prod_flow_en.png --lang=en
结果是一个list,每个item包含了文本框,文字和识别置信度:
2)日语
像这样一张带有日文的图片:
CMD 执行命令:
paddleocr --image_dir ./doc/imgs/japan_1.jpg --lang=japan
如果设置的语言,在本机环境中没有对应的语言包,则会自动进行下载:
附 常用的多语言简写包括:
2.2 Python脚本使用
通过 Python 脚本使用 PaddleOCR whl 包,whl 包会自动下载 ppocr 轻量级模型作为默认模型。
pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
对于Windows环境用户:直接通过pip安装的shapely库可能出现 [winRrror 126] 找不到指定模块的问题。建议从 这里下载 shapely安装包完成安装。小编下载的版本是 Shapely-1.8.2-cp311-cp311-win_amd64.whl
备注:2.2 节点用到的测试图片皆来自于源码项目目录:Optical-Character-Recognition-using-PaddleOCR\input_images
检测 + 方向分类器 + 识别全流程,工具类代码案例(.\PaddleOCR\applications\ocr_img_util.py):
# Importing required methods for inference and visualization.
from paddleocr import PaddleOCR, draw_ocr
# 显示结果
from PIL import Image
# Importing required libraries.
import os
import cv2
import matplotlib.pyplot as plt
# 初始化OCR,OCR会自动下载PP-OCRv3检测器、识别器和角度分类器
ocr = PaddleOCR(use_angle_cls=True)
# 指定输出路径和字体路径
out_path = './output_images'
font = './doc/fonts/simfang.ttf'
# Applying OCR
def ocr_img(img_path):
print("OCR 图片识别地址:", img_path)
result = ocr.ocr(img_path)
print("OCR 图片识别结果:", result)
# 通过使用 result = result[0] 移除外部的一维来解决 paddleocr\tools\infer\utility.py 文件中 draw_ocr 函数的 TypeError: '<' not supported between instances of 'tuple' and 'float'
result = result[0]
print("移除一维后图片识别结果:", result)
# 保存可视化OCR检测识别结果
save_ocr(img_path, out_path, result, font)
# 绘制和保存结果
def save_ocr(img_path, out_path, result, font):
save_path = os.path.join(out_path, img_path.split('/')[-1].split('.')[0] + '-test-output.jpg')
print("save_path:", save_path)
# 函数用于从磁盘加载图像文件并将其作为NumPy数组加载到内存中。可以通过该数组进行进一步的图像处理和分析操作。
image = cv2.imread(img_path)
# 从输出列表中提取框、文本及其分数
boxes = [line[0] for line in result]
print("boxes:", boxes)
txts = [line[1][0] for line in result]
print("txts:", txts)
scores = [line[1][1] for line in result]
print("scores:", scores)
# 使用 PaddleOCR 内置函数绘制输出
# 可视化OCR检测识别结果
# 参数:
# 图像(图像|数组):RGB图像
# 盒子(列表):形状为(N, 4, 2)的盒子
# txts(list): 文本
# scores(list): txxs对应的分数
# drop_score(float):只有大于 drop_threshold 的分数才会被可视化
# font_path:用于绘制文字的字体路径
# 返回(数组):
# 可视化 img
im_show = draw_ocr(image, boxes, txts, scores, 0.5, font)
# imwrite 是OpenCV库中的一个函数,用于将图像保存到文件中。它接受两个参数:文件路径和要保存的图像。
cv2.imwrite(save_path, im_show)
# cvtColor 是OpenCV库中的一个函数,用于颜色空间转换。
# 它可以将一幅图像从一个颜色空间转换为另一个颜色空间,比如将彩色图像转换为灰度图像或将图像从BGR颜色空间转换为RGB颜色空间。
img = cv2.cvtColor(im_show, cv2.COLOR_BGR2RGB)
# 函数用于在图像窗口中显示图像。
# 它接受一个图像作为输入,并在一个新的窗口中显示该图像。通常,它用于图像的可视化和调试,以便查看处理后的图像结果。
plt.imshow(img)
1)收据
收据是 OCR 被广泛使用并具有大量商业用途的文档之一。它可用于提取重要信息,如账单金额、税金、买家信息等。例如,查看此图像并对其应用 OCR。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/05-receipt1.jpg'
ocr_img(img_path)
结果可视化:
让我们在另一张小票图片上测试我们的 OCR。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/05-receipt1.jpg'
ocr_img(img_path)
可以看出,OCR 在收据上的表现非常出色。它已经能够捕获几乎所有的详细信息,例如金额、订单、订单号等,并且与收据的数字顺序相同。因此,我们可以说 PP-OCR 在收据和类似文件上的表现相当不错。
2)身份证
身份证主要用于安全目的和识别目的。当 OCR 应用于 ID 卡时,它可用于提取姓名、代码、分支机构等信息,这些信息可用于在电子门上进行访问或将信息存储在数据库中。我们将在下图上尝试 OCR。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/09-id-card.jpg'
ocr_img(img_path)
哇!!那很快而且非常准确。它检测了所有字段,如船号、日期、ID 号等,即使文本倾斜,这些也是这里的关键信息。
3)文件
文档识别一直是 OCR 的重要研究领域之一。在我们的生活中几乎每天都在使用文档。当 OCR 应用于文档时,它可用于检索重要信息、检索表单字段、分析布局、数字存储以及阅读旧手稿。所有这些任务都可以使用 OCR 轻松完成。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/11-document-1.jpg'
ocr_img(img_path)
输出在检测和识别方面都非常准确。PP-OCR 能够检测文档中的所有文本字段,并且识别器在识别这些文本方面做得非常出色。识别出来的文字看起来很准确,对特殊字符和空格的检测也很准确。
我们在另一个类似的文档上实现 OCR。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/13-document-2.png'
ocr_img(img_path)
此图像中的检测器遗漏了此文档图像中的一些文本。但是,无论检测器检测到什么文本,OCR 都能正确预测。从文档图像来看,我们可以说检测器和识别器不擅长处理小文本。当遇到小文本时,它会错过或错误地预测输出。
4)手写文件
我们还可以在手写文本文档上测试我们的管道。例如,我们来试试这张图片。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/15-document-3.jpg'
ocr_img(img_path)
如图所见,从结果看原文,OCR 根本不准确。尽管检测器非常好,但识别器一点也不好。其背后的主要原因可能是 OCR 接受训练的数据。PP-OCR 在 MJSynth 和 SynthText 数据集上训练,这是一个合成文本数据集。这些数据集不是现实生活中的文本图像,而是计算机生成的文本图像。因此,由于训练数据集中缺少手写文本可能是 OCR 在这些类型的图像上表现不佳的一个重要因素。
5)牌照
车牌是 OCR 中最流行和最重要的用例之一,并且性能非常好。ALPR 现在用于各种商业和研究领域。已识别的车牌可用于查找任何违规行为、车辆登记、收费站等。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/17-license-plate.jpg'
ocr_img(img_path)
那太精彩了!预测的边界框非常紧凑,甚至识别的文本也很准确。ALPR 也可以应用于视频源,并进行一些调整以提高准确性。
6)路标
可以应用 OCR 的最重要场景之一是路标。由于自动驾驶汽车的发展,这个应用程序变得非常重要,例如读取速度限制、停车标志等。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/23-sign-board-1.jpg'
ocr_img(img_path)
那是相当准确的。OCR 能够识别所有文本,甚至包括括号等特殊字符。让我们在另一张图片上试试。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/25-sign-board-2.jpg'
ocr_img(img_path)
这非常准确。通过检测每个文本字段,检测器工作得很好。OCR 在这些场景中也表现出色。我们可以肯定地说,自动驾驶汽车可以很容易地依赖这个 OCR。
7)交易卡
交易卡或收藏卡在当今从儿童到成人中非常流行,用于玩耍和交易。其中一些包含非常高的货币价值,高达数百万美元。因此,值得在这些卡片上尝试 OCR。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/27-trading-card.jpg'
ocr_img(img_path)
OCR 在这方面不算太好,也不算太差。这里有几件事需要注意,OCR 预测了一些没有空格的文本,其中文本的尺寸有点小,类似于文档部分的情况。此外,检测器还没有检测到一些尺寸也非常小的文本字段
。
8)曲线文字
到目前为止,我们只看到了直线上的文本,但如果文本是弯曲的呢?OCR 和文本检测器的性能如何?我们也来试试。
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/19-curved-text-1.jpg'
ocr_img(img_path)
虽然是一张简单的图片,但是看识别结果,只有一个英文单词,有点惊讶。再来试一张:
from ocr_img_util import ocr_img
# Applying OCR
img_path = './input_images/21-curved-text-2.jpg'
ocr_img(img_path)
好吧,如图所见,结果非常糟糕。检测器无法检测到文本字段。原因是因为训练数据。训练默认检测器的数据包含所有直线文本。即使是神经网络也应该预测弯曲的边界框,这通过使用与现在使用的相同的网络是不可能的。因此,当看到弯曲的文本时,检测器无法检测到它。PaddleOCR 提供了一个名为 SAST 的文本检测器,专门为弯曲文本创建和训练。但截至目前,PaddleOCR 并未为此管道提供 OCR。
三、实验总结
从上面的实验中,我们可以得出结论,PP-OCR 是一种非常快速且高度准确的 OCR 以及文本检测器。但它 在某些情况下会失败,例如手写文本、弯曲文本和小文本,这些文本无法检测到或识别不准确。
为了解决这些问题,可以在更多数据集上对 OCR 和检测器进行微调,这有助于提高准确性并在各种不同场景中获得更好的性能。
四、参考文档
opencv开源项目:https://github.com/spmallick/learnopencv/tree/master/Optical-Character-Recognition-using-PaddleOCR
opencv开放文档:https://learnopencv.com/optical-character-recognition-using-paddleocr/
paddlepaddle官方文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/install/pip/windows-pip.html
系列攻略:
PaddleOCR #hello paddle: 从普通程序走向机器学习程序 - 初识机器学习
PaddleOCR #使用PaddleOCR进行光学字符识别 - OCR模型对比
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)