读取 OCR 的图像

Posted

技术标签:

【中文标题】读取 OCR 的图像【英文标题】:Reading image for OCR 【发布时间】:2018-08-16 23:11:09 【问题描述】:

我遵循了 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)可以从单个文档中读取打印和手写的文本,这些文档可能会以不同的分辨率/尺寸(由最终用户)扫描

【问题讨论】:

您的问题是专门读取这种格式的身份证图像吗?还是需要阅读任意文件? 是的。身份证图像是第一要务。如果我能做到这一点,我将管理其他格式,如“标记表”。文档格式正确,本质上不是任意的。我尝试了 google vision API,但正在寻找免费和开源的选项。 【参考方案1】:

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

在我看来,有两种可能性

尝试预处理图像(使用滤色器)以去除图片中的所有原生文档下划线。

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

这是一个难题。因此,请相应地设置您对工作量与准确率的期望值。

也就是说,尽管该过程存在许多挑战,但并非不可能。这是一种可能的解决方案管道:

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

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

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

挑战 2) 应用 OCR,但不要相信 OCR 的话

--机器可读的人类笔迹不是一个已解决的问题。即您的软件会出现问题,您可能需要考虑这些问题。也就是说,如果您的软件能够为您提供足够好的结果,那就太棒了,但我怀疑您需要做一些工作来检查结果。

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

【讨论】:

如果你这样做是为了读100张身份证,我的官方意见是这不值得,你应该把它们放在机械土耳其人身上。

以上是关于读取 OCR 的图像的主要内容,如果未能解决你的问题,请参考以下文章

PyTesseract OCR 无法从简单图像中读取数字

可以从 iOS 中的图像中读取文本的 OCR 框架?

如何设置图像大小以改善 OCR 输出。?

对图像执行 OCR 时,Tesseract 返回乱码

对低质量数字图像进行 OCR 的预处理方法?

改进 OCR/图像识别的预处理