hiroi-sora / Umi-OCR

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

求学习 #102

Closed JulySsAugust closed 1 year ago

JulySsAugust commented 1 year ago

你好作者,能讲解一下代码部分嘛。作为小白想学习一下并且增加点需要的功能教教吧QAQ

hiroi-sora commented 1 year ago

你好~

建议从 最近稳定版的分支 开始研究,以免main分支中的最新代码可能存在bug,影响你的判断。 如果你想整体的了解本项目,可能需要先学习一下tkinter框架,然后从ui\win_main.py入手。如果只是想增改一些小功能,则可以善用编辑器的全局搜索功能,快速定位到某个模块。 请放心,写注释是我的爱好,本项目的代码几乎每一行都有注释,你一定能看懂的。

若具体某一部分的功能或者代码有疑惑,可以再来问我~~

JulySsAugust commented 1 year ago

感谢作者!

JulySsAugust commented 1 year ago

作者你好,大致的运行流程我了解了,我想问问有没有demo文件,还是说WIN_MAIN可以运行呢?我尝试过运行win_main文件存在报错有什么解决办法吗?希望指导一下,谢谢您!

报错: Traceback (most recent call last): File "L:\OCR\Umi-OCR-release-1.3.2\ui\win_main.py", line 5, in from utils.tool import Tool File "L:\OCR\Umi-OCR-release-1.3.2\utils\tool.py", line 4, in from win32clipboard import OpenClipboard, GetPriorityClipboardFormat, CloseClipboard, GetClipboardData, EmptyClipboard ImportError: DLL load failed while importing win32clipboard: 找不到指定的程序。

hiroi-sora commented 1 year ago

哦,是这样的。本项目是分层结构的Python工程,自定义模块采用相对路径导入,而工程的入口文件是根目录下的main.py。也就是,必须运行main.py才能启动整个程序,才能让各个相对导入的模块被正确识别。(你这个报错,就是相对导入路径无法识别。)

如果你用的编辑器是 VsCode ,可以进行这几步以导入工程:

  1. 在Umi-OCR项目文件夹下,右键→通过Code打开
  2. 文件→将工作区另存为→保存为Umi-OCR.code-workspace或别的名字
  3. 新建文件夹.vscode,里面新建文件launch.json,粘贴以下内容:
    {
    "configurations": [
        {
            "name": "Python: Umi-OCR",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}\\main.py",
        }
    ]
    }
  4. 下一次,只需要用VsCode打开Umi-OCR.code-workspace工作区就行了。然后无论你当前在浏览哪一个文件,按F5运行程序都会从main.py启动。

如果你是用PyCharm或别的编辑器,也可以使用类似的步骤导入工程。

JulySsAugust commented 1 year ago

感谢作者的解答,对于学习很有帮助! 可增加Excel输出格式吗。

hiroi-sora commented 1 year ago

增加Excel输出格式

可以,本项目注重拓展性,可以很方便的拓展像 别的输出格式 这样的功能。

简单来说需要以下几个步骤:

  1. ocr\ 下,有一批 output_xxx.py 输出器模块。你可以仿照其中的代码,编写一个 output_excel.py 输出器。
  2. ocr\msn_batch_paths.py 中,引入这个 output_excel.py 模块,并添加到 # 初始化输出器 的代码中。
  3. utils\config.py_ConfigDict 配置字典中添加 isOutputExcel 配置项。
  4. ui\win_main.py 中添加一个 ttk.Checkbutton 来控制是否启用这个配置项。

注意不要一口气写完,而是每写一小段代码就要测试其功能是否符合预期。

JulySsAugust commented 1 year ago

太感谢作者!我去试试,还有啥问题再来求助!太感谢了!

JulySsAugust commented 1 year ago

你好作者,我有些疑问想请教一下。获取的图片之后是通过哪个函数传到OCR中?还有哪个是OCR运行的函数?是engine.py文件吗?可是我没找到输入的Path的。QAQ 本人小白希望作者指点一下,万分感谢。

hiroi-sora commented 1 year ago

哪个是OCR运行的函数?

这部分可能有点难理解,一次OCR任务需要调用的代码实际上是分散在各个文件中的。为了便于拔插不同模块,实现不同引擎实例、不同任务类型、不同文本处理方式、不同输出方式的排列组合,代码中采用了设计模式中 策略模式(Strategy Pattern)的思想。或许你可以先了解一下设计模式

一次OCR任务涉及这些模块:

因此,获取到图片之后,还要同步初始化一个任务管理器,在任务管理器内初始化输出器和文本块处理器,然后将图片路径paths和任务管理器实例 传递给引擎管理器。

