PaddlePaddle / PaddleOCR

Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
https://paddlepaddle.github.io/PaddleOCR/
Apache License 2.0
43.9k stars 7.8k forks source link

C++ inference 能跑其他模型吗? #713

Closed lanybass closed 3 years ago

lanybass commented 4 years ago

rec_model我没用 超轻量中文模型通用中文OCR模型 ,而是用的 RARE | MobileNetV3 : rec_mv3_tps_bilstm_attn。 det已经检测出框了,然后rec模型每次运行到这句:this->predictor_->ZeroCopyRun(); 就各种报错。

0x000007FEFCC2BDFD 处(位于 ocr_system.exe 中)引发的异常: Microsoft C++ 异常: dnnl::error,位于内存位置 0x00000000001CCF10 处。
0x000007FEFCC2BDFD 处(位于 ocr_system.exe 中)引发的异常: Microsoft C++ 异常: dnnl::error,位于内存位置 0x00000000001CAD20 处。
0x000007FEFCC2BDFD 处(位于 ocr_system.exe 中)有未经处理的异常: Microsoft C++ 异常: dnnl::error,位于内存位置 0x00000000001CAD20 处。

如果不用ZeroCopyRun改成Run,除了报错以外,控制台还会有输出以下内容:

E0914 18:21:52.736883  6976 analysis_predictor.cc:347] feed names from program d
o not have name: [] from specified input

我的环境: win7 x64 vs2019 CPU [v1.7.2/v1.8.3都试过,一样]

littletomatodonkey commented 4 years ago

不同的模型的预处理、数据格式和后处理不同,需要针对适配一下,识别的模型目前只支持了CRNN,推荐使用CRNN系列模型~

Annihilation7 commented 4 years ago

不同的模型的预处理、数据格式和后处理不同,需要针对适配一下,识别的模型目前只支持了CRNN,推荐使用CRNN系列模型~

也就是说全部模型是支持c++环境 inference的,只不过需要适配后处理代码,是吧,大佬

lanybass commented 4 years ago

恳请大佬适配其他模型~ 我最后测试了rec_mv3_none_bilstm_ctc,只有use_mkldnn 0的时候正确,开启mkldnn出来的结果就完全不对

littletomatodonkey commented 4 years ago

0

你好,如果需要使用mkldnn的话,建议设置use_zero_copy_run=0, 同时使用Paddle1.8.4及以上版本

lanybass commented 4 years ago

0

你好,如果需要使用mkldnn的话,建议设置use_zero_copy_run=0, 同时使用Paddle1.8.4及以上版本

换1.8.4了。不管usemkldnn开不开,DBDetector::LoadModel就报错: `this->predictor = CreatePaddlePredictor(config);`

Error: Note: Each config can only be used for one predictor. at (D:\1.8.4\paddle\paddle\fluid\inference\api\analysis_predictor.cc:508)

===========================

好吧,我追了源码,然后自己把config.is_valid()打出来看,他莫名其妙就又不报错了。

lanybass commented 4 years ago

把zeroCopyRun改成run依然错乱。 后来看了有几个配置选项,改成如下就出结果了: ··· // false for zero copy tensor config.SwitchUseFeedFetchOps(true); // true for multiple input config.SwitchSpecifyInputNames(false);

config.SwitchIrOptim(false);

//config.EnableMemoryOptim(); config.DisableGlogInfo();

this->predictor_ = CreatePaddlePredictor(config); ··· 然而,我的内心毫无波澜(推理速度丝毫没提高),甚至有点想笑(甚至还更慢)

littletomatodonkey commented 4 years ago

恳请大佬适配其他模型~ 我最后测试了rec_mv3_none_bilstm_ctc,只有use_mkldnn 0的时候正确,开启mkldnn出来的结果就完全不对

你可以先试下官网的Demo,基于DB和CRNN测试一下单张图片看是否能跑通(打开或者关闭mkldnn都可以测试一下),之后再试下其他的模型

littletomatodonkey commented 4 years ago

把zeroCopyRun改成run依然错乱。 后来看了有几个配置选项,改成如下就出结果了: ··· // false for zero copy tensor config.SwitchUseFeedFetchOps(true); // true for multiple input config.SwitchSpecifyInputNames(false);

config.SwitchIrOptim(false);

//config.EnableMemoryOptim(); config.DisableGlogInfo();

this->predictor_ = CreatePaddlePredictor(config); ··· 然而,我的内心毫无波澜(推理速度丝毫没提高),甚至有点想笑(甚至还更慢)

zero copy run的确是比run接口要快一些,但是使用zero copy run的时候,建议输入shape是恒定的,否则还是会有内存泄露的问题,因为ocr中,输入shape不恒定,所以这里修改为了run的接口

lanybass commented 4 years ago

最后一个问题,识别输出的字符数量和计算score时的数量不匹配,

for (int n = int(rec_idx_lod[0][0]); n < int(rec_idx_lod[0][1]); n++) {
      pred_idx.push_back(int(rec_idx[n]));
}

当我的pred_idx有16个时,下面的count有时却多于16个或少于16个

if (blank - 1 - argmax_idx > 1e-5) {
    score += max_value;
    count += 1;
}

那么请问,我要想知道每一个字符的score怎么搞? @littletomatodonkey

littletomatodonkey commented 3 years ago

对于python预测,可以从这里拿到

https://github.com/PaddlePaddle/PaddleOCR/blob/4cf85329cdd24eb206afec6c1193f36fc0134fe4/tools/infer/predict_rec.py#L261