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

2023-05-16

转载 AI开发者 :https://mp.weixin.qq.com/s/Eq6POwgyME_WJYK9NWpzDw

什么是 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.gitcd darknetmake

我们开始吧~

首先获取数据


在任何基于机器学习的项目中,数据都是第一步也是最重要的。所以,无论你的应用程序是什么,确保你有大约 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-ocrsudo apt-get updatesudo apt install tesseract-ocrsudo apt install libtesseract-devsudo 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用YOLO+Tesseract实现定制OCR系统 的相关文章

  • 线程池实现原理

    创建线程有哪几种方式 一 继承Thread类创建线程类 xff08 1 xff09 定义Thread类的子类 xff0c 并重写该类的run方法 xff0c 该run方法的方法体就代表了线程要完成的任务 因此把run 方法称为执行体 xff
  • linux查看cpu与内存

    查看cpu 第一种方法 xff1a top命令法 1 首先执行top命令 xff1b 2 在top命令的显示界面 xff0c 按数据键1 xff0c 即可查看到当前系统中的总cpu数 xff1b 第二种方法 xff1a 通过proc文件系统
  • Element 布局组件el-row和el-col 详解

    1 背景 element的布局方式与bootstrap原理是一样的 xff0c 将网页划分成若干行 xff0c 然后每行等分为若干列 xff0c 基于这样的方式进行布局 xff0c 形象的成为栅栏布局 区别是element可将每行划分为24
  • netbeans中配置maven

    deploy 发布到远程maven库 本节默认maven库为nexus netbeans中按ctrl 43 1 xff0c 打开Project窗口 xff1b 在Project窗口中找到相关的project或module 在项目名上点击鼠标
  • 订阅关系一致

    订阅关系一致指的是同一个消费者Group ID下所有Consumer实例所订阅的Topic Tag必须完全一致 如果订阅关系不一致 消息消费的逻辑就会混乱 甚至导致消息丢失 本文提供订阅关系一致的正确示例代码以及订阅关系不一致的可能原因 帮
  • java之PO,VO,TO,QO,BO等

    PO persistant object 持久对象 在 o r 映射的时候出现的概念 xff0c 如果没有 o r 映射 xff0c 没有这个概念存在了 通常对应数据模型 数据库 xff0c 本身还有部分业务逻辑的处理 可以看成是与数据库中
  • 多生产者多消费者问题的无锁队列实现

    背景 代码根据论文 Implementing Lock Free Queues 复现 背景知识博客 xff1a 左耳朵耗子博客 https coolshell cn articles 8239 html 代码地址 xff1a https g
  • Ubuntu18下Github+Hexo搭建博客教程

    我的博客 xff0c 欢迎来访 xff1a www zxwsbg cn 搭建 安装git nodejs sudo apt get install git sudo apt get install nodejs sudo apt get in
  • linux中提供了PF_PACKET接口可以操作链路层的数据

    http blog sina com cn s blog 82f2fc28010132og html sock raw xff08 注意一定要在root下使用 xff09 原始套接字编程可以接收到本机网卡上的数据帧或者数据包 对于监听网络的
  • 分享52个Java源码,总有一款适合您

    Java源码 分享52个Java源码 xff0c 总有一款适合您 下面是文件的名字 xff0c 我放了一些图片 xff0c 文章里不是所有的图主要是放不下 xff0c 大家下载后可以看到 源码下载链接 xff1a https pan bai
  • 抽象类中的方法该如何实现呢?

    本节通过一个案例来学习如何实现抽象类中的方法 xff0c 具体步骤如下 xff1a 1 创建Animal类 创建一个Animal抽象类 xff0c 并在类中定义一个抽象call 方法 xff0c 如文件3 25所示 文件3 25Animal
  • zset类型的底层数据结构的实现

    参考资料 xff1a redis中zset底层实现原理 渣渣 CSDN博客 zset底层数据结构 redis的zset数据结构 xff1a 跳表 知乎 zset类型的底层数据结构的实现 xff1f zset是Redis提供的一个非常特别的数
  • XD软件都有哪些基础操作?

    下面我们来学习一下XD软件的基础操作 xff0c 包括资产面板的功能 交互动作 一键切图等等 1 重复网格 xff08 1 xff09 重复网格可智能复制其选择对象 xff0c 并批量更换图片 修改文字 之间距离等 xff08 2 xff0
  • 3分钟掌握7个XD基础操作

    下面我们来学习一下XD软件的基础操作 xff0c 包括资产面板的功能 交互动作 一键切图等等 1 重复网格 xff08 1 xff09 重复网格可智能复制其选择对象 xff0c 并批量更换图片 修改文字 之间距离等 xff08 2 xff0
  • 目标跟踪常用算法——EKF篇

    目录 1 扩展卡尔曼滤波算法 1 1 扩展卡尔曼滤波算法简单介绍 1 2 扩展卡尔曼滤波算法流程 1 3 扩展卡尔曼滤波算法仿真分析 2 参考文献 1 扩展卡尔曼滤波算法 1 1 扩展卡尔曼滤波算法简单介绍 对于非线性滤波问题 xff0c
  • 人工智能概述

    目录 什么是人工智能实现人工智能的方法逻辑编程机器学习深度学习机器学习和深度学习的区别 人工智能的分类如何实现人工智能 什么是人工智能 人工智能 又被称为机器智能 xff0c 是一种综合计算机科学 统计学 语言学等多种学科 xff0c 使机
  • java注解(annotation)的执行顺序

    可以在切面上使用 64 Order注解 如 64 Component 64 Aspect 64 Order 1 public class Aspect1 64 Component 64 Aspect 64 Order 2 public cl
  • Eclipse 常用快捷键 (动画讲解)

    Eclipse 常用快捷键 动画讲解 Eclipse有强大的编辑功能 xff0c 工欲善其事 xff0c 必先利其器 xff0c 掌握Eclipse快捷键 xff0c 可以大大提高工作效率 小坦克我花了一整天时间 xff0c 精选了一些常用
  • javaweb三大框架SSH

    1 MVC三层架构 xff1a 模型层 xff0c 控制层和视图层 模型层 xff0c 用Hibernate框架让来JavaBean在数据库生成表及关联 xff0c 通过对JavaBean的操作来 对数据库进行操作 xff1b 控制层 xf
  • HTTP请求方式及区别

    GET 向特定的路径资源发出请求 xff0c 数据暴露在url中 POST 向指定路径资源提交数据进行处理请求 xff08 一般用于上传表单或者文件 xff09 xff0c 数据包含在请求体中 OPTIONS 返回服务器针对特定资源所支持的

