读取 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 的图像的主要内容,如果未能解决你的问题,请参考以下文章