专栏首页AI算法与图像处理如何用YOLO+Tesseract实现定制OCR系统?

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

来源:AI开发者

在本文中,你将学习如何在深度学习的帮助下制作自己自定义的 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算法与图像处理(AI_study)

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 目标检测算法之NMS后处理相关

    昨天盘点了一下目标检测算法的常见数据集还有评判标准,但目标检测过程还有一个后处理算法的重要性确常被忽略,今天我们就来盘点一下目标检测算法中的NMS相关知识吧。

    BBuf
  • 人脸识别系列三 | MTCNN算法详解下篇

    上篇讲解了MTCNN算法的算法原理以及训练细节,这篇文章主要从源码实现的角度来解析一下MTCNN算法。我要解析的代码来自github的https://githu...

    BBuf
  • 《Deeplab V1》论文阅读

    同时,我截取Caffe中的deeplabv1中的prototxt的网络结构可视化图:

    BBuf
  • 3*3卷积+1*3卷积+3*1卷积=白给的精度提升

    下面要介绍的论文发于ICCV2019,题为「ACNet:Strengthening the Kernel Skeletons for Powerful CNN ...

    BBuf
  • 《DeepLab V3》论文阅读

    本文首先回顾了空洞卷积在语义分割中的应用,这是一种显式调整滤波器感受野和控制网络特征响应分辨率的有效工具。为了解决多尺度分割对象的问题,我们设计了采用级联或并行...

    BBuf
  • 《DeepLab V2》论文阅读

    昨天的推文《DeepLab V2》组织方式很不清晰,没有将关键结论以及空洞卷积这种方法的优点讲出来,所以重新组织了一下这篇论文的解读,希望可以带来不一样的体验。

    BBuf
  • 目标检测算法之SSD

    昨天介绍了特征金字塔网络用于目标检测,提升了多尺度目标检测的鲁棒性,今天开始讲讲One-Stage目标检测算法中SSD算法。这个算法是我平时做工程中最常用到的,...

    BBuf
  • Facebook的新门户网站:更多追踪方式(Security)

    Facebook周三宣布了Portal家族的三个新成员:新的Portal,Portal Mini和Portal TV。

    吴亚芳
  • 《ENet》论文阅读及实现

    昨天介绍了目标检测算法之YOLOv2,但还留下一个比较大的坑没填,就是YOLOv2的损失函数解析,今天没来得及做这个工作,来解析一篇高速度的针对嵌入式端的语义分...

    BBuf
  • 目标检测算法之YOLOv1

    今天开始分享一下YOLO系列的目标检测算法,前面介绍了SSD算法和Faster-RCNN,现在公司用Faster-RCNN的似乎不是很多,主要集中在YOLO,S...

    BBuf

扫码关注云+社区

领取腾讯云代金券