hiroi-sora / PaddleOCR-json

OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。提供各种语言API。由 PaddleOCR C++ 编译。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

gpu版本封装dll供java语言调用,无法使用gpu识别

qiaonanxiansheng opened this issue · comments

自己封装了dll供java调用,为了防止每次初始化模型,所以dll暴漏了3个方法。后面也有截图
1是初始化模型返回识别对象initHandler()
2根据识别对象识别图像rec()
3关闭识别对象closeHandler()

这3个方法暴漏给java调用,在cpu版本运行良好。现在我用gpu版本编译后,直接c++掉,或者生成exe命令行掉都可以使用gpu,但是用java掉rec方法无法使用gpu,jvm会崩溃,初始化和关闭方法没问题。不知道哪里的问题,能否提供一些思路?

java掉初始化handler的时候是成功,也正确返回了handler。掉rec的时候则出问题,报错如下
image

dll中封装的3个方法
image

java调用代码如下:
image

我怀疑可能是文本编码问题,你可以通过如下思路检查一下:

  1. 在dll中增加一个 test1 接口,传入字符串,原样返回该字符串。java调用该接口,查看输入/输出的字符串是否一致。不一致说明编码有问题。
  2. 在dll中增加一个 test2 接口,传入图片路径,imread读取该图片,保存到另一个位置(如D:/save1.png)。如果java调用报错,说明可能跟opencv有关。如果无报错,说明跟OCR推理组件有关。
  3. 在dll中增加一个 test3 接口,没有参数,固定识别一张图片(如D:/test2.png)。C++调用该接口没问题,那么java调用理论上必然成功。如果java调test2正常而test3报错,说明OCR推理组件在java调用的环境中存在异常。

这样一步步缩减错误范围,最后在小范围内插桩(printf),找到具体的某行问题代码。

@hiroi-sora 谢谢哥们,我已经找到问题了,有一个zlibwapi.dll没有拷贝到cuda的bin下面去,这个执行运行没提示,在命令行运行java才提示的。我拷贝进去之后现在可以了,识别速度很快,比mkldnn快3倍左右。另外您封装的这个exe,是不是每次识别都要初始化,那样不是太慢了吗?

是不是每次识别都要初始化

当然不是,只需要初始化一次,后续通过管道传指令识别的时候也是重复调用同一个引擎实例。

是不是每次识别都要初始化

当然不是,只需要初始化一次,后续通过管道传指令识别的时候也是重复调用同一个引擎实例。

明白了,我们这边的人可能更习惯dll这种方式,再次感谢您。

commented

自己封装了dll供java调用,为了防止每次初始化模型,所以dll暴漏了3个方法。后面也有截图 1是初始化模型返回识别对象initHandler() 2根据识别对象识别图像rec() 3关闭识别对象closeHandler()

这3个方法暴漏给java调用,在cpu版本运行良好。现在我用gpu版本编译后,直接c++掉,或者生成exe命令行掉都可以使用gpu,但是用java掉rec方法无法使用gpu,jvm会崩溃,初始化和关闭方法没问题。不知道哪里的问题,能否提供一些思路?

java掉初始化handler的时候是成功,也正确返回了handler。掉rec的时候则出问题,报错如下 image

dll中封装的3个方法 image

java调用代码如下: image

请问大佬,有没有多线程的版本啊?