PaddleOCR icon indicating copy to clipboard operation
PaddleOCR copied to clipboard

paddleOCR 推理耗时问题

Open ybshaw opened this issue 2 years ago • 8 comments

python调用PaddleOCR(version=2.5.0.3)时,发现图片耗时很长,本地单机测试基本都在2s以上(图片很小,都是只有100K左右,文字也不多),看了相关Issue的回答说只有第一张图片才会耗时,但是我在本地和包装成接口服务之后发现每一张图片的时间都很长,并没有出现说除了第一张后面的时间很短的情况;经过排查发现时间大部分都耗在了加载模型阶段,真正ocr识别的时间只有400ms左右(开启了mkldnn=True);想问下这种情况怎么解决呢,有没有办法一次性加载模型到内存,而不是每次都要初始化一遍模型。 以下是我的实验代码和结果以及本地电脑的配置:

电脑配置信息

ocr时间测试 OCR时间测试结果

ybshaw avatar Oct 16 '22 03:10 ybshaw

请各位大佬帮忙看看这种问题怎么解决呢,每次都要加载模型一遍到内存,包装成http服务(采用Flask框架)也是一样,时间都耗在模型初始化上了

ybshaw avatar Oct 16 '22 03:10 ybshaw

我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。

thsno02 avatar Oct 17 '22 01:10 thsno02

这是个人写法问题,模型加载一次就行了,模型加载到内存中,第二次从内存中取

BeyondYourself avatar Oct 17 '22 02:10 BeyondYourself

这是个人写法问题,模型加载一次就行了,模型加载到内存中,第二次

想问下这种写法哪里有问题呢,应该怎样改呀,基本是看着官网教程写的,不是很明白要怎样改

ybshaw avatar Oct 17 '22 02:10 ybshaw

我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。

代码就是上面的那几行,逻辑问题感觉不太应该有错误的,单例模式貌似是一个不错的方案,稍后尝试下,感谢

ybshaw avatar Oct 17 '22 02:10 ybshaw

我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。

代码就是上面的那几行,逻辑问题感觉不太应该有错误的,单例模式貌似是一个不错的方案,稍后尝试下,感谢

你逻辑有问题呢,你把模型加载放里面了,把模型加载放外面,可以当成参数传进去,或者直接调用也行。这样也是一次性的,不会在调用函数的时候每一次都载入模型。

thsno02 avatar Oct 17 '22 02:10 thsno02

我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。

代码就是上面的那几行,逻辑问题感觉不太应该有错误的,单例模式貌似是一个不错的方案,稍后尝试下,感谢

你逻辑有问题呢,你把模型加载放里面了,把模型加载放外面,可以当成参数传进去,或者直接调用也行。这样也是一次性的,不会在调用函数的时候每一次都载入模型。

确实不应该放到方法里面,这样每次调用函数都要加载一遍模型,有点茅塞顿开了,感谢大哥指点

ybshaw avatar Oct 17 '22 02:10 ybshaw

@ybshaw 这个问题解决了吗? 解决后的代码能share出来吗?

jack-gits avatar Nov 15 '22 14:11 jack-gits

就是把加载模型封装到一个函数就行,反正不要写到模型识别的函数中就行,提供个简单的demo吧

def load_ocr_model(model_path):
   model = PaddleOCR(det_model_dir=model_path + '/xxx_det_infer', rec_model_dir=model_path + '/xxx_rec_infer')
   return model

def my_ocr(image_path, ocr_model):
   results = ocr_model.ocr(image_path)
   return results

if __name__ == "__main__":
   image_path = './xxx.png'
   model_path = './xxx'
   ocr_model = load_ocr_model(model_path) # 这样模型就只会加载到内存中一次,不会每次来一张图片都从磁盘读到内存了
   results = my_ocr(image_path, ocr_model)

ybshaw avatar Nov 20 '22 05:11 ybshaw