我遵循了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)可以从单个文件中读取可能使用不同分辨率/尺寸扫描的打印和手写文本(由最终用户)
答案 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过程不完美,你需要弄清楚如何解释。