TensorFlow Object Detection微调模型保存加载方法与异常解决咨询
TensorFlow 目标检测微调模型的保存与加载常见问题
两类高频异常表现
- 仅通过训练阶段的Checkpoint管理器保存权重,本地加载模型后检测置信度极低,无法输出有效检测结果
- 直接调用
tf.saved_model.save保存检测模型,加载后运行推理代码抛出TypeError: '_UserObject' object is not callable错误
异常根因
- 保存阶段未同步导出微调后的Pipeline配置,本地恢复时模型无法匹配微调阶段的输入预处理规则、类别定义、检测阈值、检测头结构等核心参数,直接沿用预训练默认配置导致检测效果失效
- Checkpoint绑定的跟踪对象不完整,没有将完整的检测模型作为跟踪主体,部分训练更新的权重未被写入持久化文件
- 直接对目标检测框架内的检测模型对象调用通用
tf.saved_model.save时,没有注册推理函数签名,加载得到的是无推理入口的普通对象,无法直接传入输入张量执行运算
正确的保存操作流程
- 训练结束后首先持久化微调对应的Pipeline配置
这一步是最容易被遗漏的环节,也是导致本地加载后检测失效的核心原因# 基于训练时加载的配置对象生成可序列化的Pipeline proto new_pipeline_proto = config_util.create_pipeline_proto_from_configs(configs) # 存储路径需要在本地恢复模型时统一加载 config_util.save_pipeline_config(new_pipeline_proto, '/content/new_config') - 绑定完整的检测模型对象为Checkpoint跟踪主体,再执行权重保存
# 将完整检测模型绑定到Checkpoint,确保所有训练更新的参数都被纳入跟踪 exported_ckpt = tf.compat.v2.train.Checkpoint(model=detection_model) ckpt_manager = tf.train.CheckpointManager( exported_ckpt, directory="test_data/checkpoint/", max_to_keep=5) # 训练流程全部结束后执行保存 print('Done fine-tuning!') ckpt_manager.save() print('Checkpoint saved!') - 本地加载的注意事项
- 加载Checkpoint时,必须使用保存阶段导出的Pipeline配置初始化检测模型结构,再将Checkpoint权重加载到模型中,不能直接复用预训练阶段的默认配置
- 如果需要生成可直接调用推理的SavedModel,必须使用框架提供的专用导出工具生成带推理签名的模型,不能直接对训练阶段的模型对象调用通用保存接口
内容的提问来源于stack exchange,提问作者COROSCOP
相关产品推荐
相关产品推荐

