Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tesseractOCR 插件优化TODO #4

Closed
qwedc001 opened this issue Jan 27, 2024 · 10 comments · Fixed by #9
Closed

tesseractOCR 插件优化TODO #4

qwedc001 opened this issue Jan 27, 2024 · 10 comments · Fixed by #9
Assignees
Labels
enhancement New feature or request help wanted Extra attention is needed

Comments

@qwedc001
Copy link
Owner

qwedc001 commented Jan 27, 2024

你现在可以先PR过来,后续继续优化。

以下一些问题和建议,请一条条核对:


  1. “置信度下限”转移到globalOptions中。因为这是个全局设置,应该仅设定一次、对所有标签页生效。

  1. 不开启“自动识别排版”时,双栏排版的图片,会产生严重的误合并问题(左右两栏的文本块被合并为一个,且行高与实际不符)。你检查一下,能否在调用代码中优化。如果不能解决,那么把“自动识别排版”默认True。

image


  1. 将tesseract本身的识别排版功能与Umi进行整合。具体来说,刚发布的 2.0.2 alpha 版 支持在文本块中额外定义一个"end"属性,标记这个文本块结尾的间隔符。如:
textBlock = {"text":"文本", "box":包围盒, "score ":置信度,
"end": "\n", # 如果这个block为自然段的末尾行,那么结尾间隔符为"\n"。否则,为空格" "或者空""
 }

在新版软件面板中,也会通过小回车图标,标出结尾为\n的文本块。

image

你需要从tesseract的结果中,判断哪些文本块属于自然段的结尾=,end为\n。其余文本块,end为" "或""(根据上下文是汉字还是字母)。

这时,软件面板上设置里的”排版解析方案“换成”不做处理“,Umi就会优先采用tesseract的排版结果。


  1. 空文本块问题。有一些文本块是空的。尝试在调用代码中将它们过滤掉。

image


  1. TESSERACT_SUPPORTED 中,语言名称用相同语言书写,如下。(至少大部分常用的改为相同语言书写,不常用的保留英文名也可)。然后,在 localOptions 中,不要硬编码任何语言(包括中英日数学),所有语言库都动态搜索。
TESSERACT_SUPPORTED = {
    "equ": tr("数学公式"), # 这个使用tr翻译
    "chi_sim": "简体中文",
    "eng": "English",
    "chi_tra": "繁體中文",
    "jpn": "日本語",
    "korean": "한국어",
    "cyrillic": "Русский",
    # .....补充更多语言
}

  1. 重新打包release,把常用的模型库附上(目前缺数学库)。

Originally posted by @hiroi-sora in hiroi-sora/Umi-OCR_plugins#2 (comment)

@qwedc001 qwedc001 self-assigned this Jan 27, 2024
@qwedc001 qwedc001 added enhancement New feature or request help wanted Extra attention is needed labels Jan 27, 2024
@qwedc001 qwedc001 pinned this issue Jan 27, 2024
@qwedc001
Copy link
Owner Author

针对第二条,自动排版实际上对应代码实现为tesseractOCR psm参数设定为3,关闭时psm参数设定为6.

tesseract官方对于此两种模式的解释如下
· 3 = Fully automatic page segmentation, but no OSD. (Default)
· 6 = Assume a single uniform block of text.

关闭自动排版实际上就是默认了只有一个文本块,我会在下版更新中将其默认开启。
实际上psm值可以从0到11,但其主要影响的还是tesseract本身选择合并的模式,而这一条在后续umi已经有适配,所以从理论上来讲这个参数不需要额外修正,不过我可能会再研究一下osd在psm参数中发挥的作用。

