hiroi-sora / RapidOCR-json

OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。基于 RapidOcrOnnx 。
MIT License
193 stars 33 forks source link

如何将引擎的subprocess窗口展示出来? #16

Closed qwedc001 closed 8 months ago

qwedc001 commented 8 months ago

hiroi-sora/RapidOCR-json/issues/13 GPU相关,但是也没有那么相关。所以单开issue了

我在用我自己的电脑和编译好的win版RapidOCR运行文件进行Umi内GPU测试,然后发现识别时间和预期不符(均值在20秒,单编译ocr的效率在毫秒级)

所以我想要通过展示引擎窗口本身尝试定位问题。

但是我尝试取消掉rapidocr.py的34行的参数和上面的flags,并没有成功让引擎本身弹出,仍然是静默运行的状态,我本身没怎么接触过subprocess,加上在stackoverflow查询尝试未果,只能来这里再开issue了(

qwedc001 commented 8 months ago

有关win版RapidOCR-json GPU的fun facts:我已经明确加入GPU调用参数,但是在OCR过程中GPU占用只有10%不到,平均值更是约等于5%,与正常情况不符

hiroi-sora commented 8 months ago

展示引擎控制台窗口

rapidocr.py 尝试改为这样:

        self.ret = subprocess.Popen(  # 打开管道
            exePath,
            cwd=cwd,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            # stderr=subprocess.DEVNULL,  # 丢弃stderr的内容,注释掉
            # startupinfo=startupinfo,  # 开启静默模式,注释掉
            creationflags=0x00000010,  # 创建新控制台
        )

如果你想让信息在控制台输出,C++代码中不要用cout,要用 std::cerr << "调试信息" << std::endl;

其实创建新控制台是不必要的,就算不创建, std::cerr 的内容也会在调试 python 的控制台里面打印。

std::cout 的内容会被转接到python代码内,也就是无论在哪个控制台,都不会打印出来。

qwedc001 commented 8 months ago

rapidocr.py 尝试改为这样:

已尝试,无效,弹出控制台,但是是黑框

image

hiroi-sora commented 8 months ago

上文已更新。估计你这是C++里没有输出到 stderr 所以看不见任何信息。

qwedc001 commented 8 months ago

std::cout 的内容会被转接到python代码内,也就是无论在哪个控制台,都不会打印出来。

好吧,我想要获取到的就是std::cout的内容,如果没有办法独立监视的话就难办了

hiroi-sora commented 8 months ago

获取std::cout的内容也很简单:

rapidocr.pydef runDict 里面有一行 getStr = self.ret.stdout............

后面加一行 print("stdout原始输出:", getStr ) 即可。

但是:这样只能获取引擎在处理一张图片的过程中的 cout ,而且会干扰原本的任务流程(可能让python无法获取到引擎的正确输出)。

qwedc001 commented 8 months ago

刚想到了,问题解决了,我调一下 谢啦

hiroi-sora commented 8 months ago

题外话,我看到你更新了 tesseract插件 ,能否帮我在 这里 向用户说明一下如何载入插件及法语库。

qwedc001 commented 8 months ago

好,我就去