【AI】OCR篇1

news2024/11/23 12:11:18

每日更新,建议关注、收藏、点赞

ocr流程

版面分析 、预处理-> 行列切割 -> 字符识别 -> 后处理识别矫正

  1. 判断页面上的文本朝向,图像预处理,做角度矫正和去噪。
  2. 对文档版面进行分析,进每一行进行行分割,把每一行的文字切割下来,最后再对每一行文本进行列分割,切割出每个字符。
  3. 将该字符送入训练好的OCR识别模型进行字符识别,得到结果。
  4. 但是模型识别结果往往是不太准确的,我们需要对其进行识别结果的矫正和优化,比如我们可以设计一个语法检测器,去检测字符的组合逻辑是否合理。比如,考虑单词Because,我们设计的识别模型把它识别为8ecause,那么我们就可以用语法检测器去纠正这种拼写错误,并用B代替8并完成识别矫正。

字符识别方法

  1. 开源OCR引擎Tesseract,这是谷歌维护的一个OCR引擎。Tesseract现在的版本已经支持识别很多种语言但汉字识别的精度上还是需要自己去改善。Tesseract在阿拉伯数字和英文字母上的识别还是可以的,如果你要做的应用是要识别英文或者数字,不妨考虑一下使用Tesseract;不过要做到你想要的识别率,后期微调或者优化肯定要多下功夫的。
  2. 字符模板匹配法。暴力的字符模板匹配法看起来很蠢,但是在简单应用上可能却很凑效。
    比如在对电表数字进行识别时,考虑到电表上的字体较少(可能就只有阿拉伯数字),而且字体很统一,清晰度也很高,所以识别难度不高。
    针对这种简单的识别场景,我们首先考虑的识别策略当然是最为简单和暴力的模板匹配法。我们首先定义出数字模板(0~9),然后用该模板滑动匹配电表上的字符,这种策略虽然简单但是相当有效。我们不需要左思右想去建模,训练模型,只需要识别前做好模板库就可以了。
  3. OCR的一般方法,即特征设计、特征提取、分类得出结果的计算机视觉通用的技巧。
    在深度学习之前,OCR的方法基本都是这种方法,其效果不算特别好。
    第一步是特征设计和提取,特征设计(做过模式识别相关项目的懂得都懂),我们现在识别的目标是字符,所以我们要为字符设计它独有的的特征,来为后面的特征分类做好准备。字符有结构特征,即字符的端点、交叉点、圈的个数、横线竖线条数等等,都是可以利用的字符特征。比如“品”字,它的特征就是它有3个圈,6条横线,6条竖线。除了结构特征,还有大量人工专门设计的字符特征,据说都能得到不错的效果。最后再将这些特征送入分类器(SVM)做分类,得出识别结果。
    这种方式最大的缺点就是,人们需要花费大量时间做特征的设计,这是一件相当费工夫的事情。通过人工设计的特征(例如HOG)来训练字符识别模型,此类单一的特征在字体变化,模糊或背景干扰时泛化能力迅速下降。而且过度依赖字符切分的结果,在字符扭曲、粘连、噪声干扰的情况下,切分的错误传播尤其突出。针对传统OCR解决方案的不足,学界业界纷纷拥抱基于深度学习的OCR。
  4. 现在OCR基本都用卷积神经网络来做了,而且识别率也是惊人的好,人们也不再需要花大量时间去设计字符特征了。在OCR系统中,人工神经网络主要充当特征提取器和分类器的功能,输入是字符图像,输出是识别结果。运用卷积神经网络
    当然用深度学习做OCR并不是在每个方面都很优秀,因为神经网络的训练需要大量的训练数据,那么如果我们没有办法得到大量训练数据时,这种方法很可能就不奏效了。其次,神经网络的训练需要花费大量的时间,并且需要用到的硬件资源一般都比较多,这几个都是需要考虑的问题。

