qwedc001 / tesseractOCR_umi_plugin

tesseractOCR 在umi-ocr上的支持插件
MIT License
8 stars 3 forks source link

tesseractOCR 插件优化TODO #4

Closed qwedc001 closed 10 months ago

qwedc001 commented 10 months ago

你现在可以先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 https://github.com/hiroi-sora/Umi-OCR_plugins/issues/2#issuecomment-1913134715_

qwedc001 commented 10 months ago

针对第二条,自动排版实际上对应代码实现为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 commented 10 months ago

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

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

qwedc001 commented 10 months ago

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

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

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

qwedc001 commented 10 months ago

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

hiroi-sora commented 10 months ago

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

hiroi-sora commented 10 months ago

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

了解,后续我会看看

追求质量只能换best模型

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

qwedc001 commented 10 months ago

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

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

qwedc001 commented 10 months ago

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

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

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

hiroi-sora commented 10 months ago

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

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

import locale code, encoding = locale.getdefaultlocale()