OCR流程的调用起点是 win_main.pyrun()startSingleClipboard() 。 (其中有一行注释 # 初始化文本处理器 是错的,应该是 # 初始化批量识图任务处理器

JulySsAugust commented 1 year ago

好的作者,谢谢教导,有点迷茫就来求助了,感谢作者的耐心指点。

JulySsAugust commented 1 year ago

你好作者,我自己尝试了弄了个ORC的识别,有点问题想请教一下 ocr = PaddleOCR() result = ocr.ocr(img_path) for line in result: print(line) 这就是个基础的调用ORC,他这个PaddleOCR输出内容 有位置信息 文本内容 置信度 怎么才能只输出文本内容呢,希望作者能教教我,万分感谢。

hiroi-sora commented 1 year ago

怎么才能只输出文本内容呢

如果 line 是OCR结果字典中的['data']列表的元素,那输出line中的['text']就行了,print(line['text])

另外如果你打算从头开始弄OCR,可以直接用 PaddleOCR-json的Python API模块

JulySsAugust commented 1 year ago

额,不太会丫 QAQ

hiroi-sora commented 1 year ago

我不知道你的 PaddleOCR() 是怎么封装的,就以我的 api_ppocr_json.py 为例(PaddleOCR-json的Python API也是同理):

from api_ppocr_json import OcrAPI

ocr = OcrAPI(r'…………\PaddleOCR_json.exe')
result = ocr.run('图片.png')
if result['code'] == 100:      # 成功
    for t in result['data']:
        printf(f'文本:{t["text"]}')
        printf(f'置信度:{t["score"]}')
        printf(f'包围盒:{t["box"]}')
else:  # 失败
    printf(f'错误码:{t["code"]}\n失败原因:{t["data"]}')

建议再看看 PaddleOCR-json 的返回值说明。

JulySsAugust commented 1 year ago

我是直接在pycharm中 pip install PaddleOCR 然后后面就是单纯的把图片输入到里面 img_path = '........' ocr = PaddleOCR() result = ocr.ocr(img_path) for line in result: print(line) 实在水平有限,作者的哪个程序大致理解运行的逻辑,但是上手改有点不太行,啊哈哈哈,有待学习。就根据您之前说的TTK框架敲了个窗口。好想开始有点难度。

hiroi-sora commented 1 year ago

pip install 的 PaddleOCR 跟本项目不是同一个引擎。pip的那个是Paddle官方的基于Python的引擎。本项目是第三方封装的C++引擎,比Python版要快很多。

Python版具体用法我不清楚,但总体大差不差,都是返回字典或者列表嵌套。你print(line)输出的大概是一个字典,里面有哪些元素?分别取这些元素 print(line['元素']) 打印出来就是了。

JulySsAugust commented 1 year ago

蟹蟹作者,貌似明白了点,我再去琢磨一下!

JulySsAugust commented 1 year ago

你好作者,学习了您的代码我自己简单弄了个我需要的识别程序,但是关于这个程序的打包出了点问题,能不能帮帮我。救救孩子吧

hiroi-sora commented 1 year ago

关于这个程序的打包出了点问题

具体是什么问题呢?

我先盲猜一下可能由PPOCR的Python库引起,这个库确实不容易通过pyinstaller打包。(所以本项目才采用外置的C++版引擎,便于打包。) 如果你想打包Python版的PPOCR,可以参考一下隔壁的团子翻译机,它是采用QPT而不是pyinstaller打包。QPT对PaddleOCR这种大型库的打包支持度更好。

JulySsAugust commented 1 year ago

因为我不太会你说的调用外置引擎这种操作(我怎样才能学习),确实应该像你说的paddle问题因为一开始报错就是paddle有问题解决完后新问题了弄了半天没成 QAQ 。你说的这个QPT我去试试,谢谢谢谢谢谢 太感谢了!

JulySsAugust commented 1 year ago

确实成功了,谢谢作者,我还会继续学习。太感谢了,太感谢了!!!

paul-yangmy commented 1 year ago

大佬,最近在学习您的代码,在执行时报了这个ImportError: DLL load failed while importing win32clipboard: 找不到指定的程序。这是少哪些东西呢?我看pywin32是正常安装的,谢谢~ 我的环境是python3.10的miniconda

hiroi-sora commented 1 year ago

@paul-yangmy

环境的问题。

image image

来源: https://stackoverflow.com/questions/58612306/how-to-fix-importerror-dll-load-failed-while-importing-win32api https://stackoverflow.com/questions/60750197/pywin32-importerror-dll-load-failed-the-specified-module-could-not-be-found

paul-yangmy commented 1 year ago

谢谢大佬可以了! 顺便记录一下问题,在使用conda安装时报了RemoveError: 'pyopenssl' is a dependency of conda and cannot be removed from conda's operating environment,通过--force-reinstall conda解决

JerManh commented 1 year ago

你好作者大大,小白在学习你的项目,在尝试封装打包项目为.exe程序,我试了pyinstaller行不通,作者你是怎么打包这个项目的呢?

hiroi-sora commented 1 year ago

@JerManh 我就是用pyinstaller来打包的,见 to_exe.py 。你是遇到了什么问题?

JerManh commented 1 year ago

@hiroi-sora 1.使用pycharm2023.1.1打包,b编辑项目时提示Package requirement 'psutil==5.9.2' is not satisfied,缺少这个依赖包,是必要的吗? 2.忽略上一步缺少的依赖包,打包的结果在dist文件夹生成了 "Umi-OCR 文字识别.exe",但是执行出现这个提示框: Unhandled exception in script: " Traceback (most recent call last): File "main.py", line 4, in File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "utils\config.py", line 5, in ModuleNotFoundError: No module named 'psutil' "

hiroi-sora commented 1 year ago

@JerManh

当然,psutil是不可缺少的一个库,负责引擎进程的内存管理。

请使用 pip install -r requirements.txt 安装本项目所有依赖库,或者单独安装 psutil

JerManh commented 1 year ago

@hiroi-sora 谢谢作者的耐心回复!这是我的第一个python项目,学得磕磕碰碰的,但我会继续学习。