证件照识别

  1. 将证件轮廓找到
    • 二值化+高斯滤波+膨胀+canny边缘提取
      这里膨胀的作用:使某些信息区域轮廓闭合,便于提取信息区域轮廓。
    • 轮廓查找并筛选
      有很多干扰项轮廓,如果我们不能很好的剔除这些轮廓,我们根本没法找出我们想要的信息区域。我筛选轮廓的方法很简单,就是找出一张图片中面积最大的那个轮廓作为我们的信息区域轮廓
  2. 提取证件矩形轮廓四点进行透视变换
    • 由于轮廓不一定是四边形的,所以(比如x坐标最大的那个坐标肯定是四边形右上角坐标或者右下角坐标,x坐标最小的那个坐标肯定是左上角或者下角的那个坐标,如此类推)这种思路不可行。
    • 基于直线交点的思路。我们首先使用霍夫变换找出四边形的边,然后求两两直线的交点就是四边形的顶点。
      最大的问题就是,我们怎么保证我们使用霍夫变换找到的直线刚好就是形成四边形的四条直线?所以我们就必须不断地去改变霍夫变换的参数,不断迭代,来求出一个可以形成四边形的直线情况。
      什么情况的直线我们不能接受?两两直线过于接近的、两两直线没有交点、检测出来的直线数目不是4条
      如果找到了满足条件的四条直线,我们就可以去计算他们的交点了。
      计算出四个交点后,继续筛选:两两定点的距离过近排除、四个点构成不了四边形排除
      通过以上筛选条件的,可以认为就是我们找的那四个顶点,这时我们就可以停止迭代,进行顶点排序,即确定这四个顶点哪个是左上角点,哪个又是右下点。
    • 用这四点来进行透视变换, 后文有详细的介绍。
  3. 字符识别部分

复杂场景下的ocr

OCR传统方法在应对复杂图文场景的文字识别能力不够,如何把文字在复杂场景读出来,并且读得准确,关键在于 场景文本识别(文字检测+文字识别)

  • 图片预处理
    • 透视矫正/透视变换
      透视变换是将图片投影到一个新的视平面,也称作投影映射。它是二维(x,y)到三维(X,Y,Z),再到另一个二维空间(x’,y’)的映射。我们常说的仿射变换是透视变换的一个特例。
      相对于仿射变换,它不仅仅是线性变换。它提供了更大的灵活性,可以将一个四边形区域映射到另一个四边形区域。
      透视变换也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同,这意味着仿射变换的所有变换透视变换也可以实现。而第三行则用于实现透视变换。
      在这里插入图片描述
      在这里插入图片描述
      注意:变换矩阵T和KT得到的结果是一样的,这个可以自己推一下,相当于分子共同因子还有k,还是把k给除掉了

通过透视变换,我们可以实现将一张正对我们的图片转换成仰视、俯视、侧视看这张图片的效果,反之也可以实现转换到正对的效果。

  • 仿射变换是透视变换的一种特例。
    仿射变换是一种二维坐标到二维坐标之间的线性变换,也就是只涉及一个平面内二维图形的线性变换。
    图形的平移、旋转、错切、放缩都可以用仿射变换的变换矩阵表示。
    它保持了二维图形的两种性质:
    ① “平直性”:直线经过变换之后依然是直线。一条直线经过平移、旋转、错切、放缩都还是一条直线。
    ②“平行性”:变换后平行线依然是平行线,且直线上点的位置顺序不变。
    任意的仿射变换都能表示为一个坐标向量乘以一个矩阵的形式
    在这里插入图片描述

#平移
x = 100
y = 200
M = np.float32([[1, 0, x], [0, 1, y]])
move1 = cv2.warpAffine(img, M, (width, height))

#旋转
retval = cv2.getRotationMatrix2D(center, angle, scale)
'''
center是旋转的中心点
angle是旋转角度,正数表示逆时针旋转,负数表示顺时针旋转
scale为变换尺寸(缩放大小)
'''

M = cv2.getRotationMatrix2D((width/2, height/2), 45, 1)
rotation = cv2.warpAffine(img, M, (width, height))

#透视变换
dst = cv2.warpPerspective(src, M, dsize, [, flags[, borderMode[, borderValue]]])
'''
dst代表透视处理后的输出图像,dsize决定输出图像的实际大小
src代表要透视的图像
M为一个3X3的变换矩阵
dsize代表输出图像的尺寸大小
flags表示差值方法,默认为INTER_LINEAR。当值为WARP_INVERSE_MAP时,意味着M为逆变换,实现从目标图像dst到src的逆变换。具体值见下表。
borderMode表示边类型。默认为BORDER_CONSTANT。当值为BORDER_TRANSPARENT时,意味着目标图像内的值不做改变,这些值对应着原始图像的异常值。
border表示边界值,默认为0
与仿射变化一样,可以使用函数cv2.getPerspectiveTransform()来生成转换矩阵。

'''
rows, cols, ch = img.shape
p1 = np.float32([[80, 266], [494, 27], [239, 543], [655, 300]])
# 左上角,右上角,左下角,右下角
p2 = np.float32(
    [[0, 0], [800, 0], [0, 600], [800, 600]])
