我正在处理一个问题,我想自动读取图像上的数字,如下所示:


可以看到,图像是相当具有挑战性的!不仅在所有情况下这些线路都没有连接,而且对比也有很大的不同。我的第一次尝试是在预处理之后使用pytesseract。我还创建了一个StackOverflow post 这里。
虽然这种方法可以很好地处理单个图像,但并不是通用的,因为预处理需要太多的手动信息。到目前为止,我得到的最好的解决方案是迭代一些超参数,例如阈值、侵蚀/膨胀的过滤器大小等。然而,这在计算上是很昂贵的!
因此,我开始相信,我正在寻找的解决方案必须以深入学习为基础。我在这里有两个想法:
关于第一种方法,我还没有找到好的东西。有人对此有想法吗?
关于第二种方法,我首先需要一种方法来自动生成单独数字的图像。我想这也应该是基于深度学习的。之后,我可以通过一些数据增强来取得一些好的结果。
有人有想法吗?)
发布于 2021-02-26 02:12:33
关于你的第一种方法,
有两个综合准备的数据集:
我已经使用上述数据集来识别板坯图像上的文本。图像是相当具有挑战性的,但现在我达到了90%以上的准确性。我已经实现了以下模型来解决这一任务。它们是:
如果你在工作

各种图片,我强烈鼓励您尝试深层文本识别。它是四个阶段的框架。

它们在TPS-ResNet-BiLSTM-Attn版本上获得了最好的精度。你可以轻松微调这个网络,我希望它能解决你的任务。该模型使用上述数据集进行培训。
发布于 2021-02-22 22:33:04
你的任务很有挑战性。我有几个想法,也许会在路上帮你。首先,如果您得到了正确的图像,您可以使用EasyOCR。它使用了一种复杂的算法来检测图像中的字母,称为工艺,然后使用CRNN识别它们。它提供了非常细粒度的控制符号检测和识别部分。例如,在对图像进行手动处理(灰度缩放、对比度增强和锐化)之后,我得到了


并使用以下代码
import easyocr
reader = easyocr.Reader(['en']) # need to run only once to load model into memory
reader.readtext(path_to_file, allowlist='0123456789')结果为31197432和31197396。
现在,对于对比度恢复部分,opencv有一个名为CLAHE的工具。如果运行以下代码
img = cv2.imread(fileName)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (25, 25), 0)
grayscaleImage = gray * ((gray / blurred) > 0.01)
clahe = cv2.createCLAHE(clipLimit=6.0, tileGridSize=(16,6))
contrasted = clahe.apply(grayscaleImage)在原始图像上,您将得到


它们在视觉上和上面的非常相似。我相信,经过一些清洁,你可以让它是可识别的,而不是太多的摆弄超参数。
最后,如果您想培训自己的深度学习OCR,我建议您使用角光机。它使用与EasyOCR相同的算法,但提供了一个端到端的训练管道来建立新的OCR模型。它涵盖了所有必要步骤:数据集下载、数据生成、增强、培训和推断。
考虑到深造解决方案在计算上是非常繁重的。祝好运!
https://stackoverflow.com/questions/65790276
复制相似问题