gpu版本封装dll供java语言调用,无法使用gpu识别
qiaonanxiansheng opened this issue · comments
我怀疑可能是文本编码问题,你可以通过如下思路检查一下:
- 在dll中增加一个
test1
接口,传入字符串,原样返回该字符串。java调用该接口,查看输入/输出的字符串是否一致。不一致说明编码有问题。 - 在dll中增加一个
test2
接口,传入图片路径,imread读取该图片,保存到另一个位置(如D:/save1.png
)。如果java调用报错,说明可能跟opencv有关。如果无报错,说明跟OCR推理组件有关。 - 在dll中增加一个
test3
接口,没有参数,固定识别一张图片(如D:/test2.png
)。C++调用该接口没问题,那么java调用理论上必然成功。如果java调test2
正常而test3
报错,说明OCR推理组件在java调用的环境中存在异常。
这样一步步缩减错误范围,最后在小范围内插桩(printf),找到具体的某行问题代码。
@hiroi-sora 谢谢哥们,我已经找到问题了,有一个zlibwapi.dll没有拷贝到cuda的bin下面去,这个执行运行没提示,在命令行运行java才提示的。我拷贝进去之后现在可以了,识别速度很快,比mkldnn快3倍左右。另外您封装的这个exe,是不是每次识别都要初始化,那样不是太慢了吗?
是不是每次识别都要初始化
当然不是,只需要初始化一次,后续通过管道传指令识别的时候也是重复调用同一个引擎实例。
是不是每次识别都要初始化
当然不是,只需要初始化一次,后续通过管道传指令识别的时候也是重复调用同一个引擎实例。
明白了,我们这边的人可能更习惯dll这种方式,再次感谢您。
自己封装了dll供java调用,为了防止每次初始化模型,所以dll暴漏了3个方法。后面也有截图 1是初始化模型返回识别对象initHandler() 2根据识别对象识别图像rec() 3关闭识别对象closeHandler()
这3个方法暴漏给java调用,在cpu版本运行良好。现在我用gpu版本编译后,直接c++掉,或者生成exe命令行掉都可以使用gpu,但是用java掉rec方法无法使用gpu,jvm会崩溃,初始化和关闭方法没问题。不知道哪里的问题,能否提供一些思路?
请问大佬,有没有多线程的版本啊?