读取图像以进行OCR

3
我按照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

我希望这能够奏效,因为我有手写文件需要导入,而大多数非机器学习软件无法正确读取它们。
更新:
假设公司有100名员工将提交手写文件。这是否意味着我需要收集所有100个人的样本手写来训练模型?
更新1:
也许我没有正确解释我的问题。我有一张图片: https://s3.amazonaws.com/todel162/harshad_college_card.jpg Tessaract OCR 无法正确读取它。如在此文本文件中所示 - 缺少姓名、标准和出生日期(这是最重要的) https://s3.amazonaws.com/todel162/college_card_reading.txt 是否有任何软件包(带或不带机器学习),可以从单个文档中读取印刷和手写文本,该文档可能会被最终用户以不同的分辨率/大小扫描?

1
你的问题是特别针对于读取这种格式的身份证图片吗?还是需要读取任意文档? - Him
是的,身份证图像是第一优先级。如果我能做到这一点,我将管理其他格式,如“成绩单”。这些文件格式规范且不随意。我尝试了Google Vision API,但正在寻找免费和开源选项。 - shantanuo
3个回答

2

我认为问题源于手写文本下方有一条线,这可能会被识别为验证码,导致tesseract无法正确检测数字。

在我看来,有两种解决方法:

  • 尝试预处理图片(使用颜色过滤器),移除图片中所有的原始文档下划线。

  • 裁剪图片,只保留生日区块,并且用 tessedit_char_whitelist=0123456789 参数指定只查找数字。这将得到以下命令:

    tesseract birthday_only.png stdout -c tessedit_char_whitelist=0123456789

2

由于您正在开发的应用程序在高度结构化文档(如身份证)上运行OCR,因此可以通过以下两个步骤读取所需字段:

1)裁剪出对您重要的不同图像区域。例如,出生日期、姓名等。(针对给定类型的文档硬编码了这些区域)

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


2

这是一个棘手的问题。因此,请根据努力与准确性的比例来设置您的期望。

话虽如此,虽然这个过程有许多挑战,但并非不可能。以下是一种可能的解决方案流程:

挑战1)找出图像中DOB、姓名等字段的位置。

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

----处理过程:将图像映射到一个稳健的颜色空间中。找到一个仿射变换,当应用于用户拍摄的图像时,最小化转换后的用户图像与标准图像之间的距离。将该仿射变换应用于用户图像。现在它是标准格式。

挑战2)应用OCR,但不要完全相信OCR的结果。

--机器可读的人类手写并不是一个解决的问题。也就是说,您的软件会出现问题,您可能需要考虑这些问题。话虽如此,如果您的软件给出了足够好的结果,那么很棒,但我怀疑您会想做一些工作来检查结果。

----处理过程:创建一个人工标记的验证集,以便确定整个流程的准确性、精度和召回率。您需要知道您的流程表现如何。此外,您应该对结果进行一系列的合理性检查。例如,DOB必须采用日期形式。
如果机器可读版本不是日期形式,则是错误的,并且应该添加到等待人工审核的队列中。名称应与名称字典匹配,等等。重点是OCR过程不会是完美的,您需要找出如何解决这个问题。


如果你是为了读取100张身份证而这样做,我的官方意见是这不值得花费这么大的力气,你应该把它们放到 Mechanical Turk 上去处理。 - Him

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接