Closed Auroraol closed 1 year ago
恰恰相反,你这不是构建成功了嘛😂只是缺少模型库,所以未能启动引擎而已。
下载一个1.3.0版的release包,将其中的models文件夹整个拷贝到你编译生成的 ppocr.exe 同目录下,即可。
可选传入-config_path
来手动指定加载哪一套模型库,比如 ppocr.exe -config_path="models/config_german_v2.txt"
。
谢谢啦
我也是同样的问题,也把models文件夹整个拷贝到panddleOCR-Json_v1.3.0文件夹下面了(和panddleOCR-json.exe同路径),然后还是同样的错误。
我是在matlab调用,文件也都有,这些错误怎么搞呢? 1、配置config代码:
exepath = '.\PaddleOCR-json_v.1.3.0\PaddleOCR-json.exe';
configpath = '.\PaddleOCR-json_v.1.3.0\models\config_chinese.txt';
commandconfig = [exepath,' "--config_path" ',configpath];
[status,cmout] = system(commandconfig)
报错:
cmout =
'PaddleOCR-json v1.3.0
Load config from [.\PaddleOCR-json_v.1.3.0\models\config_chinese.txt] : det_model_dir set to models/ch_PP-OCRv3_det_infercls_model_dir set to models/ch_ppocr_mobile_v2.0_cls_inferrec_model_dir set to models/ch_PP-OCRv3_rec_inferrec_char_dict_path set to models/dict_chinese.txt.
[ERROR] det_model_dir [models/ch_PP-OCRv3_det_infer] does not exist. rec_model_dir [models/ch_PP-OCRv3_rec_infer] does not exist.
'
2、使用PaddleOCR-json.exe
exepath = '.\PaddleOCR-json_v.1.3.0\PaddleOCR-json.exe';
command = [exepath,' ',imagepath];
[status,cmout] = system(command);
报错:
cmout =
'PaddleOCR-json v1.3.0
config_path [] does not exist.
[ERROR] det_model_dir [models/ch_PP-OCRv3_det_infer] does not exist. rec_model_dir [models/ch_PP-OCRv3_rec_infer] does not exist.
'
@lil-i321
你先试试,不通过程序调用,直接打开 PaddleOCR-json.exe 有没有问题。 如果直接运行OK。通过程序调用失败,那么是你代码调用exe的工作路径的问题。
PaddleOCR-json.exe 的工作路径必须是它所在的文件夹。可能你在调用时,调用方默认设置了另外的工作路径,导致相对路径找不到模型库。 请尝试手动设置工作路径,或者传入绝对路径。
@lil-i321
你先试试,不通过程序调用,直接打开 PaddleOCR-json.exe 有没有问题。 如果直接运行OK。通过程序调用失败,那么是你代码调用exe的工作路径的问题。
PaddleOCR-json.exe 的工作路径必须是它所在的文件夹。可能你在调用时,调用方默认设置了另外的工作路径,导致相对路径找不到模型库。 请尝试手动设置工作路径,或者传入绝对路径。
1、matlab调用PaddleOCR-json.v1.2.1,不会报错,但是matlab一直会run下去,10min还没停,就1张100k的图片。 Umi-OCR这个软件,10张差不多的图片,18s就提取完了。 2、直接打开1.3.0的 PaddleOCR-json.exe是这个界面
直接打开1.3.0的 PaddleOCR-json.exe是这个界面
对,这个界面表示 PaddleOCR-json 初始化成功了,能正常读入models文件夹中的模型库。所以肯定是调用方的代码编写有问题,而我估计大概率是工作路径没设置对。
直接打开1.3.0的 PaddleOCR-json.exe是这个界面
对,这个界面表示 PaddleOCR-json 初始化成功了。所以肯定是调用方的代码编写有问题,而我估计大概率是工作路径没设置对。
1、更改了绝对路径,也将matlab程序脚本放在PaddleOCR-json.exe同目录下,确实不会报错了。 但是对于1.2.1,这两个额外配置都是不需要的。 2、新的问题是,1.3.0和1.2.1,调用后,一直在运行,没有一点停下来的意思。。。。这是不正常的吧?
没有一点停下来的意思
嗯,因为你用堵塞的方式来调用OCR(即PaddleOCR-json.exe程序退出后,你的代码才能得到返回结果)。而 PaddleOCR-json 默认是循环工作模式,即识别一张图片后不会主动退出,而是等待下一张图片任务。因此,就算 PaddleOCR-json 输出了识别结果,因为它没有退出,你的堵塞模式的代码也无法得到命令行输出。
有两种解法:
另外,我发现了你原本代码里的一个错误,可能是这个错误导致了读模型库失败,而不是工作路径的问题。
configpath = '.\PaddleOCR-json_v.1.3.0\models\config_chinese.txt';
这句写错了,模型库的相对路径,是相对于PaddleOCR-json.exe的位置,而不是相对于调用方脚本的位置。正确的是:
configpath = 'models\config_chinese.txt';
改正上述错误之后,v1.3.0和1.2.1的表现应该一致,即既不需要绝对路径,也不需要移动matlab脚本位置。
没有一点停下来的意思
嗯,因为你用堵塞的方式来调用OCR(即PaddleOCR-json.exe程序退出后,你的代码才能得到返回结果)。而 PaddleOCR-json 默认是循环工作模式,即识别一张图片后不会主动退出,而是等待下一张图片任务。因此,就算 PaddleOCR-json 输出了识别结果,因为它没有退出,你的堵塞模式的代码也无法得到命令行输出。
有两种解法:
1. 使用单次识图模式, 2. 将你的代码改写为非堵塞模式。
单次识图模式,出现这个错误
@lil-i321
这是一个示例,演示如何用非堵塞模式处理多张图片。(我不熟悉matlab,有错请见谅)
% 图片地址列表
imagePaths = {'test1.png', 'test2.png', 'test3.png'};
% 配置文件路径
configPath = 'models\config_chinese.txt';
% 导入 JSON 库
json = jsondecode('{"image_path": ""}');
% 打开管道
cmd = '.\PaddleOCR-json_v.1.3.0\PaddleOCR-json.exe --config_path "%s"';
pipe = popen(sprintf(cmd, configPath), 'w');
% 循环处理每个图片
for i = 1:numel(imagePaths)
% 获取当前图片地址
imagePath = imagePaths{i};
% 构造 JSON 对象
json.image_path = imagePath;
jsonString = jsonencode(json);
% 转义 JSON 字符串
jsonString = matlab.net.base64encode(uint8(jsonString));
% 发送转义后的 JSON 字符串到管道
fprintf(pipe, '%s\n', jsonString);
% 刷新管道缓冲区
fflush(pipe);
% 监听管道回传的结果
result = fgets(pipe);
disp(result);
% TODO:对result做反ascii转义 和 json解析
end
% 关闭管道
pclose(pipe);
单次识图模式,出现这个错误
这是因为单次识别模式可能对中文路径的兼容性不好。如果要用单次识别模式,请准备纯英文路径的图片。 如果需要处理中文路径,那么请使用循环模式+json传入值,像上面我给的例子。
@lil-i321
这是一个示例,演示如何用非堵塞模式处理多张图片。(我不熟悉matlab,有错请见谅)
非常感谢,我确定matlab没有多线程运行的功能,不知道这个非阻塞模式是否和这个相关,如果是,就不行了,后面我会试试看,先搞定单次识别吧,再加上for循环
@lil-i321
非常抱歉可能闹了乌龙,我查了一下,matlab似乎没有提供管道的机制,所以我示例中的 popen() 可能不存在这个函数。
你也许可能找找第三方库或别的方式,实现管道通信的机制。或者,只能使用单次识别模式+英文路径。
单次识图模式,出现这个错误
这是因为单次识别模式可能对中文路径的兼容性不好。如果要用单次识别模式,请准备纯英文路径的图片。 如果需要处理中文路径,那么请使用循环模式+json传入值,像上面我给的例子。
非常感谢,图片名改成英文就可以了,但是不能转成文字,我还需要配置什么呢?
@lil-i321
非常抱歉可能闹了乌龙,我查了一下,matlab似乎没有提供管道的机制,所以我示例中的 popen() 可能不存在这个函数。
你也许可能找找第三方库或别的方式,实现管道通信的机制。或者,只能使用单次识别模式+英文路径。
谢谢特地查询,后面我试试看,结果会在此反馈。
但是不能转成文字,我还需要配置什么呢?
你这已经识别成功了。后续只需要将这个json字符串转为matlab对象,就可以读取结果的每个字段。
单次识别模式+英文路径
matlab确实不能用管道模式,单次识别模式+英文路径+for循环,每张图大概3s,还可以接受... 谢谢作者的程序与解答!!!
PaddleOCR-json.exe 的工作路径必须是它所在的文件夹。可能你在调用时,调用方默认设置了另外的工作路径,导致相对路径找不到模型库。
请问如何设置PaddleOCR-json.exe 的工作路径?我的调用代码所在的位置就是其工作路径吗? 能实现,将任意位置的PaddleOCR-json.exe路径传给matlab程序脚本 吗? 现在只能是PaddleOCR-json.exe和所有的matlab程序脚本 都在一个文件夹下,才能正常工作。
请问如何设置PaddleOCR-json.exe 的工作路径?我的调用代码所在的位置就是其工作路径吗? 能实现,将任意位置的PaddleOCR-json.exe路径传给matlab程序脚本 吗? 现在只能是PaddleOCR-json.exe和所有的matlab程序脚本 都在一个文件夹下,才能正常工作。
搞定了。 1、matlab程序脚本 和 PaddleOCR-json.exe ,不必在一个文件夹下, 2、cd(which('PaddleOCR-json.exe')),设置PaddleOCR-json.exe所在路径为当前文件夹即可。
这是什么问题?
config_path [] does not exist. [ERROR] det_model_dir [models/ch_PP-OCRv3_det_infer] does not exist. rec_model_dir [models/ch_PP-OCRv3_rec_infer] does not exist.