Tensorflow对象检测API:从检查点恢复模型变量进行推理时,推理性能较差 描述错误

Tensorflow对象检测API:从检查点恢复模型变量进行推理时,推理性能较差 描述错误,tensorflow,machine-learning,keras,deep-learning,Tensorflow,Machine Learning,Keras,Deep Learning,从检查点恢复模型变量进行推理时,推理性能较差 在成功微调鸭子检测模型后,内存模型具有很高的准确性,能够正确预测橡胶鸭子的位置,正如预期的那样 然而,当使用is_training=False重建图,然后从训练中加载最新的检查点时,会导致模型的推理精度非常差。该模型预测每个图像的多个框,具有很高的可信度 使用is_training=True构建图形,并从训练中加载最新的检查点文件,可以使模型具有良好的推理性能。 预期行为 从保存的检查点重新加载进行推理时,推理性能几乎相同 复制步骤 使用这些模型

从检查点恢复模型变量进行推理时,推理性能较差

在成功微调鸭子检测模型后,内存模型具有很高的准确性,能够正确预测橡胶鸭子的位置,正如预期的那样

然而,当使用is_training=False重建图,然后从训练中加载最新的检查点时,会导致模型的推理精度非常差。该模型预测每个图像的多个框,具有很高的可信度

使用is_training=True构建图形,并从训练中加载最新的检查点文件,可以使模型具有良好的推理性能。

预期行为 从保存的检查点重新加载进行推理时,推理性能几乎相同

复制步骤 使用这些模型 或 models/research/object_detection/configs/tf2/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.config 模仿

复制行为的步骤。 我已经重新创建了一个最小的示例GoogleColab笔记本(稍微改编自微调示例),它重新创建了不正确的行为

我还附上了一个Jupyter笔记本,并在文件底部添加了从笔记本中提取的代码

附加上下文 这种行为并不总是发生,当加载检查点时,模型似乎具有相同的推理性能,这种情况很少发生。这是非常罕见的,没有明显的原因

使用SavedModel格式时也会出现相同的行为:在训练后对内存中的模型进行良好的推理,在使用SavedModel格式保存和加载模型后,推理非常差

我使用这个Tensorflow安装还训练了一个不使用TF Obj Det API的模型,并按照预期保存和恢复检查点

这种行为似乎也发生在TF2.3.1中

我们比较了加载模型中的所有变量,所有变量似乎都加载正确。没有未使用的检查点值,并且这些值看起来是正确的

它似乎可能与BatchNormalization层有关

系统信息 两个平台:Windows和Google Colab

Windows 10企业版:
  • 版本20H2(操作系统构建19042.928)-64Gb RAM

  • NVidia RTX2080Ti-11Gb VRAM-最新NVidia驱动程序

  • Python版本3.7.8-64位

  • Tensorflow版本:git_版本=v2.4.0-49-g85c8b2a817f,版本=2.4.1从PyPi安装(按照此处的说明安装)

  • CUDA版本:11.0

  • cuDNN版本8.0.4

谷歌Colab:
  • 带有GPU的默认(免费)Google Colab环境
来自谷歌Colab笔记本的代码
#-*-编码:utf-8-*-
“交互式的最少示例\u急切的\u少量的\u射击\u od\u培训\u colab.ipynb
由Colaboratory自动生成。
原始文件位于
https://colab.research.google.com/drive/1yzRXF7-ymHDhJrXHNutaY8QW3C1imXTZ
#焦距少镜头目标检测Colab
欢迎使用急切的少镜头对象检测Colab——在这个Colab中,我们在从预先训练的COCO检查点初始化后,在一个新类的极少数示例上演示了(TF2友好的)RetinaNet体系结构的微调。
训练以渴望的方式进行。
通过此colab(使用GPU)的预计时间:<5分钟。
##进口
"""
导入操作系统
导入路径库
#克隆tensorflow模型存储库(如果该存储库尚不存在)
如果pathlib.Path.cwd()中的“models”,则部分:
而pathlib.Path.cwd()中的“模型”部分:
os.chdir(“..”)
elif not pathlib.Path('models')。exists():
!git克隆--深度1https://github.com/tensorflow/models
#注释掉了iPythonMagic以确保Python兼容性。
##安装对象检测API
#%%bash
#cd模型/研究/
#protoc object_detection/protos/*.proto--python_out=。
#cp object_detection/packages/tf2/setup.py。
#python-mpip安装。
#注释掉了iPythonMagic以确保Python兼容性。
导入matplotlib
将matplotlib.pyplot作为plt导入
导入操作系统
随机输入
输入io
导入图像
导入glob
导入scipy.misc
将numpy作为np导入
从六个进口字节
从PIL导入图像、ImageDraw、ImageFont
从IPython.display导入显示,Javascript
从IPython.com将导入图像显示为IPyImage
导入tensorflow作为tf
从object\u detection.utils导入标签\u映射\u util
从object_detection.utils导入配置_util
从object_detection.utils导入可视化_utils作为viz_utils
从object_detection.utils导入colab_utils
从object_detection.builders导入模型_builder
#%matplotlib内联
“#实用程序”
def将图像加载到数组(路径):
“”“将图像从文件加载到numpy数组中。”。
将图像放入numpy数组,以馈送到tensorflow图中。
注意,按照惯例,我们将其放入一个具有形状的numpy数组中
(高度、宽度、通道),其中RGB通道=3。
Args:
路径:文件路径。
返回:
带形状的uint8 numpy阵列(img_高度、img_宽度、3)
"""
img_data=tf.io.gfile.gfile(路径'rb').read()
image=image.open(字节数(img_数据))
(im_宽度,im_高度)=image.size
返回np.array(image.getdata())。重塑(
(im_高度,im_宽度,3)).aType(np.uint8)
def绘图检测(图像),
盒,
班级,
分数,
类别索引,
figsize=(12,16),
图像(名称=无):
“”“包装器函数以可视化检测。”。
Args:
图像\u np:uint8带形状的numpy数组(img\u高度,img\u宽度,3)
长方体:形状为[N,4]的numpy数组
类:形状为[N]的numpy数组。请注意,类索引是基于1的,
并匹配标签映射中的关键点。
分数:形状[N]或无的numpy数组。如果分数=无,则
此函数假定框t