随机推荐

  • C++实现邮件群发的方法

    这篇文章主要介绍了C 43 43 实现邮件群发的方法 较为详细的分析了邮件发送的原理与C 43 43 相关实现技巧 非常具有实用价值 需要的朋友可以参考下 本文实例讲述了C 43 43 实现邮件群发的方法 分享给大家供大家参考 具体如下 x
  • Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)

    Asp Net Core IIS发布后PUT DELETE请求错误405 0 Method Not Allowed 因为使用了无效方法 HTTP 谓词 一 在使用Asp net WebAPI 或Asp Net Core WebAPI 时 x
  • Java lambda表达式使用笔记

    package com allsaints music admin import com allsaints music admin service entrymgr bak Student import lombok Data impor
  • .NET Framework 与 .NET Core 的区别与联系

    当今 net 生态系统如下 xff1a 从上面图中我们可以看到 net 主要分为三个部分 net FrameWork net Core Xamarin XAMARIN 主要用来构建APP的 xff08 包括IOS xff0c Android
  • .net 代码命名规范

    CAST 源代码命名规范手册 v1 1 Pascal 命名 xff1a 每一个单词首字母必须大写 Camel 命名 xff1a 第一个单词首字母小写 xff0c 其余单词首字母必须大写 任何命名必须优先使用英文单词表达意思 xff0c 若不
  • SpringBoot项目配置文件编写方式参考

    背景 为防止出现各环境配置文件不同步的情况 xff0c 现根据实际开发情况 xff0c 制定该配置文件编写参考 介绍 SpringBoot使用一个全局的配置文件 xff0c 配置文件名是固定的 xff1b application prope
  • xshell 连接 Linux kvm图形界面报错问题

    如下的报错 zyq 64 zyq sudo virt manager zyq 64 zyq virt manager 18561 Gtk WARNING cannot open display localhost 10 0 以上前提是需先安
  • 一文让你看懂Golang如何打造实时聊天系统

    项目截图 简介 在本次课程中 xff0c 我们来学习使用WebSocket来打造一个实时聊天系统 我们会从一下几个方面来进行学习 xff1a 什么是websocket xff1b Websocket与传统的HTTP协议有什么区别 xff1b
  • 【IBM MQ】使用IBM MQ远程连接时报错AMQ 4043解决思路

    我使用IBM MQ客户端远程连接队列管理器时 xff0c 报错 AMQ 4043 xff0c 百度基本找不到解决办法 xff0c 唯一一个解决方法是这个 xff08 https stackoom com question 1sroR xff
  • Arch Linux安装桌面及常用软件

    Arch Linux安装桌面及常用软件 安装桌面环境 显卡驱动 span class token comment 查看显卡情况 span lspci k span class token operator span span class t
  • Python 报错处理 paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

    使用多进程启动多个ssh报错 xff1a Exception client Error reading SSH protocol banner Errno 104 Connection reset by peer During handli
  • 信息加密(简单的字母转换)

    题目 在传递信息的过程中 xff0c 为了加密 xff0c 有时需要按一定规则将文本转换成密文发送出去 有一种加密规则是这样的 xff1a 1 对于字母字符 xff0c 将其转换成其后的第3个字母 例如 xff1a A D xff0c a
  • js按钮绑定点击事件

    1 第一种 34 btn 34 click function 操作 2 第二种 document getElementById 39 foo 39 addEventListener 39 click 39 function 3 第三种 xf
  • 微信小程序与微信公众号同一用户登录问题

    微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口 整理相关资料以及个人认识的心得写了这篇文章与大家一起分享 首先 xff0c 简单说下我遇到的问题是我们的程序调用微信小程序得到openid 然后通过ope
  • 快速编译system.img和boot.img的方法【转】

    本文转载自 xff1a http www cnblogs com wanqieddy archive 2012 10 22 2734024 html 快速编译system img xff0c 可以使用这个命令 xff1a make syst
  • SSM----SpringMVC

    SpringMVC 1 什么是SpringMVC Spring MVC属于SpringFrameWork的后续产品 xff0c 已经融合在Spring Web Flow里面 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模
  • mvp契约类

    public class MainActivity extends AppCompatActivity implements IContract IView private IContract IPresenter presenter 64
  • Rxjava和Retrofit结合使用大量请求时候出现OOM的问题

    在使用RxJava 43 Retrofit的过程中 出现了OOM的问题 报错日志如下 java lang OutOfMemoryError pthread create 1040KB stack failed Try again at ja
  • vc++中进程间的通信

    进程通常被定义为一个正在运行的程序的实例 xff0c 它由两个部分组成 xff1a 一个是操作系统用来管理进程的内核对象 内核对象也是系统用来存放关于进程的统计信息的地方 另一个是地址空间 xff0c 它包含所有的可执行模块或DLL模块的代
  • 如何用YOLO+Tesseract实现定制OCR系统

    转载 AI开发者 xff1a https mp weixin qq com s Eq6POwgyME WJYK9NWpzDw 什么是 OCR xff1f OCR 指的是光学字符识别 它用于从扫描的文档或图片中读取文本 这项技术被用来将几乎任