PaddleOCR
PaddleOCR copied to clipboard
paddleOCR 推理耗时问题
python调用PaddleOCR(version=2.5.0.3
)时,发现图片耗时很长,本地单机测试基本都在2s以上(图片很小,都是只有100K左右,文字也不多),看了相关Issue的回答说只有第一张图片才会耗时,但是我在本地和包装成接口服务之后发现每一张图片的时间都很长,并没有出现说除了第一张后面的时间很短的情况;经过排查发现时间大部分都耗在了加载模型阶段,真正ocr识别的时间只有400ms左右(开启了mkldnn=True);想问下这种情况怎么解决呢,有没有办法一次性加载模型到内存,而不是每次都要初始化一遍模型。
以下是我的实验代码和结果以及本地电脑的配置:
请各位大佬帮忙看看这种问题怎么解决呢,每次都要加载模型一遍到内存,包装成http服务(采用Flask框架
)也是一样,时间都耗在模型初始化上了
我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。
这是个人写法问题,模型加载一次就行了,模型加载到内存中,第二次从内存中取
这是个人写法问题,模型加载一次就行了,模型加载到内存中,第二次
想问下这种写法哪里有问题呢,应该怎样改呀,基本是看着官网教程写的,不是很明白要怎样改
我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。
代码就是上面的那几行,逻辑问题感觉不太应该有错误的,单例模式貌似是一个不错的方案,稍后尝试下,感谢
我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。
代码就是上面的那几行,逻辑问题感觉不太应该有错误的,单例模式貌似是一个不错的方案,稍后尝试下,感谢
你逻辑有问题呢,你把模型加载放里面了,把模型加载放外面,可以当成参数传进去,或者直接调用也行。这样也是一次性的,不会在调用函数的时候每一次都载入模型。
我不清楚 paddle 里怎么解决的。如果你把模型的类开一个单例模式(singleton)也许就能完美解决这个问题了,但也可能是你逻辑部门有问题,每次都要重新开模型。
代码就是上面的那几行,逻辑问题感觉不太应该有错误的,单例模式貌似是一个不错的方案,稍后尝试下,感谢
你逻辑有问题呢,你把模型加载放里面了,把模型加载放外面,可以当成参数传进去,或者直接调用也行。这样也是一次性的,不会在调用函数的时候每一次都载入模型。
确实不应该放到方法里面,这样每次调用函数都要加载一遍模型,有点茅塞顿开了,感谢大哥指点
@ybshaw 这个问题解决了吗? 解决后的代码能share出来吗?
就是把加载模型封装到一个函数就行,反正不要写到模型识别的函数中就行,提供个简单的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)