La journée communautaire ML est le 9 novembre ! Rejoignez - nous pour les mises à jour de tensorflow, JAX et plus En savoir plus

Signatures communes pour les images

Cette page décrit les signatures communes qui devraient être mises en œuvre par des modules dans le format de Hub TF1 pour les tâches liées à l' image. (Pour le format de TF2 SavedModel , voir l'analogue API SavedModel .)

Certains modules peuvent être utilisés pour plus d'une tâche (par exemple, les modules de classification d'images ont tendance à extraire des caractéristiques en cours de route). Par conséquent, chaque module fournit (1) signatures nommées pour toutes les tâches prévues par l'éditeur, et (2) une signature par défaut output = m(images) pour sa première tâche désignée.

Vecteur de fonction d'image

Résumé d'utilisation

Une caractéristique de l' image vecteur est un tenseur 1-D dense qui représente une image entière, typiquement pour la classification du modèle de consommation. ( A la différence des activations intermédiaires de CNNs, il ne propose pas une répartition spatiale. Contrairement à la classification d'images , il rejette la classification apprise par le modèle de l' éditeur.)

Un module d'extraction de caractéristiques d'images a une signature par défaut qui mappe un lot d'images à un lot de vecteurs de caractéristiques. Il peut être utilisé comme ceci :

  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].

Il définit également la signature nommée correspondante.

Spécification de signature

La signature nommée pour extraire les vecteurs de caractéristiques d'image est invoquée comme

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

L'entrée suit la convention générale pour l' entrée d'images .

Le dictionnaire des sorties contient un "default" sortie de DTYPE float32 et de la forme [batch_size, num_features] . Le batch_size est le même que dans l'entrée, mais pas connu au moment de la construction graphique. num_features est un connu, indépendant de la constante spécifique au module de taille d' entrée.

Ces vecteurs de caractéristiques sont destinés à être utilisables pour la classification avec un simple classificateur à anticipation (comme les caractéristiques regroupées de la couche convolutive la plus élevée dans un CNN typique pour la classification d'images).

L'application (ou non) de la suppression aux caractéristiques de sortie doit être laissée au consommateur du module. Le module lui-même ne doit pas effectuer de décrochage sur les sorties réelles (même s'il utilise le décrochage en interne à d'autres endroits).

Le dictionnaire de sorties peut fournir d'autres sorties, par exemple, les activations de couches cachées à l'intérieur du module. Leurs clés et valeurs dépendent du module. Il est recommandé de clés dépendant de l' architecture préfixe avec un nom d'architecture (par exemple, pour éviter de confondre la couche intermédiaire "InceptionV3/Mixed_5c" avec la couche supérieure convolutionnel "InceptionV2/Mixed_5c" ).

Classification des images

Résumé d'utilisation

Classement des images cliquables les pixels d'une image aux scores linéaires (logits) pour l' adhésion dans les classes d'une taxonomie choisie par l'éditeur du module. Cela permet aux consommateurs de tirer des conclusions de la classification particulière apprise par le module de l' éditeur, et non seulement ses caractéristiques sous - jacentes (voir l' image de fond Vector ).

Un module d'extraction de caractéristiques d'image a une signature par défaut qui mappe un lot d'images à un lot de logits. Il peut être utilisé comme ceci :

  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].

Il définit également la signature nommée correspondante.

Spécification de signature

La signature nommée pour extraire les vecteurs de caractéristiques d'image est invoquée comme

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

L'entrée suit la convention générale pour l' entrée d'images .

Le dictionnaire des sorties contient un "default" sortie de DTYPE float32 et de la forme [batch_size, num_classes] . Le batch_size est le même que dans l'entrée, mais pas connu au moment de la construction graphique. num_classes est le nombre de classes de la classification, qui est une constante indépendante connue de la taille d'entrée.

L' évaluation des outputs["default"][i, c] donne un score prédire l'adhésion de l' exemple i dans la classe avec l' indice c .

Cela dépend de la classification sous-jacente si ces scores sont destinés à être utilisés avec softmax (pour les classes mutuellement exclusives), sigmoïde (pour les classes orthogonales) ou autre chose. La documentation du module doit décrire cela et se référer à une définition des indices de classe.

Le dictionnaire de sorties peut fournir d'autres sorties, par exemple, les activations de couches cachées à l'intérieur du module. Leurs clés et valeurs dépendent du module. Il est recommandé de clés dépendant de l' architecture préfixe avec un nom d'architecture (par exemple, pour éviter de confondre la couche intermédiaire "InceptionV3/Mixed_5c" avec la couche supérieure convolutionnel "InceptionV2/Mixed_5c" ).

Saisie d'images

Ceci est commun à tous les types de modules d'images et de signatures d'images.

Une signature qui prend un lot d'images en entrée les accepte comme un dense tenseur 4-D de DTYPE float32 et de la forme [batch_size, height, width, 3] dont les éléments sont des valeurs de couleur RVB des pixels normalisées à l'intervalle [0, 1] . Voici ce que vous obtenez de tf.image.decode_*() suivie tf.image.convert_image_dtype(..., tf.float32) .

Un module avec exactement un (ou une principale) entrée d'images utilise le nom de "images" pour cette entrée.

Le module accepte toute batch_size , et définit en conséquence la première dimension de TensorInfo.tensor_shape à « inconnu ». La dernière dimension est fixée sur le numéro 3 de canaux RVB. La height et la width dimensions sont fixées à la taille attendue d'images d'entrée. (Les travaux futurs pourraient supprimer cette restriction pour les modules entièrement convolutifs.)

Les utilisateurs du module ne doivent pas inspecter la forme directement, mais obtenir les informations de taille en appelant hub.get_expected_image_size() sur le module ou la spécification du module, et sont censés redimensionner les images d'entrée en conséquence (généralement avant/pendant le traitement par lots).

Pour simplifier, les modules TF-Hub utilisent channels_last (ou NHWC mise en page) de tenseurs, et laisser l'optimiseur graphique de tensorflow réécrire à channels_first (ou NCHW ) si nécessaire. Il le fait par défaut depuis la version 1.7 de TensorFlow.