Esta página describe firmas comunes que deben implementar los módulos en el formato TF1 Hub para tareas relacionadas con imágenes. (Para el formato TF2 SavedModel , consulte la API SavedModel análoga).
Algunos módulos se pueden utilizar para más de una tarea (por ejemplo, los módulos de clasificación de imágenes tienden a extraer algunas características en el camino). Por lo tanto, cada módulo proporciona (1) firmas con nombre para todas las tareas anticipadas por el editor y (2) una output = m(images)
para su tarea principal designada.
Vector de característica de imagen
Resumen de uso
Un vector de características de imagen es un tensor 1D denso que representa una imagen completa, generalmente para la clasificación según el 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 utilizar 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 nombrada 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).
La aplicación de la exclusión a las funciones de salida (o no) debe dejarse en manos del consumidor del módulo. El módulo en sí no debe realizar la desactivación en las salidas reales (incluso si utiliza la desactivación internamente en otros lugares).
El diccionario de salidas puede proporcionar más salidas, por ejemplo, las activaciones de capas ocultas dentro del módulo. Sus claves y valores dependen del módulo. Se recomienda anteponer 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. Image Feature Vector ).
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 utilizar 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 nombrada 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.
La evaluación de outputs["default"][i, c]
produce una puntuación que predice la pertenencia del ejemplo i
a 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 más salidas, por ejemplo, las activaciones de capas ocultas dentro del módulo. Sus claves y valores dependen del módulo. Se recomienda anteponer 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 imágenes 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 tipo d float32
y forma [batch_size, height, width, 3]
cuyos elementos son valores de color RGB de píxeles normalizados al rango [0, 1] . Esto es lo que obtienes de tf.image.decode_*()
seguido de tf.image.convert_image_dtype(..., tf.float32)
.
Un módulo con exactamente una (o una entrada principal) de imágenes utiliza el nombre "images"
para esta entrada.
El módulo acepta cualquier batch_size
y, en consecuencia, establece la primera dimensión de TensorInfo.tensor_shape en "desconocida". La última dimensión se fija en el número 3
de los canales RGB. Las dimensiones height
y width
se fijan en el 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 del 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 (normalmente antes o durante el procesamiento por lotes).
Para simplificar, los módulos TF-Hub utilizan el diseño de tensores channels_last
(o NHWC
) y dejan que el optimizador de gráficos de TensorFlow lo reescriba en channels_first
(o NCHW
) si es necesario. Lo ha estado haciendo de forma predeterminada desde la versión 1.7 de TensorFlow.