附:docs对于psm的全部参数
· 0 = Orientation and script detection (OSD) only.
· 1 = Automatic page segmentation with OSD.
· 2 = Automatic page segmentation, but no OSD, or OCR. (not implemented)
· 3 = Fully automatic page segmentation, but no OSD. (Default)
· 4 = Assume a single column of text of variable sizes.
· 5 = Assume a single uniform block of vertically aligned text.
· 6 = Assume a single uniform block of text.
· 7 = Treat the image as a single text line.
· 8 = Treat the image as a single word.
· 9 = Treat the image as a single word in a circle.
· 10 = Treat the image as a single character.
· 11 = Sparse text. Find as much text as possible in no particular order.
· 12 = Sparse text with OSD.
· 13 = Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific.

@hiroi-sora
Copy link
Contributor

嗯,毕竟umi内部的排版解析还是传统算法机械式的划分,精准度上限应该没有用深度学习来划分的高。

如果你测试得出tesseract插件的文本块顺序及end="\n"段落划分 确实非常准确,那就大大滴好;将会是tesseract对比paddle等OCR插件的一大优势。

@qwedc001
Copy link
Owner Author

对了,请求一个bugfix,这个可能是umi的软件问题。
我在language settings里内置了一个tooltip,这个tooltip好像无法被正确触发。

"toolTip": "请在仅当文本内容包含多语言时再勾选额外识别语言,否则可能会出现识别精度下降问题。", # FIXIT: 目前该tooltip是失效状态。

@qwedc001
Copy link
Owner Author

针对todo3,经测试,分段效果确实要优于umi自身分段,不过fast模型仍然会有偶尔的识别错误出现。如果追求质量只能换best模型了(
至此所有todo已经全部完成,我一会打包新的pre-release。
如果没有新的问题产生,那我就把i18n填了发布release了

@qwedc001 qwedc001 linked a pull request Jan 27, 2024 that will close this issue
@qwedc001
Copy link
Owner Author

坏,怎么自动给我close掉了
不过把所有语言模型都变成动态以后出现了一个新的问题,没有默认勾选任何语言作为ocr目标,直接运行会导致ocr失败

@qwedc001 qwedc001 reopened this Jan 27, 2024
@hiroi-sora
Copy link
Contributor

动态加载后,检查当前语言列表中是否存在 简中、English,如果有就设置它的default为True。如果没有中英,就设置语言列表中第1位语言的为True。如果语言列表为空,在class Api的__init__()中抛出一个异常。

@hiroi-sora
Copy link
Contributor

hiroi-sora commented Jan 27, 2024

这个tooltip好像无法被正确触发

了解,后续我会看看

追求质量只能换best模型

做个测试,看看fast和best的精准度(包括字符准度和排版准度)、速度 具体有什么差别。

@qwedc001
Copy link
Owner Author

动态加载后,检查当前语言列表中是否存在 简中、English,如果有就设置它的default为True。

了解,但是需要特殊注意的是,在只有单语言的语境下勾选多语言可能会造成一定程度的识别错误。这个也被我写进了tooltip。我的想法要么是默认勾选简中,或者是让umi检测一下用户语言环境什么的

@qwedc001
Copy link
Owner Author

qwedc001 commented Jan 27, 2024

做个测试,看看fast和best的精准度(包括字符准度和排版准度)、速度 具体有什么差别。

这个我是做过的,best的识别速度在我的电脑(i9-13900HX)上是比较稳定的4~5秒一张,fast识别速度在2秒一张左右。因为tesseract并不能像是paddle一样设置占用线程数量,所以在识别速度上不如paddle(cpu识别平均1.2s/张)。

在识别质量方面,新加的分段我还没有进行测试,之前测试中置信度平均有3~5的提升。

@hiroi-sora
Copy link
Contributor

那现在先只默认勾选简中吧,如果简中不存在再勾选第一位。

python获取系统语言是很容易的,如下。不过我觉得暂时没必要把插件写得那么麻烦。

import locale
code, encoding = locale.getdefaultlocale()

@qwedc001 qwedc001 removed a link to a pull request Jan 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request help wanted Extra attention is needed
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants