读取OCR

时间:2018-03-08 14:43:04

标签: opencv machine-learning ocr tesseract

我遵循了OCR包,它可以使用默认的测试图像。但是一旦我改变了图像,就会出错。

https://github.com/Breta01/handwriting-ocr/blob/master/OCR.ipynb

如果我禁用此行,则会执行代码但由于相应的原因而无法正确读取文本。

crop = page.detection(image)

详情如下:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-66-869a5b4b76fb> in <module>()
      1 # Crop image and get bounding boxes
----> 2 crop = page.detection(image)
      3 implt(image)
      4 bBoxes = words.detection(image)

~/SageMaker/handwriting-ocr/ocr/page.py in detection(image)
     17                                    np.ones((5, 11)))    
     18     # Countours
---> 19     pageContour = findPageContours(closedEdges, resize(image))
     20     # Recalculate to original scale
     21     pageContour = pageContour.dot(ratio(image))

~/SageMaker/handwriting-ocr/ocr/page.py in findPageContours(edges, img)
     94 
     95     # Sort corners and offset them
---> 96     pageContour = fourCornersSort(pageContour[:, 0])
     97     return contourOffset(pageContour, (-5, -5))
     98 

~/SageMaker/handwriting-ocr/ocr/page.py in fourCornersSort(pts)
     47 def fourCornersSort(pts):
     48     """ Sort corners: top-left, bot-left, bot-right, top-right"""
---> 49     diff = np.diff(pts, axis=1)
     50     summ = pts.sum(axis=1)
     51     return np.array([pts[np.argmin(summ)],

~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/numpy/lib/function_base.py in diff(a, n, axis)
   1922     slice1 = [slice(None)]*nd
   1923     slice2 = [slice(None)]*nd
-> 1924     slice1[axis] = slice(1, None)
   1925     slice2[axis] = slice(None, -1)
   1926     slice1 = tuple(slice1)

IndexError: list assignment index out of range

我希望这可以工作,因为我有要导入的手写文档,而且大多数(非ML)软件都无法正确读取它们。

更新

假设公司有100名员工提交手写文件。这是否意味着我需要收集所有100个人的样本笔迹来训练模型?

更新1:

也许我没有正确解释我的问题。我有一张图片:

https://s3.amazonaws.com/todel162/harshad_college_card.jpg

tessaract OCR无法正确读取。如文本文件所示 - 名称,标准和出生日期缺失(这是最重要的)

https://s3.amazonaws.com/todel162/college_card_reading.txt

是否有任何包装(有或没有ML)可以从单个文件中读取可能使用不同分辨率/尺寸扫描的打印和手写文本(由最终用户)

3 个答案:

答案 0 :(得分:2)

我希望这是因为手写文本下面有一行,它可能是错误的来源。因为它可能看起来像验证码......并且tesseract将结束以检测字母而不是数字。

在我看来,有两种可能性

  • 尝试预处理图像(使用滤镜)以删除图片中的所有原始文档下划线。

  • 裁剪图像以仅获取生日块,然后指定您仅查找带有tessedit_char_whitelist=0123456789参数的数字。 哪个给你一个这样的命令: tesseract birthday_only.png stdout -c tessedit_char_whitelist=0123456789

答案 1 :(得分:2)

由于您正在开发的应用程序在ID卡等高度结构化文档上运行OCR,因此您可以分两步读取必填字段。

1)裁剪出对您来说很重要的图像的不同区域。例如,DOB,名称等(对于给定类型的文档,区域是硬编码的)

2)使用裁剪后的图像检测手写文字。

答案 2 :(得分:2)

这是一个难题。因此,相应地设定您对精确度的期望。

尽管如此,虽然这个过程有很多挑战,但并非不可能。这是一个可能的解决方案管道:

挑战1)找出DOB,名称等字段在图像中的位置。

- 由于图像是由用户拍摄的,因此它可能具有不同的分辨率,各种角度以及各种照明。但是,这种关系或多或少地被affine transformation和适当的color space捕获。我们想要的是找出一个仿射变换,将用户图像映射到我们拥有的某个标准身份证图像上...然后我们可以使用x,y框来查找相关字段的位置。

----处理:将图像映射到照明稳健的色彩空间。找到仿射变换,当应用于用户拍摄的图像时,minimizes变换的用户图像和标准图像之间的distance。将该仿射变换应用于用户图像。现在采用标准格式。

挑战2)申请OCR,但不要接受OCR的话

- 机器可读的人手写不是解决的问题。即您的软件会出现问题,您可能需要对其进行说明。也就是说,如果你的软件给你足够好的结果,那么很酷,但我怀疑你想做一些检查结果的工作。

----流程:创建一个人工标签验证集,以便您可以确定整个管道的准确性,精确度和召回率。您想知道您的流程有多好。此外,您应该对结果进行一系列健全性检查。例如,DOB必须采用日期的形式 如果机器可读的版本不是日期形式,则它是错误的,应该添加到队列中以供人工审查。名称应该与名称字典等匹配。点,是OCR过程不完美,你需要弄清楚如何解释。