在本文中,你将学习如何在深度学习的帮助下制作自己自定义的 OCR 来读取图像中的文字内容。我将通过 PAN-Card 图像的示例,带你学习如何进行文本检测和文本识别。但首先,让我们熟悉一下光学字符识别的过程。
什么是 OCR?
OCR 指的是光学字符识别。它用于从扫描的文档或图片中读取文本。这项技术被用来将几乎任何一种包含书面文本(手写或者机器写的字)的图像转换成机器可读的文本数据。
在这里,我们将构建一个 OCR,它只读取您你望它从给定文档中读取的信息。
OCR 有两个主要模块:
文本检测
文本识别
文本检测
我们的第一个任务是从图像/文档中检测所需的文本。通常,根据需要,你不想阅读整个文档,而只想阅读一条信息,如信用卡号、Aadhaar/PAN 卡号、姓名、账单金额和日期等。检测所需文本是一项艰巨的任务,但由于深度学习,我们将能够有选择地从图像中读取文本。
文本检测或一般的目标检测是随着深度学习而加速的一个密集研究领域。今天,文本检测可以通过两种方法来实现。
基于区域的检测器
单点检测器
在基于区域的方法中,第一个目标是找到所有有对象的区域,然后将这些区域传递给分类器,分类器为我们提供所需对象的位置。所以,这是个过程分为 2 步。
首先,它找到边界框,然后找到它的类。这种方法更准确,但与单点检测方法相比速度相对较慢。Faster R-CNN 和 R-FCN 等算法采用这种方法。
然而,单点检测器同时预测边界盒和类。作为一个单步过程,它要快得多。然而,必须注意的是,单点检测器在检测较小物体时表现不佳。SSD 和 YOLO 就是单点检测器。
在选择目标检测器时,通常会在速度和精度之间进行权衡。例如,速度更快的 R-CNN 具有最高的准确性,而 YOLO 则是最快的。这是一篇很好的文章,它比较了不同的检测器,并对它们的工作原理提供了全面的见解。
决定使用哪一个,完全取决于你的诉求。在这里,我们使用 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 ,因为它是一个简单的工具,工作起来很方便。按照此链接,了解数据标注的过程。
请注意,标记要从图像数据中读取的所有文本字段非常重要。它还生成训练期间所需的数据文件夹。
标记后,请确保将导出格式设置为 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 参数。
资源
通过本文,我希望你能够全面了解光学字符识别中涉及的各个步骤,并在阅读本文的同时实现自己的 OCR 程序。我鼓励你在不同的图像集上尝试这种方法,并为你的应用程序使用不同的检测器,看看什么样的方法最有效。
via:https://medium.com/saarthi-ai/how-to-build-your-own-ocr-a5bb91b622ba
雷锋网雷锋网雷锋网