【问题标题】:Surprisingly low accuracy using tesseract for OCR recognition on simple images. How can I improve it?使用 tesseract 对简单图像进行 OCR 识别的准确率低得惊人。我该如何改进它?
【发布时间】:2019-10-11 01:31:42
【问题描述】:

我正在使用 pytesseract 解析从浏览器屏幕截图中提取的数字。这是我第一次使用 OCR,如果我用错了方法,请纠正我。我在看起来很容易解释的图像上获得非常低的准确性。有时我得到空字符串;很少我也会得到错误的数字。

在其他地方,人们建议过滤和放大图像。我这样做了,它变得更好了,从几乎 0 到 50% 左右的准确度,但这仍然很差。我正在制作硒提取的屏幕截图;下面报告了一些代码。对不起,如果它很乱,我包括了图像加载和处理部分来展示我在做什么,但不想泄露我正在加载的页面。

这是一张图片,我展示了图片处理后的样子,以及解析并转换为浮点数的结果。

from selenium import webdriver
from PIL import Image
import pytesseract, cv2, time, numpy as np

# load the page, enlarge, save as png, load as usable image
driver.get("https://a-page-I-wont-tell-you-sorry")
time.sleep(5) # wait for loading
driver.execute_script('document.body.style.MozTransform = "scale(1.50)";') # enlarge
enlarged_screenshot = driver.get_screenshot_as_png()
file = open("enlarged_screenshot.png", "wb")
file.write(enlarged_screenshot)
file.close()
enlarged_screenshot = Image.open("enlarged_screenshot.png")

# method for cropping and filtering
def crop_and_filter(image, coordinates, filter_level):
    width, height = image.size
    x0, y0, x1, y1 = coordinates
    cropped_image = image.crop((width*x0, height*y0, width*x1, height*y1))
    image_l = cropped_image.convert("L")
    image_array = np.array(image_l)
    _, filtered_image_array = cv2.threshold(image_array, filter_level, 255, cv2.THRESH_BINARY)    

    print("*"*100); print("Filtered image:")
    display(Image.fromarray(filtered_image_array))

    return filtered_image_array

# example of how I call and parse it
x0 = 0.51; y0 = 0.43; delta_x = 0.05; delta_y = 0.025
filtered_image_array = crop_and_filter(enlarged_screenshot, (x0, y0, x0+delta_x, y0+delta_y), 125, True)
number = pytesseract.image_to_string(filtered_image_array, config="-c tessedit_char_whitelist=0123456789.\t%")

【问题讨论】:

  • 如果没有特定的输入图像,真的很难诊断——否则你只会邀请一般的 cmets,例如“做一些预处理”。即使不是真实的,您能否提供示例图像?这也是帮助您弄清楚发生了什么/错误的好方法。 FWIW:我想知道您的 open/imread 是否正在破坏 png。另外,你需要 PIL 和 OpenCV 吗?您如何量化/测量定义的准确性?
  • 感谢您的回答。上面的链接中有一张带有 8 张后期处理图像的图像,我认为这很有用。今晚晚些时候我会放一个原始图片的链接。直到 2 天前我才听说过 PIL、openCV 和 tesseract,我只是从网上复制了 sn-ps,随时告诉我这样做的明智方法是什么:)。在量化准确性方面,我运行了大约 20 个数字并得到了大约 10 个正确读数,所以我说大约 50%。不管是 40% 还是 60% 对我来说并没有太大的区别,我至少需要 90%。
  • 啊,好吧 - 一开始我以为那​​是你的图片,所以我进行了测试并得到了不错的结果,但后来我认为实际上你的图片是 of 结果,所以我解开了一切。只要告诉我你想如何测量准确性(例如,你能发布一个真实的文本文件吗?)我会发布一个答案(对于 Tesseract 而不是 pytesseract - 除非你坚持后者?)
  • 谢谢,什么是基本事实文本文件?你能给我一些关于使用 tesseract 而不是 pytesseract 的说明吗?此代码将成为正在运行的 python 脚本的一部分。 (今晚我会发布你要求的任何内容,因为在那之前我无法访问我的电脑)
  • 看看pastebin.com/i6W9k9Nv——这就是我得到的输出——够好吗?

标签: tesseract python-tesseract


【解决方案1】:

这开始是一条评论,但太长了:

你的问题有点不清楚,但最后我认为你想对你在https://i.stack.imgur.com/m5WJQ.png发布的实际图像运行 Tesseract

我使用的命令是

tesseract --oem 1 -l eng --psm 11 m5WJQ.png stdout

这产生了以下输出:

ek ok ek ok ok ok ok ok ok ok ok ok

Filtered image:

65

HAA

Filtered image:

3

HAA

Filtered image:

3.5

HAA

Filtered image:

2.64

HAA

Filtered image:

75

HAA

Filtered image:

3.1

HAA

Filtered image:

3.6

HAA

Filtered image:

2.68

EARSED NUMBERS:

[nan, nan,

3.5, 2.64, nan,

3.1, 3.6, 2.68]

根据您对原始问题的 cmets,这对您来说看起来不错。

我正在从源代码构建的 macOS 10.13.6 High Sierra 上运行 Tesseract(但您不必这样做)。

tesseract --version
tesseract 5.0.0-alpha-371-ga9227
 leptonica-1.78.0
  libgif 5.1.4 : libjpeg 9c : libpng 1.6.37 : libtiff 4.0.10 : zlib 1.2.11 : libwebp 1.0.3 : libopenjp2 2.3.1
 Found AVX2
 Found AVX
 Found FMA
 Found SSE
 Found libarchive 3.4.0 zlib/1.2.11 liblzma/5.2.4 bz2lib/1.0.6

看看您是否也可以复制此内容,如果不能,请发表评论。我看看能不能从pytesseract得到相应的输出。

此外,由于您(有时)知道数字应该是什么,您可以使用诸如 ocreval(https://github.com/eddieantonio/ocreval - 我不隶属于它)之类的工具来查看与已知/输入相比您的运行情况如何/“地面”真相。

HTH

【讨论】:

  • 再次感谢您的帮助。我已经在我用来生成上面输出的同一张图像上运行了我的 pytesseract 命令,但是通过绘制而不是 image.crop 进行裁剪,这次得到了非常完美的输出(除了“111 英镑”变成了“填充” ,但这是可以理解的。)。我想我应该多尝试一下,希望它会好起来的。如果我再次挣扎,我会再次发表评论,以便您收到通知,我将发布一个完全可重现的示例,以便更轻松地帮助我。如果不是,我会在几天内接受您的帖子作为答案。
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2018-05-07
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多