专栏首页AI研习社如何用YOLO+Tesseract实现定制OCR系统?

如何用YOLO+Tesseract实现定制OCR系统?

在本文中,你将学习如何在深度学习的帮助下制作自己自定义的 OCR 来读取图像中的文字内容。我将通过 PAN-Card 图像的示例,带你学习如何进行文本检测和文本识别。但首先,让我们熟悉一下光学字符识别的过程。
什么是 OCR ?
OCR 指的是光学字符识别。它用于从扫描的文档或图片中读取文本。这项技术被用来将几乎任何一种包含书面文本(手写或者机器写的字)的图像转换成机器可读的文本数据。

在这里,我们将构建一个 OCR,它只读取您你望它从给定文档中读取的信息。

OCR 有两个主要模块:

  • 文本检测
  • 文本识别

文本检测

我们的第一个任务是从图像/文档中检测所需的文本。通常,根据需要,你不想阅读整个文档,而只想阅读一条信息,如信用卡号、Aadhaar/PAN 卡号、姓名、账单金额和日期等。检测所需文本是一项艰巨的任务,但由于深度学习,我们将能够有选择地从图像中读取文本。

文本检测或一般的目标检测是随着深度学习而加速的一个密集研究领域。今天,文本检测可以通过两种方法来实现。

  • 基于区域的检测器
  • 单点检测器

在基于区域的方法中,第一个目标是找到所有有对象的区域,然后将这些区域传递给分类器,分类器为我们提供所需对象的位置。所以,这是个过程分为 2 步。

首先,它找到边界框,然后找到它的类。这种方法更准确,但与单点检测方法相比速度相对较慢。Faster R-CNN 和 R-FCN 等算法采用这种方法。

然而,单点检测器同时预测边界盒和类。作为一个单步过程,它要快得多。然而,必须注意的是,单点检测器在检测较小物体时表现不佳。SSD 和 YOLO 就是单点检测器。

