Firmas comunes para imágenes

Esta página describe las firmas comunes que deben ser implementadas por módulos en el formato TF1 Hub para tareas relacionadas con imágenes. (Para el formato TF2 SavedModel , consulte la API de SavedModel análoga).

Algunos módulos se pueden usar para más de una tarea (por ejemplo, los módulos de clasificación de imágenes tienden a realizar alguna extracción de características en el camino). Por lo tanto, cada módulo proporciona (1) firmas con nombre para todas las tareas previstas por el editor y (2) una output = m(images) firma predeterminada output = m(images) para su tarea principal designada.

Vector de características de imagen

Resumen de uso

Un vector de características de imagen es un tensor 1-D denso que representa una imagen completa, generalmente para la clasificación del modelo de consumidor. (A diferencia de las activaciones intermedias de las CNN, no ofrece un desglose espacial. A diferencia de la clasificación de imágenes , descarta la clasificación aprendida por el modelo del editor).

Un módulo para la extracción de características de imágenes tiene una firma predeterminada que asigna un lote de imágenes a un lote de vectores de características. Se puede usar así:

  module_spec = hub.load_module_spec("path/to/module")
  height, width = hub.get_expected_image_size(module_spec)
  images = ...  # A batch of images with shape [batch_size, height, width, 3].
  module = hub.Module(module_spec)
  features = module(images)   # A batch with shape [batch_size, num_features].

También define la firma con nombre correspondiente.

Especificación de firma

La firma nombrada para extraer vectores de características de imagen se invoca como

  outputs = module(dict(images=images), signature="image_feature_vector",
                   as_dict=True)
  features = outputs["default"]

La entrada sigue la convención general para la entrada de imágenes .

El diccionario de salidas contiene una salida "default" de dtype float32 y shape [batch_size, num_features] . El batch_size es el mismo que en la entrada, pero no se conoce en el momento de la construcción del gráfico. num_features es una constante conocida específica del módulo independiente del tamaño de entrada.

Estos vectores de características están destinados a ser utilizables para la clasificación con un clasificador de retroalimentación simple (como las características agrupadas de la capa convolucional superior en una CNN típica para la clasificación de imágenes).

Aplicar la deserción a las características de salida (o no) debe dejarse en manos del consumidor del módulo. El módulo en sí no debería realizar la deserción en las salidas reales (incluso si utiliza la deserción internamente en otros lugares).

El diccionario de salidas puede proporcionar salidas adicionales, por ejemplo, las activaciones de capas ocultas dentro del módulo. Sus claves y valores dependen del módulo. Se recomienda prefijar las claves dependientes de la arquitectura con un nombre de arquitectura (por ejemplo, para evitar confundir la capa intermedia "InceptionV3/Mixed_5c" con la capa convolucional superior "InceptionV2/Mixed_5c" ).

Clasificación de imágenes

Resumen de uso

La clasificación de imágenes asigna los píxeles de una imagen a puntuaciones lineales (logits) para pertenecer a las clases de una taxonomía seleccionada por el editor del módulo . Esto permite a los consumidores sacar conclusiones de la clasificación particular aprendida por el módulo del editor, y no solo de sus características subyacentes (cf. Vector de características de imagen ).

Un módulo para la extracción de características de imágenes tiene una firma predeterminada que asigna un lote de imágenes a un lote de logits. Se puede usar así:

  module_spec = hub.load_module_spec("path/to/module")
  height, width = hub.get_expected_image_size(module_spec)
  images = ...  # A batch of images with shape [batch_size, height, width, 3].
  module = hub.Module(module_spec)
  logits = module(images)   # A batch with shape [batch_size, num_classes].

También define la firma con nombre correspondiente.

Especificación de firma

La firma nombrada para extraer vectores de características de imagen se invoca como

  outputs = module(dict(images=images), signature="image_classification",
                   as_dict=True)
  logits = outputs["default"]

La entrada sigue la convención general para la entrada de imágenes .

El diccionario de salidas contiene una salida "default" de dtype float32 y shape [batch_size, num_classes] . El batch_size es el mismo que en la entrada, pero no se conoce en el momento de la construcción del gráfico. num_classes es el número de clases en la clasificación, que es una constante conocida independiente del tamaño de entrada.

Al evaluar los outputs["default"][i, c] obtiene una puntuación que predice la pertenencia del ejemplo i en la clase con índice c .

Depende de la clasificación subyacente si estas puntuaciones están destinadas a usarse con softmax (para clases mutuamente excluyentes), sigmoide (para clases ortogonales) u otra cosa. La documentación del módulo debe describir esto y hacer referencia a una definición de los índices de clase.

El diccionario de salidas puede proporcionar salidas adicionales, por ejemplo, las activaciones de capas ocultas dentro del módulo. Sus claves y valores dependen del módulo. Se recomienda prefijar las claves dependientes de la arquitectura con un nombre de arquitectura (por ejemplo, para evitar confundir la capa intermedia "InceptionV3/Mixed_5c" con la capa convolucional superior "InceptionV2/Mixed_5c" ).

Entrada de imagen

Esto es común a todos los tipos de módulos de imagen y firmas de imágenes.

Una firma que toma un lote de imágenes como entrada las acepta como un tensor 4-D denso de dtype float32 y shape [batch_size, height, width, 3] cuyos elementos son valores de color RGB de píxeles normalizados al rango [0, 1] . Esto es lo que obtiene de tf.image.decode_*() seguido de tf.image.convert_image_dtype(..., tf.float32) .

Un módulo con exactamente una (o una principal) entrada de imágenes usa el nombre "images" para esta entrada.

El módulo acepta cualquier batch_size y, en batch_size , establece la primera dimensión de TensorInfo.tensor_shape en "desconocido". La última dimensión se fija al número 3 de canales RGB. Las dimensiones de height y width se fijan al tamaño esperado de las imágenes de entrada. (El trabajo futuro puede eliminar esa restricción para módulos totalmente convolucionales).

Los consumidores del módulo no deben inspeccionar la forma directamente, sino obtener la información de tamaño llamando a hub.get_expected_image_size () en el módulo o la especificación del módulo, y se espera que cambien el tamaño de las imágenes de entrada en consecuencia (generalmente antes / durante el procesamiento por lotes).

Para simplificar, los módulos TF-Hub usan el diseño de channels_last (o NHWC ) de Tensors, y dejan que el optimizador de gráficos de TensorFlow NCHW a escribir en channels_first (o NCHW ) si es necesario. Lo ha estado haciendo de forma predeterminada desde la versión 1.7 de TensorFlow.