如何让来自不同应用的两个TensorFlow模型共享同一会话?
让EAST和Calamari共用同一个TensorFlow会话的方法
嘿,这个问题我之前折腾过类似的场景,确实有些封装好的TensorFlow库不会直接提供设置会话的接口,但还是有几个亲测有效的办法能让两个模型共用同一个会话,下面给你详细说说:
方案一:提前创建全局默认会话
TensorFlow的模型在初始化时会自动绑定当前的默认会话,所以我们可以在初始化EAST和Calamari之前,手动创建一个会话并设置为全局默认,这样两个模型都会复用这个会话资源。
具体代码示例:
import tensorflow as tf # 替换成你的EAST模块导入路径 from east_detector_module import EASTDetector from calamari_ocr.ocr import Predictor # 先配置并创建会话,这里可以根据需求加GPU内存控制等参数 session_config = tf.compat.v1.ConfigProto() session_config.gpu_options.allow_growth = True # 按需分配GPU内存,避免占满显存 # 创建会话并设置为Keras的默认会话(因为EAST是基于Keras实现的) sess = tf.compat.v1.Session(config=session_config) tf.compat.v1.keras.backend.set_session(sess) # 现在再初始化两个模型,它们会自动关联到上面的会话 east_detector = EASTDetector(model_path='east_models/EAST_IC15+13_model.h5') calamari = Predictor(checkpoint='calamari_models/model_00623553.ckpt') # 之后的推理操作都会共用这个会话
方案二:使用上下文管理器临时绑定会话
如果你不想设置全局默认会话,也可以用TensorFlow的上下文管理器,把模型初始化和推理都放在同一个会话上下文中,这样会话会在上下文结束后自动释放资源,非常适合临时场景。
代码示例:
import tensorflow as tf from east_detector_module import EASTDetector from calamari_ocr.ocr import Predictor session_config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions(allow_growth=True)) with tf.compat.v1.Session(config=session_config) as sess: # 绑定Keras到当前会话 tf.compat.v1.keras.backend.set_session(sess) # 在这里初始化两个模型 east_detector = EASTDetector(model_path='east_models/EAST_IC15+13_model.h5') calamari = Predictor(checkpoint='calamari_models/model_00623553.ckpt') # 所有推理操作都放在这个上下文里执行 detected_text_regions = east_detector.detect(your_input_image) ocr_results = calamari.predict(detected_text_regions)
额外注意事项
- 如果你的环境是TensorFlow 2.x,记得用
tf.compat.v1模块来兼容TF1.x的会话机制,因为EAST和Calamari这类老模型大多是基于TF1架构开发的。 - 如果之前已经有默认会话存在,可能会出现冲突,建议在创建新会话前先清理旧会话:
tf.compat.v1.keras.backend.clear_session()。 - 要是Calamari用的是TF2的SavedModel格式,可能需要调整为
tf.keras.backend.get_session()来获取会话,但大部分情况下上面的方案都能正常工作。
内容的提问来源于stack exchange,提问作者irohamca
相关产品推荐
相关产品推荐