在选择目标检测器时,通常会在速度和精度之间进行权衡。例如,速度更快的 R-CNN 具有最高的准确性,而 YOLO 则是最快的。这里有一篇很好的文章(https://medium.com/@jonathan_hui/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359),它比较了不同的检测器,并对它们的工作原理提供了全面的见解。

决定使用哪一个,完全取决于你的诉求。在这里,我们使用 YOLOv3 主要是因为:

  • 在速度方面谁也比不上它
  • 对我们的应用来说有足够的准确性
  • YOLOv3 具有特征金字塔网络(FPN)以更好地检测小目标

说得够多了,让我们深入了解 YOLO。

使用YOLO进行文本检测

YOLO 是一个最先进的实时目标检测网络,有很多版本,YOLOv3 是最新、最快的版本。

YOLOv3 使用 Darknet-53 作为特征提取程序。它总共有 53 个卷积层,因此被命名为「Darknet-53」。它有连续的 3×3 和 1×1 卷积层,并有一些短连接。

为了分类,独立的逻辑分类器与二元交叉熵损失函数一起使用。

使用Darknet框架训练YOLO

我们将使用 Darknet 神经网络框架进行训练和测试。该框架采用多尺度训练、大量数据扩充和批量规范化。它是一个用 C 和 CUDA 编写的开源神经网络框架。它速度快,易于安装,支持 CPU 和 GPU 计算。

你可以在 GitHub 上找到源代码:https://github.com/pjreddie/darknet

下面是安装 Darknet 框架的简单方法。只有 3 行!(如果要使用 GPU,请在 makefile 中更新 GPU=1 和 CUDNN=1。)

git clone https://github.com/pjreddie/darknet.git
cd darknet
make

我们开始吧~

首先获取数据

在任何基于机器学习的项目中,数据都是第一步也是最重要的。所以,无论你的应用程序是什么,确保你有大约 100 个图像。如果你的图像数量较少,则使用图像增强来增加数据的大小。在图像增强中,我们主要通过改变图像的大小、方向、光线、颜色等来改变图像。

有许多方法可用于增强,你可以很容易地选择任何你喜欢的方法。我想提到一个名为 Albumentations 的图像增强库,它是由 Kaggle Masters 和 Grandmaster 构建的。

我收集了 50 互联网上的 PAN 卡图像,利用图像增强技术,创建了一个包含 100 张 PAN 卡图像的数据集。

数据标注

一旦我们收集了数据,我们就进入下一步,即标记它。有许多可用的免费数据注释工具。我使用 VoTT v1 ,因为它是一个简单的工具,工作起来很方便。按照此链接(https://github.com/Microsoft/VoTT/tree/v1),了解数据标注的过程。

请注意,标记要从图像数据中读取的所有文本字段非常重要。它还生成训练期间所需的数据文件夹。

标记后,请确保将导出格式设置为 YOLO。标注后,将所有生成的文件复制到存储库的数据文件夹中。

训练

为了消除所有的困惑,Darknet 有两个存储库,一个是原作者的,另一个是分支。我们使用分支存储库,它的文档很好。

要开始训练 OCR,首先需要修改配置文件。你将在名为「yolov3.cfg」的「cfg」文件夹中获得所需的配置文件。在这里,你需要更改批大小、细分、类数和筛选器参数。按照文档中给出的配置文件中所需的更改进行操作。

我们将开始训练,预先训练 darknet-53,这将有助于我们的模型早日收敛。

用这个命令开始训练:

./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74

最好的是它有多个 GPU 支持。当你看到平均损失'0.xxxxxx avg'在一定次数的迭代后不再减少时,你应该停止训练。正如你在下面的图表中看到的,当损失变为常数时,我停止了 14200 次迭代。

损失曲线

从上一个权重文件中获得最佳结果并不总是这样。我在第 8000 次迭代中得到了最好的结果。你需要根据 mAP(平均精度)得分对它们进行评估。选择具有最高分数的权重文件。所以现在,当你在一个样本图像上运行这个检测器时,你将得到检测到的文本字段的边界框,从中你可以很容易地裁剪该区域。

虚拟 PAN 卡上的文本检测

文本识别

现在我们已经实现了用于文本检测的自定义文本检测器,接下来我们将继续进行文本识别。你可以构建自己的文本识别器,也可以使用开源的文本识别器。

虽然,实现自己的文本识别器是一个很好的实践,但是获取标签数据是一个挑战。但是,如果你已经有很多标签数据来创建自定义文本识别器,那么它的准确性可能会提高。

然而,在本文中,我们将使用 Tesseract OCR 引擎进行文本识别。只要稍加调整,Tesseract OCR 引擎就可以为我们的应用程序创造奇迹。我们将使用 Tesseract 4,这是最新版本。谢天谢地,它还支持多种语言。

安装Tesseract OCR引擎

它支持 Ubuntu 14.04、16.04、17.04、17.10 版本,对于 Ubuntu 18.04 版本,跳过前两个命令。

sudo add-apt-repository ppa:alex-p/tesseract-ocr
sudo apt-get update
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
sudo pip install pytesseract

组合在一起

一旦我们实现了文本检测和文本识别的过程,就应该将它们结合起来,以实现以下流程:

  • 从图像中检测请求的区域
  • 把检测到的区域传给 Tesseract
  • 将 Tesseract 的结果存储为所需的格式

从上面的图中,你可以了解到,首先 PAN 卡的图像被传递到 YOLO 中。然后,YOLO 检测到所需的文本区域并从图像中裁剪出来。稍后,我们将这些区域逐一传递给 Tesseract。Tesseract 读取它们之后,我们存储这些信息。

现在,你可以选择任何形式的来表示结果。在这里,我使用 excel 表格来显示结果。

我已经开放了整个管道。复制存储库并将数据文件夹和训练后生成的权重文件移动到此存储库目录。你需要通过以下命令在此处安装 darknet。

bash ./darknet.sh

现在用这个命令运行你的 OCR:

pan.py -d -t

祝贺你!现在你可以在输出文件夹中以 CSV 文件的形式看到 OCR 结果。检测自定义 OCR 时,可能需要更改图像的大小。为此,请调整 locate_asset.py 文件中的 basewidth 参数。

资源

  • Object detection https://towardsdatascience.com/object-detection-using-deep-learning-approaches-an-end-to-end-theoretical-perspective-4ca27eee8a9a
  • Region-based methods https://medium.com/@jonathan_hui/understanding-region-based-fully-convolutional-networks-r-fcn-for-object-detection-828316f07c99
  • Single-shot methods https://medium.com/@jonathan_hui/real-time-object-detection-with-yolo-yolov2-28b1b93e2088
  • Comparison of various detectors https://medium.com/@jonathan_hui/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359

通过本文,我希望你能够全面了解光学字符识别中涉及的各个步骤,并在阅读本文的同时实现自己的 OCR 程序。我鼓励你在不同的图像集上尝试这种方法,并为你的应用程序使用不同的检测器,看看什么样的方法最有效。

via:https://medium.com/saarthi-ai/how-to-build-your-own-ocr-a5bb91b622ba

本文分享自微信公众号 - AI研习社(okweiwu)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 人工智能胶囊系统以最先进的精度区分物体

    强有力的证据表明,人类总是依靠坐标系或参考线和曲线来推测空间中点的位置。这与广泛使用的计算机视觉算法不同,后者往往通过物体特征的数字表示来区分物体。为了寻求一种...

    AiTechYun
  • 【NLP】放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较

    在辞旧迎新的时刻,大家都在忙着回顾过去一年的成绩(或者在灶台前含泪数锅),并对 2019 做着规划,当然也有不少朋友执行力和工作效率比较高,直接把 2018 年...

    yuquanle
  • 机器学习中特征选择怎么做?这篇文章告诉你

    据《福布斯》报道,每天大约会有 250 万字节的数据被产生。然后,可以使用数据科学和机器学习技术对这些数据进行分析,以便提供分析和作出预测。尽管在大多数情况下,...

    Datawhale
  • NRFI:网络结点不会指数增加的「神经随机深林模拟」

    在过去几年,由于CIFAR-10和ImageNet这样的大数据集的涌现,卷积神经网络在一系列计算机视觉任务中取得了巨大的成功。然而现实世界中的很多问题缺乏大量的...

    AI科技评论
  • 清华教授刘知远:AI领域好的研究想法从哪里来?

    背景说明:临近ACL 2020投稿截止时间,跟同学密集讨论,争论哪些研究想法适合投到ACL并有机会命中。从自己十多年研究经历来看,如何判断一个研究想法好不好,以...

    AI算法与图像处理
  • 商业分析与数据分析、算法模型的关系与区别

    我们常说,办事情要“名正言顺”,而数据领域的名字则是格外的多,商业分析、数据分析、数据挖掘、算法模型……经常把大家绕晕,今天系统科普一下。

    接地气的陈老师
  • 计算机视觉领域如何从别人的论文里获取自己的idea?

    作者:Cheng Li https://www.zhihu.com/question/353691411/answer/900046621

    小小詹同学
  • 有一种改变未来架构演化方向的技术,叫Kubernetes

    2019年,是云原生理念和实践被广泛认可和传播的关键一年,作为未来云端及架构演进的新方向,在过去几年间,以 Kubernetes 为核心的“云原生”运动正不断扩...

    用户5224393
  • 一文读懂深度学习中的矩阵微积分,fast.ai创始人&ANTLR之父出品

    虽然网络上已经有不少关于多元微积分和线性代数的在线资料,但它们通常都被视作两门独立的课程,资料相对孤立,也相对晦涩。

    用户2769421
  • 让人百听不厌的数据报告,就藏在……

    有没有一种数据报告是让人百听不厌,听了还想听,没听到心理没底,甚至主动要求听的?当然有,而且你经常见到。那就是——

    接地气的陈老师

扫码关注云+社区

领取腾讯云代金券