M = cv2.getPerspectiveTransform(p1, p2)
dst = cv2.warpPerspective(img, M, (cols, rows))

#复杂的仿射变换
retval = cv2.getAffineTransform(src, dst)
'''
src表示输入图像的三个点坐标
dst表示输出图像的三个点坐标
src和dst三个点坐标分别表示平行四边形的左上角、右上角、右下角的三个点。
'''

rows, cols, ch = img.shape
p1 = np.float32([[81, 265], [240, 540], [496, 26]])
p2 = np.float32(
    [[0, 0], [0, 200], [300, 0]])
M = cv2.getAffineTransform(p1, p2)
dst = cv2.warpAffine(img, M, (cols, rows))

  • 水平矫正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI/机器学习(计算机视觉/NLP)方向面试复习4

1. 什么是知识图谱? 是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系。它的基本单位是(实体-关系-实体) 就是点-线-点。 存储类型有结构化和非结构化的数据。结构化数据就是关系数据库,一张表格,关系很清楚&…

leetcode面试算法题

1.数组/字符串 1.1合并两个有序数组 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 0;//遍历数组1int p2 0;//遍历数组2int[] nums3 new int[m n];int p 0;while (p1 < m && p2 < n) {//当数组1、2都没遍历完nums3[…

免费分享:中国1平方公里以上湖泊形状数据(附下载方法)

我国是世界上湖泊数量最多的国家之一&#xff0c;共有湖泊24800多个。其中面积在1平方千米以上的天然湖泊就有2800多个。湖泊分布呈现出显著的区域性差异。东部季风区&#xff0c;特别是长江中下游地区&#xff0c;分布着我国最大的淡水湖群&#xff1b;西部以青藏高原湖泊较为…

创新技术引领潮流,2024年录屏软件新技术

现在使用录屏工具的情况越来越多&#xff0c;大家可以用来录制游戏过程、可以用来录制教学视频、可以用来录制会议记录等需要记录屏幕操作的过程。那有什么适合我们自己的录屏工具吗&#xff1f;这次我给你介绍几款我用过的&#xff0c;你看看是不是符合你的需求吧。 1.福晰录…

多云应用安全平台RegData利用MongoDB简化数据控制和合规流程

在高度规范化市场中&#xff0c;为了保障数据安全&#xff0c;企业可能需要部署一系列繁琐且成本高昂的IT基础设施系统。随着各项数据安全保护措施的出台&#xff0c;企业需要遵守的法规数量越多&#xff0c;尤其是跨越多个地域的企业&#xff0c;其IT基础设施就会越复杂。如今…

《程序猿入职必会(9) · 用代码生成器快速开发》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

从文字到视频的魔法:CogVideoX让你的创意瞬间成真

CogVideoX 发布 如果有一个工具能够让你轻松跨越这些障碍&#xff0c;瞬间成为短视频高手&#xff0c;你会心动吗&#xff1f;今天&#xff0c;这个梦想终于成为现实。智谱AI最新推出的CogVideoX&#xff0c;正是为你量身打造的AI视频创作神器&#xff01; CogVideoX CogVideoX…

论文辅导 | 基于时空Transformer 网络的隧道交通运行风险 动态辨识方法

辅导文章 模型描述 为了及时发现、评估与应对高速公路隧道交通风险隐患&#xff0c;确保隧道运行安全通畅&#xff0c;构建了基于时空Transformer网络的隧道运行风险状态动态辨识方法。以隧道交通流全域检测数据与关键断面集计数据为输入&#xff0c;通过空间CNN卷积与时序LST…

蜂窝物联智慧农业新篇章:揭秘智慧大棚的科技魅力!

