在此博客文章中,我们将尝试解释最常用的Tesseract Engine背后的技术,该技术已通过对光学字符识别研究的最新知识进行了升级。 本文还将作为有关如何使用Tesseract引擎在python中实现OCR的方法指南/教程。 我们将逐步介绍以下模块:
- Tesseract OCR功能
- 使用OpenCV对OCR进行预处理
- 使用CLI和Python运行Tesseract
- Tesseract发动机的局限性
目录
介绍
字符识别 = 光学字符识别. 换句话说,OCR 系统将文本的二维图像(可能包含机器打印或手写的文本)从其图像表示转换为机器可读的文本。 OCR 作为一个过程通常由几个子过程组成,以尽可能准确地执行。 子流程是:
- 图像预处理
- 文字本地化
- 字符分割
- 字符识别
- 后期处理
上面列表中的子过程当然可以有所不同,但是这些大致是实现自动字符识别所需的步骤。 在OCR软件中,其主要目的是使用来自书面文字字符的不同语言来识别和捕获所有唯一单词。
近二十年来,光学字符识别系统已被广泛用于向计算机化系统提供自动文本输入。 然而一直以来,传统的 OCR 系统(如 区域 OCR) 从来没有克服过他们无法阅读的文字字体和页面格式。 等距字体(包括几乎所有的排版副本)、激光打印机字体,甚至许多非比例打字机字体,仍然超出了这些系统的范围。 因此,传统的 OCR 对需要转换为数字形式的文档总数的影响从未超过边际影响。
下一代OCR引擎通过利用深度学习领域的最新研究确实很好地解决了上述问题。 通过利用深层模型和可公开获得的庞大数据集的组合,模型可以在给定任务上实现最新的准确性。 如今,也有可能 生成综合数据 使用生成对抗网络和其他几种生成方法使用不同的字体。
光学字符识别仍然是 挑战性的问题 当文字出现在不受限制的环境中时,例如 自然场景,由于几何变形,复杂的背景和多种字体。 由于基于深度学习的OCR的各种用例,例如,该技术仍然具有巨大的潜力
有 OCR 问题吗? 想要降低组织的数据输入成本? 前往 纳米网 并构建 OCR 模型以 从图像中提取文本 or 从PDF提取数据 以人工智能为基础 PDF文字识别!
开源 OCR 工具
有很多的 光学字符识别 可用软件。 我没有找到它们之间的质量比较,但是我将写一些关于它们对开发人员最友好的描述。
正方体 –一种开放源代码的OCR引擎,在OCR开发人员中广受欢迎。 尽管有时实施和修改可能会很痛苦,但最长的时间是市场上没有太多免费且功能强大的OCR替代产品。 Tesseract最初是一名博士学位。 布里斯托尔惠普实验室的研究项目。 它广受欢迎,由HP在1984年至1994年之间开发。2005年,HP发布了Tesseract作为开源软件。 自2006年以来,它是由Google开发的。
章鱼 – OCRopus是一个开放源代码的OCR系统,研究人员和公司均可轻松评估和重用OCR组件。 文件分析程序的集合,而不是交钥匙的OCR系统。 要将其应用于文档,可能需要进行一些图像预处理,还可能需要训练新模型。 除了识别脚本本身之外,还有一些脚本可用于地面事实编辑和校正,测量错误率,确定易于使用和编辑的混淆矩阵。
目镜 – Ocular在使用手动印刷机打印的文档(包括以多种语言编写的文档)上效果最佳。 它使用命令行进行操作。 这是最先进的历史OCR系统。 它的主要功能是:
- 无监督学习未知字体:仅需要文档图像和文本语料库。
- 处理嘈杂文件的能力:不一致的着墨,间距,垂直对齐
- 支持多语言文档,包括具有大量单词级代码转换的文档。
- 拼写变化模式的无监督学习,包括过时的拼写和打印机速记。
- 同时联合翻译成外交(文学)形式和规范化形式。
快速OCR –我还将提到用Swift编写的OCR引擎,因为在推动Swift作为深度学习的开发编程语言的使用方面取得了巨大的发展。 退房 新闻 找出更多原因。 SwiftOCR是使用神经网络进行图像识别的快速简单的OCR库。 SwiftOCR声称其引擎性能优于著名的Tessaract库。
在此博客文章中,我们将把 专注于Tesseract OCR 并了解有关其工作方式和使用方式的更多信息。
Tesseract OCR
Tesseract 是一个开源文本识别 (OCR) 引擎,可在 Apache 2.0 许可下使用。 它可以直接使用,或者(对于程序员)使用 API 从图像中提取打印文本。 它支持多种语言。 Tesseract 没有内置的 GUI,但有几个可以从 第三方页面。 Tesseract通过可以找到的包装器与许多编程语言和框架兼容 此处。 它可以与现有的布局分析一起使用以识别大型文档中的文本,也可以与外部文本检测器结合使用以从单个文本行的图像中识别文本。
Tesseract 4.00包括配置为文本行识别器的新神经网络子系统。 它起源于 OCRopus 的基于 Python 的 LSTM 实现,但已针对C ++中的Tesseract重新设计。 Tesseract中的神经网络系统早于TensorFlow,但与它兼容,因为存在一种称为变量图规范语言(VGSL)的网络描述语言,该语言也可用于TensorFlow。
为了识别包含单个字符的图像,我们通常使用卷积神经网络(CNN)。 任意长度的文本是一个字符序列,使用RNN解决了这些问题,而LSTM是RNN的一种流行形式。 阅读这篇文章以了解更多信息 LSTM.
技术–工作原理
LSTM非常擅长学习序列,但是当状态数太大时,LSTM的速度会大大降低。 有经验结果表明,让LSTM学习长序列比许多类的短序列更好。 Tesseract是从Python的OCRopus模型开发的,该模型是C ++中的LSMT(称为CLSTM)的分支。 CLSTM是使用Eigen库进行数值计算的C ++中LSTM递归神经网络模型的实现。
旧版Tesseract 3.x依赖于我们可以区分步骤的多阶段过程:
- 找词
- 寻线
- 人物分类
通过将文本行组织为斑点来完成单词查找,然后分析行和区域以获取固定间距或成比例的文本。 文本行根据字符间距的不同而分为单词。 然后,识别将作为两次通过过程进行。 在第一遍中,尝试依次识别每个单词。 每个令人满意的单词都将作为训练数据传递给自适应分类器。 然后,自适应分类器将有机会更准确地识别页面下方的文本。
Tesseract工具的现代化是在代码清理和添加新的LSTM模型方面的努力。 输入图像在方框(矩形)中逐行处理,输入LSTM模型并给出输出。 在下面的图像中,我们可以直观地看到其工作原理。
在添加了新的训练工具并使用大量数据和字体训练了模型之后,Tesseract获得了更好的性能。 但是,还不足以处理手写文本和奇怪的字体。 可以微调或重新训练顶层以进行实验。
安装Tesseract
有了预编译的二进制文件,在Windows上安装tesseract很容易 此处。 不要忘记编辑“ path”环境变量并添加tesseract路径。 对于Linux或Mac安装,它与 几个命令.
安装后,通过在终端或cmd中键入命令来验证一切正常:
$ tesseract --version
您将看到类似于以下内容的输出:
tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE
之后,您可以使用pip为tesseract安装python包装器。
$ pip install pytesseract
Tesseract库附带了一个方便的命令行工具,称为tesseract。 我们可以使用此工具对图像执行OCR,并将输出存储在文本文件中。 如果我们想将Tesseract集成到C ++或Python代码中,我们将使用Tesseract的API。
使用CLI运行Tesseract
使用以下命令在图像上调用Tesseract引擎 图像路径 并通过键入以下命令在命令提示符下逐行将图像转换为文本:
$ tesseract image_path stdout
要将输出文本写入文件:
$ tesseract image_path text_result.txt
要指定语言模型名称,请在之后写语言快捷方式 -l 标志,默认情况下采用英语:
$ tesseract image_path text_result.txt -l eng
默认情况下,Tesseract 在分割图像时需要一页文本。 如果您只是想对一个小区域进行 OCR,请尝试使用不同的分割模式,使用 -psm 论据。 共有14种可用模式 此处。 默认情况下,Tesseract完全自动执行页面分割,但不执行方向和脚本检测。 要指定参数,请键入以下内容:
$ tesseract image_path text_result.txt -l eng --psm 6
还有一个更重要的参数是OCR引擎模式(oem)。 Tesseract 4具有两个OCR引擎-旧版Tesseract引擎和LSTM引擎。 使用-oem选项可以选择四种操作模式。
0仅旧版引擎。
1仅神经网络LSTM引擎。
2个旧版+ LSTM引擎。
3默认,根据可用情况。
具有Pytesseract和OpenCV的OCR
Pytesseract是Tesseract-OCR引擎的包装。 它也可以用作tesseract的独立调用脚本,因为它可以读取Pillow和Leptonica图像库支持的所有图像类型,包括jpeg,png,gif,bmp,tiff等。 有关Python方法的更多信息,请阅读 此处。 可以在此找到本教程的代码 知识库.
import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Tesseract的预处理
为避免tesseract输出精度下降的所有方式,您需要确保图像适当 预处理的.
这包括重新缩放,二值化,噪声消除,去偏斜等。
要为OCR预处理图像,请使用以下任何python函数或遵循 OpenCV文档.
import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
让我们用一个例子来更好地看待事情。 这就是我们的原始图像的样子——
经过以下代码的预处理
image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)
并绘制结果图像,我们得到以下结果。
原始图像的输出如下所示–
GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED
以下是不同预处理图像的输出结果 -
坎尼边缘图像(不太好)-
CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im
阈值图像–
GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH
开场图片–
GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH
获取文本框
使用Pytesseract,您可以使用以下方法获取OCR结果的边界框信息 码.
以下脚本将为您提供OCR期间tesseract检测到的每个字符的边界框信息。
import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
如果要在单词周围而不是字符周围插入框,则该函数 image_to_data
将派上用场。 您可以使用 image_to_data
pytesseract指定输出类型的函数 Output
.
有OCR问题吗? 要数字化发票,PDF或车牌号吗? 前往 纳米网 并免费构建OCR模型!
我们将使用上面的示例发票图像来测试我们的tesseract输出。
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())
这应该给您以下输出–
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])
使用该词典,我们可以获得检测到的每个单词,它们的边界框信息,其中的文本以及每个单词的置信度得分。
您可以使用以下代码来绘制方框–
n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
这是示例发票图像的外观。
文字模板匹配
以尝试查找日期在图像中的位置为例。 在这里,我们的模板将是一个正则表达式模式,我们将其与OCR结果匹配以找到适当的边界框。 我们将使用 regex
模块和 image_to_data
功能。
import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
与预期的一样,我们在图像中的发票日期附近出现了一个框。
页面分割模式
一页文本的分析方法有几种。 如果您只想在较小的区域或不同的方向等上运行OCR,则tesseract api提供了几种页面分割模式。
以下是 tesseract 支持的页面分割模式列表 –
0仅方向和脚本检测(OSD)。
1使用OSD自动进行页面分割。
2自动页面分割,但没有OSD或OCR。
3全自动页面分割,但没有OSD。 (默认)
4假设一列可变大小的文本。
5假定单个统一的垂直对齐文本块。
6假设一个统一的文本块。
7将图像视为单个文本行。
8将图像视为一个单词。
9将图像视为一个圆圈中的单个单词。
10将图像视为一个字符。
11稀疏文本。 以特定顺序查找尽可能多的文本。
12带有OSD的稀疏文本。
13原始行。 将图像视为单个文本行,绕过特定于Tesseract的黑客。
要更改页面细分模式,请更改 --psm
您的自定义配置字符串中的自变量为上述任何模式代码。
检测方向和脚本
您可以检测图像中文本的方向以及书写文本的脚本。 下图–
在运行以下代码后–
osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)
将打印以下输出。
angle: 90
script: Latin
仅检测数字
以这张图片为例–
从此图像中提取的文本如下所示。
‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234
通过将配置更改为以下内容,您只能识别数字
custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))
输出将如下所示。
-- . 43876324
172018
0 76496234
将字符列入白名单
假设您只想从给定图像中检测某些字符,而忽略其余字符。 您可以使用以下配置指定字符白名单(此处,我们仅使用了从a到z的所有小写字符)。
custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))
输出–
customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo
将角色列入黑名单
如果您确定某些字符或表达式绝对不会出现在文本中(否则OCR将返回错误的文本来代替列入黑名单的字符),则可以使用以下配置将这些字符列入黑名单。
custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
输出–
Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono
多种语言检测
您可以通过在终端中键入此命令来检查可用的语言
$ tesseract --list-langs
下载特定语言的tesseract
$ sudo apt-get install tesseract-ocr-LANG
LANG是您所需语言的三个字母代码。 您可以找出LANG值 此处.
您也可以下载 .traindata
您需要的语言文件 此处 放进去 $TESSDATA_PREFIX
目录(该目录应与 tessdata
目录已安装),并且应该可以使用了。
备注 –仅具有 .traineddata
文件格式受tesseract支持。
要指定您需要OCR输出使用的语言,请使用 -l LANG
配置中的参数,其中LANG是您要使用的语言的3个字母代码。
custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
以这张图片为例–
您可以这样更改LANG参数来使用多种语言–
custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
您将获得以下输出–
Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส
备注 –首先指定的语言 -l
参数是主要语言。
不幸的是,tesseract没有自动检测图像中文本语言的功能。 另一个称为python模块的解决方案 langdetect
可以通过pip安装。
$ pip install langdetect
再次,此模块不使用图像检测文本的语言,但需要输入字符串以从中检测语言。 最好的方法是首先使用tesseract以您可能会觉得的任何语言获取OCR文本, langdetect
查找OCR文本中包含的语言,然后使用找到的语言再次运行OCR。
假设我们有一个我们认为是英语和葡萄牙语的文本。
custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)
这应该在文本中输出语言列表及其概率。
[en:0.714282468983554, es:0.2857145605644145]
所使用的语言代码 langdetect
遵循ISO 639-1规范。 进行比较,请检查 Free Introduction 和 Free Introduction。 我们发现文本中使用的语言是英语和西班牙语。
通过将配置更改为
custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)
备注 – 当在具有多种语言的图像中,配置中指定的语言错误或根本没有提及时,Tesseract 的性能很差。 这也会误导 langdetect 模块。
使用tessdata_fast
如果您最关心速度,则可以将tessdata语言模型替换为tessdata_fast模型,该模型是tessdata模型的8位整数版本。
根据tessdata_fast github上 –
该存储库包含针对 Tesseract开源OCR引擎.
这些模型仅适用于Tesseract 4的LSTM OCR引擎。
- 这些是速度/准确性的折衷方案,以在速度与准确性方面提供最佳“物有所值”。
- 对于某些语言,这仍然是最佳选择,但对于大多数语言而言则不是。
- 然后将“最物有所值”的网络配置进行集成以提高速度。
- 大多数用户将希望使用这些训练有素的数据文件进行OCR,并且这些文件将作为Linux发行版的一部分提供。 Ubuntu 18.04。
- 微调/增量训练将 不是 从这些可能
fast
模型,因为它们是8位整数。 - 在此存储库中使用模型时,仅支持新的基于LSTM的OCR引擎。 遗产
tesseract
这些文件不支持引擎,因此 Tesseract 的 oem 模式“0”和“2”不适用于它们。
使用 tessdata_fast
型号代替 tessdata
,您所需要做的就是下载您的 tessdata_fast
来自的语言数据文件 此处 并将其放入您的 $TESSDATA_PREFIX
目录。
需要数字化文件,收据或发票,但懒得编码吗? 前往 纳米网 并免费构建OCR模型!
对Tesseract进行自定义数据培训
Tesseract 4.00包括一个新的基于神经网络的识别引擎,该引擎可显着提高文档图像的准确性。 神经网络需要比基础Tesseract多得多的训练数据,并且训练速度要慢得多。 对于基于拉丁语的语言,已提供的现有模型数据已在约400000文本行(涵盖约4500种字体)上进行了训练。
为了成功运行Tesseract 4.0 LSTM培训教程,您需要有效安装Tesseract 4和Tesseract 4培训工具,并在某些目录中具有培训脚本和所需的受训数据文件。 访问 github仓库 用于文件和工具。
从头开始,Tesseract 4.00需要几天到几周的时间进行培训。 即使有了所有这些新的训练数据,因此这里还是一些训练选项:
- 微调 –从现有的受训语言开始,对您的特定其他数据进行培训。 例如,有关手写数据集和一些其他字体的培训。
- 切掉顶层 – 来自网络并使用新数据重新训练新的顶层。 如果微调不起作用,这很可能是下一个最佳选择。 类比为什么有用,以在 ImageNet 数据集上训练的实例模型为例。 目标是建立一个猫或狗分类器,模型中的较低层擅长低级抽象为角、水平线和垂直线,但模型中的较高层正在结合这些特征并检测猫或狗的耳朵、眼睛、鼻子等等。 通过仅重新训练顶层,您可以使用较低层的知识并与新的不同数据集相结合。
- 从头开始训练 –这是一种非常缓慢的方法,除非您有非常有代表性的培训并且对问题有足够的培训。 从头开始培训的最佳资源是遵循此原则 github仓库.
有关如何训练您的自定义数据和创建指南 .traineddata
可以找到文件 此处, 此处 和 此处.
在此博客文章中,我们不会介绍使用Tesseract进行培训的代码。
Tesseract的局限性
当前景文本与背景有清晰的分割时,Tesseract效果最佳。 在实践中,要保证这些类型的设置可能非常具有挑战性。 有多种原因可能会导致您无法从Tesseract获得高质量的输出,例如图像背景上有噪点。 图像质量(尺寸,对比度,闪电)越好,识别结果越好。 需要进行一些预处理才能改善OCR结果,图像需要适当缩放,具有尽可能高的图像对比度,并且文本必须水平对齐。 Tesseract OCR非常强大,但确实存在以下限制。
Tesseract限制汇总在列表中。
- OCR不如我们可以使用的某些商业解决方案准确。
- 不适用于受伪影影响的图像,包括部分遮挡、扭曲的透视和复杂的背景。
- 它无法识别手写。
- 它可能会发现乱码并将其报告为OCR输出。
- 如果文档包含的语言超出了-l LANG参数给出的语言,则结果可能会很差。
- 它并不总是擅长分析文档的自然阅读顺序。 例如,它可能无法识别文档包含两列,并可能尝试跨列连接文本。
- 质量差的扫描可能会产生质量差的OCR。
- 它不公开有关字体家族文本所属的信息。
当然,还有一种更好、更简单、更直观的方式来执行 OCR 任务。
带有纳米网的OCR
纳米网 OCR API 使您可以轻松构建OCR模型。 您不必担心图像预处理,也不必担心模板匹配或构建基于规则的引擎来提高OCR模型的准确性。
您可以上传数据,对其进行注释,设置模型以进行训练并等待通过基于浏览器的UI进行预测,而无需编写任何代码,也不必担心GPU或为深度学习模型找到合适的架构。 您还可以获取每个预测的JSON响应,以将其与您自己的系统集成,并基于最新的算法和强大的基础架构构建机器学习支持的应用程序。
使用GUI: https://app.nanonets.com/
您还可以按照以下步骤使用Nanonets-OCR API:
步骤1:克隆存储库,安装依赖项
git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm
第2步:获取免费的API密钥
从以下位置获取免费的API密钥 http://app.nanonets.com/#/keys
步骤3:将API密钥设置为环境变量
export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE
步骤4:建立新模型
python ./code/create-model.py
请注意: 这将生成下一步所需的MODEL_ID
步骤5:将模型ID添加为环境变量
export NANONETS_MODEL_ID=YOUR_MODEL_ID
请注意: 您将从上一步中获得YOUR_MODEL_ID
第6步:上传培训数据
培训数据位于 images
(图像文件)和 annotations
(图像文件的注释)
python ./code/upload-training.py
步骤7:训练模型
图片上传后,开始训练模型
python ./code/train-model.py
步骤8:获取模型状态
该模型需要约2个小时的训练时间。 一旦训练好模型,您将收到一封电子邮件。 同时,您检查模型的状态
python ./code/model-state.py
步骤9:进行预测
一旦模型被训练。 您可以使用模型进行预测
python ./code/prediction.py ./images/151.jpg
纳米网与人类交织
“中等”屏幕有助于更正和输入过程,并将人工审核人员的工作量减少近 90%,并为组织降低 50% 的成本。
功能包括
- 跟踪正确的预测
- 追踪哪些是错的
- 修正不正确的
- 删除错误的
- 填写缺失的预测
- 过滤日期范围内的图像
- 获取已审核图像与未审核图像的计数
所有字段都被构造为易于使用的GUI,使用户可以利用OCR技术并在不断完善过程中进行改进,而无需键入任何代码或了解该技术的工作原理。
有 OCR 问题吗? 想要降低组织的数据输入成本? 前往 纳米网 并构建 OCR 模型以 从图像中提取文本 or 从PDF提取数据!
结论
正如深度学习几乎影响了计算机视觉的方方面面一样,字符识别和手写识别也是如此。 基于深度学习的模型已经设法获得了前所未有的文本识别精度,远远超出了传统的 信息提取 和 机器学习图像处理 方法。
当文档图像遵循以下准则时,Tesseract的性能很好:
- 从背景中干净分割前景文本
- 水平对齐并适当缩放
- 高质量图像,无模糊和噪点
Tesseract 4.0的最新版本支持基于深度学习的OCR,该精度明显更高。 OCR引擎本身是建立在长期短期记忆(LSTM)网络上的,该网络是一种递归神经网络(RNN)。
Tesseract非常适合扫描干净的文档,并且经过全面的培训,具有很高的准确性和字体可变性。 我想说的是,如果您的任务是在干净的白色背景上扫描书籍,文档和印刷的文本,则Tesseract是首选工具。
延伸阅读
- LSTM Tesseract 4.0 的最佳训练模型
- OCR 4.2017 的 Dropbox 方法
- Tesseract OCR 引擎遗留概述
- Tesseract 开发者论坛
- 正方体用户论坛
- 使用早期印刷书籍的 OCR 准确性比较
开源引擎 Calamari 和 OCRopus - 使用深度学习的高效、无词典的 OCR
- OCR 引擎在信息提取系统中的适用性——比较评估
- DeepText 基准测试
- OCR项目列表
- 正方体 Github 最新版本
- CVPR 2019 – 文本检测的字符区域感知 (CRAFT)
- 使用 OpenCV 和 Python 进行信用卡 OCR
- 图像预处理
- OpenCV中的图像预处理
- 在 Raspberry Pi 上使用 Tesseract 进行 OCR
- 非英语语言的 Tesseract OCR
- 如何使用 Tesseract 从 Linux 命令行执行 OCR
- Tesseract OCR引擎概述
更新:
很多人问我们如何以文本形式获取日期,或者在检测日期或任何其他特定数据时使用,以便他们可以附加到列表中。
答案如下:
在围绕日期框绘制边界框的代码中,您会注意到一条与正则表达式模式匹配的行d['text']
. 如果模式匹配,它只会绘制一个框。 您可以简单地从中提取值d['text']
一旦模式匹配并将它们附加到列表中。
更新2:
为了解决有关非英语 OCR 的问题,我们更新了进一步阅读列表。
- 100
- 2019
- 7
- 9
- 关于
- 根据
- 精准的
- 实现
- 获得
- 横过
- 额外
- 地址
- 优点
- AI
- 艾滋病
- 算法
- 所有类型
- 允许
- 其中
- 分析
- 另一个
- API
- 的途径
- 应用
- 国家 / 地区
- 参数
- 围绕
- 艺术
- 刊文
- 自动化
- 可使用
- 意识
- 作为
- 最佳
- 位
- 博客
- 书籍
- 边界
- 盒子
- 浏览器
- 建立
- 内建的
- 可以得到
- CD
- 更改
- 圆
- 索赔
- 清洁
- 美国有线电视新闻网
- 码
- 采集
- 柱
- 组合
- 商业的
- 公司
- 复杂
- 信心
- 配置
- 混乱
- 包含
- 转化
- 矫正
- 成本
- 可以
- 情侣
- data
- 处理
- 检测
- 检测
- 确定
- 发达
- 开发
- 研发支持
- DID
- 不同
- 不同
- 数字
- 数字化
- 数字
- 文件
- 向下
- 下降
- Dropbox
- 早
- 边缘
- 邮箱地址
- 端点
- 能源
- 英语
- 环境
- 一切
- 例子
- 预期
- 预计
- 家庭
- 高效率
- 专栏
- 特征
- 字段
- 姓氏:
- 流
- 遵循
- 以下
- 叉
- 申请
- 格式
- 形式
- 发现
- Free
- 功能
- 越来越
- 混帐
- GitHub上
- 给予
- 目标
- 非常好
- 谷歌
- 灰色
- 灰度
- 大
- 指南
- 方针
- 黑客
- 有
- 头
- 此处
- 高
- 持有
- 创新中心
- How To
- HTTPS
- 巨大
- 人类
- 鉴定
- 图片
- 影响力故事
- 实施
- 重要
- 改善
- 其他
- 包括
- 包含
- 增加
- info
- 信息
- 基础设施
- 整合
- 直观的
- IT
- 加入
- 键
- 键
- 知识
- 已知
- 实验室
- 语言
- 语言
- 大
- 最新
- 学习用品
- 学习
- 自学资料库
- 执照
- 闪电
- Line
- Linux的
- 清单
- 书单
- 长
- MAC
- 机
- 机器学习
- 主要
- 制作
- 手册
- 市场
- 匹配
- 内存
- 介意
- 模型
- 模型
- 最先进的
- 网络
- 基于网络的
- 网络
- 噪声
- 打开
- 开放源码
- 开放
- 附加选项
- 附加选项
- 秩序
- 组织
- 其他名称
- 除此以外
- 模式
- 员工
- 性能
- 透视
- 贫困
- 热门
- 可能
- 强大
- 预测
- 预测
- express
- 漂亮
- 小学
- 市场问题
- 过程
- 过程
- 生产
- 程序员
- 代码编程
- 编程语言
- 训练课程
- 项目
- 提供
- 提供
- 质量
- 价格表
- 原
- RE
- 阅读
- 原因
- 减少
- 定期
- 保持
- 报告
- 知识库
- 要求
- 必须
- 研究
- 资源
- REST的
- 成果
- 运行
- 运行
- 扫描
- 屏风
- 分割
- 特色服务
- 集
- 短
- 类似
- 简易
- 尺寸
- 小
- So
- 软件
- 解决方案
- 西班牙语
- 规范
- 速度
- 州/领地
- 州
- 强烈
- 顺利
- 支持
- 支持
- SWIFT的
- 系统
- 产品
- 任务
- 专业技术
- 终端
- test
- 通过
- 次
- 工具
- 最佳
- 传统
- 产品培训
- 改造
- 治疗
- 趋势
- Ubuntu
- ui
- 理解
- 独特
- us
- 使用
- 用例
- 用户
- 折扣值
- 愿景
- W
- 等待
- 步行
- 什么是
- 什么是
- 白名单
- 维基百科上的数据
- 窗户
- 中
- 也完全不需要
- 话
- 工作
- 加工
- 合作
- 写作
- X