如何在 Estimator 管道中使用 Tensorflow Model Zoo 冻结图?

数据挖掘 张量流 物体检测 管道
2022-02-16 19:59:19

正如 Tensorflow* 在其网站上所说,Estimators API通常应该使大多数 ML 任务更加友好。过去我一直使用 Tensorflow 的Model Zoo进行对象检测,因为我没有(现在仍然没有)拥有从头开始完全训练模型的硬件。

最近,我处理的图像越来越多,在训练(微调)期间动态提供数据的需求变得很重要。我当前的设置本质上是train.py用于训练的遗留脚本和feed_dict用于推理的方法。

我已经阅读了很多关于Estimators API及其常用管道的内容,但我只是找不到关于如何使用预训练模型的教程或帮助,就像我在该管道中所拥有的那样;所有示例都适用于图像分类,并且没有混合数据集创建和模型训练,这是一个真正的难题。

*张量流 r1.14


第 1 步:数据集创建

因此,鉴于我的数据格式如下:

data = [ 
  [img_path_1, boxes_1],
  [img_path_2, boxes_2],
  ...,
  [img_path_N, boxes_N]
]

每个boxes_i格式的格式:

[
  [label_A, xa, ya, xb, xb],
  [label_B, xa, ya, xb, xb],
  [label_A, xa, ya, xb, xb],
  ...,
  [label_D, xa, ya, xb, xb],
]

根据一些教程并针对对象检测而不是分类进行了调整,似乎我需要像这样处理图像(为简单起见,省略了进一步的预处理和批处理功能):

dataset = tf.data.Dataset.from_tensor_slices(data)

def load_image_and_annotations(path_and_boxes):
    path, boxes = path_and_boxes
    image_string = tf.read_file(path)

    image = tf.image.decode_jpeg(image_string, channels=3)
    image = tf.image.convert_image_dtype(image, tf.float32)
    return (image, boxes)

dataset = dataset.map(load_image_and_annotations, num_parallel_calls=...)

然后根据需要使用tf.data.Iterator对象遍历数据集。

第 2 步:培训

这主要是我不确定如何进行的地方。预制估算器定义估算器教程似乎不适合我的任务,因为我已经有一个冻结模型,我希望将其转换为估算器(而不是完全构建一个)。


我应该如何从旧设置过渡到这个新管道?

1个回答

经过大量研究,我得出结论,这是可行的,但需要大量工作。

本质上,实现这种转换的步骤如下:

  1. 使用此版本的模型导出器(或任何其他解决方案)重新导出已保存模型及其变量(默认情况下,Model Zoo 不提供变量,仅提供推理就绪模型)。

  2. 使用 SavedModel API 加载模型,即loaded = tf.saved_model.load(...).

  3. 提取推理函数:inference_func = loaded.signatures['serving_default'].
  4. 定义你的损失函数。这部分是最复杂的,因为现有函数是对象检测 API 的一部分,它已经过时了。Tensorflow 已经在致力于 API 的升级,但在撰写本文时,他们仍预计需要几个月的时间才能完成。
  5. 设置您的数据集。
  6. 训练你的模型。

最好的选择可能是等待官方 OD API 的新版本。