在这个科技日新月异的时代&#xff0c;农业这一古老而重要的行业正经历着前所未有的变革。智慧农业的兴起&#xff0c;尤其是智慧大棚的应用&#xff0c;正悄然改变着我们对传统农业的认知&#xff0c;引领着农业生产进入了一个高效、精准、可持续发展的新时代。今天&#xff0…

怎么查询大数据信用评分?

相信在了解大数据信用评分的时候&#xff0c;不少人都因为大数据信用评分在申贷的时候遭受到过挫折&#xff0c;因为大数据信用已经被很多银行和金融机构作为风险控制的重要依据使用&#xff0c;其中的大数据信用评分&#xff0c;能直观的感知到用户的信用情况。那如何查询大数…

【ESP-IDF】ESP32获取真随机数

ESP32内置一个真随机数发生器。我翻了好几个型号的ESP32的编程指南&#xff0c;都有相关的函数&#xff0c;应该是大部分型号都有&#xff0c;具体有没有还需要对照一下自己手上的ESP32型号。 我们可以从从随机数发生器的寄存器 RNG_DATA_REG 中读取随机数&#xff0c;每个读到…

到底哪款蓝牙耳机才是性价比之王?精选四款平价高品质耳机品牌!

在当前的音频设备市场中&#xff0c;蓝牙耳机已成为众多现代人挑选的热门配件。选蓝牙耳机不同人看重的点不一样&#xff0c;但倘若像我这样喜欢用来听音乐的&#xff0c;就千万别忽视耳机的音质。现在的产品越来越多&#xff0c;到底哪款蓝牙耳机才是性价比之王&#xff1f;一…

html+css 实现hover背景彩色按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

数据治理数据管理体系:数据标准、数据中台、数据安全、大数据平台与架构

数据驱动&#xff0c;资产为王&#xff0c;企业竞争的核心逐渐从传统的资源争夺转向了数据价值的挖掘与利用。数据&#xff0c;作为企业的新石油&#xff0c;正以前所未有的速度重塑着商业格局。为了在这场数据革命中占据先机&#xff0c;构建一套完善的数据治理体系显得尤为重…

用户上下文打通+本地缓存Guava

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.设计1.链路流程2.详细设计 2.网关过滤器获取唯一标识放到Hea…

LSTM长短时记忆网络【数学+图解】

文章目录 1、简介2、门控机制3、LSTM3.1、概念3.2、公式⭐3.3、特点 4、图解LSTM⭐4.1、RNN4.2、时间链条4.3、**记忆单元**&#x1f53a;4.4、LSTM 5、LSTM与GRU的对比6、应用7、训练技巧 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专…

欧拉系统网络配置

从母盘克隆出一个虚拟机openEuler-node2 如何设定网卡的名称为ehtx x为数字 在内核中禁止使用net.ifnames模块&#xff0c;这样可以让网卡显示为ethx [rootlocalhost ~]# gruuby --update-kernel ALL --args net.ifnames0修改完这个参数过后需要重启系统reboot&#xff0c;让…

4658. 质因数个数、197. 阶乘分解、模板题【线性筛求积性函数】(数论练习题)

目录 4658. 质因数个数 题目描述 运行代码 代码思路 197. 阶乘分解 题目描述 运行代码 代码思路 其他代码 代码思路 模板题【线性筛求积性函数】 题目描述 ​编辑 运行代码 代码思路 4658. 质因数个数 题目描述 4658. 质因数个数 - AcWing题库 运行代码 #in…

银河麒麟V10 审计工具 auditd 内存泄漏问题

问题描述 银河麒麟V10 SP1 审计工具 auditd 引发的内存占用过高&#xff0c; 内存占用171G&#xff0c; 内存一直不释放 解决方案 重启进程 auditd 是银河麒麟的审计工具&#xff0c; 分析是由于 yum 源的特性&#xff0c; 造成审计工具占用内存不释放&#xff0c; 重启 a…

dsc集群添加磁盘空间

在达梦数据库dsc集群保姆级部署文档_达梦数据库文档-CSDN博客这篇文档的基础上操作添加磁盘&#xff0c;进行一个扩容操作。 在生产环境中&#xff0c;数据存储集群&#xff08;DSC&#xff09;的磁盘空间不足是一个常见问题&#xff0c;这可能会导致服务中断或性能下降。为了…