引言: PaddleOCR 是一个 OCR 框架或工具包,它提供多语言实用的 OCR 工具,帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型,使 OCR 高度准确并接近商业产品。它提供文本检测、文本方向分类器和文本识别。PaddleOCR 在其工具包中提供了多种模型,包括旗舰 PP-OCR 和最新算法,如 SRN、NRTR 等。
OCR-002
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

参考结果:
ocr-02-04

2)需要确认 pip 的版本是否满足要求,要求 pip 版本为 20.2.2 或更高版本

python -m pip --version

参考结果:
ocr-02-06
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”即可:
ocr-02-08
 

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

ocr-02-10

 

1.3 验证安装

安装完成后你可以使用 python 进入 python 解释器,输入import paddle ,再输入 paddle.utils.run_check()
如果出现 PaddlePaddle is installed successfully!,说明你已成功安装。
ocr-02-12
 

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 中英文模型

在源码中找一张中文图片:
ocr-02-14
检测 + 方向分类器 + 识别全流程:

  • --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包含了文本框,文字和识别置信度:
ocr-02-16
查看源码可知,默认开启的是中文 ch 模式,检测(–det)默认已开启,识别(–rec)默认已开启。

  • img:这是ocr函数中的第一个参数。在此,传递图像数组或图像路径以执行OCR
  • det:以 bool 作为参数并指定是否使用检测器
  • rec:以 bool 作为参数并指定是否使用识别器
  • cls:以bool为参数,指定是否使用角度分类器

ocr-02-18

单独使用检测:设置 --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)英语

ocr-02-20
PaddleOCR 目前支持80个语种,可以通过修改 --lang 参数进行切换,比如使用英文模型,指定 --lang=en

paddleocr --image_dir ./doc/imgs_en/model_prod_flow_en.png --lang=en

结果是一个list,每个item包含了文本框,文字和识别置信度:
ocr-02-22

2)日语

像这样一张带有日文的图片:
ocr-02-24
CMD 执行命令:

paddleocr --image_dir ./doc/imgs/japan_1.jpg --lang=japan

如果设置的语言,在本机环境中没有对应的语言包,则会自动进行下载:
ocr-02-26
附 常用的多语言简写包括:
ocr-02-28

 

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。
ocr-02-30

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/05-receipt1.jpg'
ocr_img(img_path)

结果可视化:
ocr-02-32
让我们在另一张小票图片上测试我们的 OCR。
ocr-02-34

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/05-receipt1.jpg'
ocr_img(img_path)

ocr-02-36
可以看出,OCR 在收据上的表现非常出色。它已经能够捕获几乎所有的详细信息,例如金额、订单、订单号等,并且与收据的数字顺序相同。因此,我们可以说 PP-OCR 在收据和类似文件上的表现相当不错。

2)身份证

身份证主要用于安全目的和识别目的。当 OCR 应用于 ID 卡时,它可用于提取姓名、代码、分支机构等信息,这些信息可用于在电子门上进行访问或将信息存储在数据库中。我们将在下图上尝试 OCR。
ocr-02-38

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/09-id-card.jpg'
ocr_img(img_path)

ocr-02-40
哇!!那很快而且非常准确。它检测了所有字段,如船号、日期、ID 号等,即使文本倾斜,这些也是这里的关键信息。

3)文件

文档识别一直是 OCR 的重要研究领域之一。在我们的生活中几乎每天都在使用文档。当 OCR 应用于文档时,它可用于检索重要信息、检索表单字段、分析布局、数字存储以及阅读旧手稿。所有这些任务都可以使用 OCR 轻松完成。
ocr-02-42

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/11-document-1.jpg'
ocr_img(img_path)

ocr-02-44
输出在检测和识别方面都非常准确。PP-OCR 能够检测文档中的所有文本字段,并且识别器在识别这些文本方面做得非常出色。识别出来的文字看起来很准确,对特殊字符和空格的检测也很准确。

我们在另一个类似的文档上实现 OCR。
ocr-02-46

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/13-document-2.png'
ocr_img(img_path)

ocr-02-48
此图像中的检测器遗漏了此文档图像中的一些文本。但是,无论检测器检测到什么文本,OCR 都能正确预测。从文档图像来看,我们可以说检测器和识别器不擅长处理小文本。当遇到小文本时,它会错过或错误地预测输出。

4)手写文件

我们还可以在手写文本文档上测试我们的管道。例如,我们来试试这张图片。
ocr-02-50

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/15-document-3.jpg'
ocr_img(img_path)

ocr-02-52
如图所见,从结果看原文,OCR 根本不准确。尽管检测器非常好,但识别器一点也不好。其背后的主要原因可能是 OCR 接受训练的数据。PP-OCR 在 MJSynth 和 SynthText 数据集上训练,这是一个合成文本数据集。这些数据集不是现实生活中的文本图像,而是计算机生成的文本图像。因此,由于训练数据集中缺少手写文本可能是 OCR 在这些类型的图像上表现不佳的一个重要因素。

5)牌照

车牌是 OCR 中最流行和最重要的用例之一,并且性能非常好。ALPR 现在用于各种商业和研究领域。已识别的车牌可用于查找任何违规行为、车辆登记、收费站等。
ocr-02-54

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/17-license-plate.jpg'
ocr_img(img_path)

ocr-02-56
那太精彩了!预测的边界框非常紧凑,甚至识别的文本也很准确。ALPR 也可以应用于视频源,并进行一些调整以提高准确性。

6)路标

可以应用 OCR 的最重要场景之一是路标。由于自动驾驶汽车的发展,这个应用程序变得非常重要,例如读取速度限制、停车标志等。
ocr-02-58

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/23-sign-board-1.jpg'
ocr_img(img_path)

ocr-02-60
那是相当准确的。OCR 能够识别所有文本,甚至包括括号等特殊字符。让我们在另一张图片上试试。
ocr-02-62

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/25-sign-board-2.jpg'
ocr_img(img_path)

ocr-02-64
这非常准确。通过检测每个文本字段,检测器工作得很好。OCR 在这些场景中也表现出色。我们可以肯定地说,自动驾驶汽车可以很容易地依赖这个 OCR。

7)交易卡

交易卡或收藏卡在当今从儿童到成人中非常流行,用于玩耍和交易。其中一些包含非常高的货币价值,高达数百万美元。因此,值得在这些卡片上尝试 OCR。
ocr-02-66

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/27-trading-card.jpg'
ocr_img(img_path)

ocr-02-68
OCR 在这方面不算太好,也不算太差。这里有几件事需要注意,OCR 预测了一些没有空格的文本,其中文本的尺寸有点小,类似于文档部分的情况。此外,检测器还没有检测到一些尺寸也非常小的文本字段

8)曲线文字

到目前为止,我们只看到了直线上的文本,但如果文本是弯曲的呢?OCR 和文本检测器的性能如何?我们也来试试。
ocr-02-70

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/19-curved-text-1.jpg'
ocr_img(img_path)

ocr-02-72
虽然是一张简单的图片,但是看识别结果,只有一个英文单词,有点惊讶。再来试一张:
ocr-02-74

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/21-curved-text-2.jpg'
ocr_img(img_path)

ocr-02-76
好吧,如图所见,结果非常糟糕。检测器无法检测到文本字段。原因是因为训练数据。训练默认检测器的数据包含所有直线文本。即使是神经网络也应该预测弯曲的边界框,这通过使用与现在使用的相同的网络是不可能的。因此,当看到弯曲的文本时,检测器无法检测到它。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模型对比

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