hiroi-sora / Umi-OCR

OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。
MIT License
27.23k stars 2.73k forks source link

运行失败的问题 #337

Closed Aweiiss closed 9 months ago

Aweiiss commented 9 months ago

作者大大,主程序运行是不是可以直接运行UmiOCR-data下的main.py文件吗?我按照提示已经搭建好了项目目录,但是我在运行main.py文件的时候显示主程序启动失败! 提示是:Directory ‘static/’ does not exist 请问这种情况应该怎么解决啊?是不是我哪里没有配置好呀?主要是这个路径应该如何设置! image

hiroi-sora commented 9 months ago

你必须使用项目内置的python解释器来启动main.py,而不是使用你电脑上安装的python解释器。

你可以先点击运行 Umi-OCR.exe 或者 UmiOCR-data/RUN_CLI.bat ,看看能否正常启动。

然后,你需要在你的编辑器(似乎是IDEA?)中,修改项目配置,指定使用 ${工作目录}/UmiOCR-data/runtime/python.exe 作为当前项目的解释器。

如果你不熟悉上述流程,建议使用Vscode进行开发,本仓库内已包含完整的Vscode项目配置文件。参考 文档 可以简便地导入项目环境。

Aweiiss commented 9 months ago

嘿嘿,感谢作者大大,这个问题已经解决啦。还有一个问题希望请教一下,我看项目中TesseractOCR模型是可以调整置信度的,但是其他:PaddleOCR、Pix2Text和RapidOCR好像都无法调整置信度,这块是模型限制无法实现吗?还是当前项目未计划对这块的开发呀?

hiroi-sora commented 9 months ago

不,所有模型都支持 输出置信度信息

TesseractOCR插件是由 @qwedc001 开发的,他额外添加了一个置信度下限的功能,可以过滤掉 置信度低于指定值的文本块。这可能有助于避免误识别。(比如,引擎误将一个表情识别为文本,但置信度会比较低,可以被过滤掉)

PaddleOCR、Pix2Text和RapidOCR插件都可以实现该功能的,做法非常容易。但是,我考虑到这三个插件都是使用Paddle系模型,精度已经比较高,误识别的几率较少。而且就算误识别,置信度也比较高,难以将错误的文本与正常文本区分开。因此,我就没有做置信度下限的功能。

Aweiiss commented 9 months ago

可以请教一下作者大大,PaddleOCR、Pix2Text和RapidOCR插件如何实现置信度下限的功能吗?我想测试一下,如果对于这三个插件相对应的置信度下限是怎么样的一个表现,不知道作者大大方便吗?感谢感谢

hiroi-sora commented 9 months ago

以PaddleOCR插件为例,在 UmiOCR-data\plugins\win7_x64_PaddleOCR-json\paddleocr.py 的71行有一句 return jsonLoads(getStr) 。你可以将这一句改为:

先获取json字典对象,遍历data列表,检查并过滤置信度score低于指定值的条目。如:

        try:
            res = jsonLoads(getStr)
            if res["code"] == 100:  # 识别成功
                # 重新构建data列表,保留置信度 >= 60% 的条目
                res["data"] = [d for d in res["data"] if d.get("score", 1) >= 0.6]
            return res

其他插件也大同小异。

Aweiiss commented 9 months ago

作者大大,我刚刚按照你说的这样进行修改了: image 修改完之后运行软件,然后进行图片识别,这个时候反而出现了错误: image

hiroi-sora commented 9 months ago

修改后:

        try:
            res = jsonLoads(getStr)
            if res["code"] == 100:  # 识别成功
                # 重新构建data列表,保留置信度 >= 60% 的条目
                res["data"] = [d for d in res["data"] if d.get("score", 1) >= 0.6]
                # 若所有块都被过滤,则重设code为101
                if len(res["data"]) <= 0:
                    res["code"] = 101
            return res
Aweiiss commented 9 months ago

非常感谢作者大大,这样确实就可以实现了,非常非常感谢,必须得给作者大大点赞,嘿嘿🌹🌹🌹❤