API SavedModel courantes pour les tâches d'image

Cette page décrit comment TF2 SavedModels pour les tâches liées aux images doit implémenter l' API réutilisable SavedModel . (Cela remplace les signatures communes pour les images pour le format TF1 Hub , désormais obsolète.)

Vecteur de caractéristiques d'image

Résumé d'utilisation

Un vecteur de caractéristiques d'image est un tenseur 1D dense qui représente une image entière, généralement destiné à être utilisé par un simple classificateur à action directe dans le modèle consommateur. (En termes de CNN classiques, il s'agit de la valeur du goulot d'étranglement après que l'étendue spatiale a été regroupée ou aplatie, mais avant que la classification ne soit effectuée ; pour cela, voir la classification des images ci-dessous.)

Un SavedModel réutilisable pour l’extraction de caractéristiques d’image possède une méthode __call__ sur l’objet racine qui mappe un lot d’images à un lot de vecteurs de caractéristiques. Il peut être utilisé comme ceci :

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
features = obj(images)   # A batch with shape [batch_size, num_features].

En Keras, l'équivalent est

features = hub.KerasLayer("path/to/model")(images)

La saisie suit la convention générale pour la saisie d'images . La documentation du modèle spécifie la plage autorisée pour height et width de l'entrée.

La sortie est un seul tenseur de type float32 et shape [batch_size, num_features] . Le batch_size est le même que dans l'entrée. num_features est une constante spécifique au module, indépendante de la taille de l'entrée.

Détails de l'API

L' API réutilisable SavedModel fournit également une liste de obj.variables (par exemple, pour l'initialisation lorsque le chargement n'est pas précipité).

Un modèle prenant en charge le réglage fin fournit une liste de obj.trainable_variables . Cela peut vous obliger à réussir training=True pour exécuter en mode formation (par exemple, en cas d'abandon). Certains modèles permettent à des arguments facultatifs de remplacer les hyperparamètres (par exemple, le taux d'abandon ; à décrire dans la documentation du modèle). Le modèle peut également fournir une liste de obj.regularization_losses . Pour plus de détails, consultez l' API SavedModel réutilisable .

Dans Keras, cela est pris en charge par hub.KerasLayer : initialisez-le avec trainable=True pour permettre le réglage fin, et (dans les rares cas où les remplacements hparam s'appliquent) avec arguments=dict(some_hparam=some_value, ...)) .

Remarques

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

Exemples

Les modèles sauvegardés réutilisables pour les vecteurs de caractéristiques d'image sont utilisés dans

Classement des images

Résumé d'utilisation

La classification d'images mappe les pixels d'une image à des scores linéaires (logits) pour l'appartenance aux classes d'une taxonomie sélectionnée par l'éditeur du module . Cela permet aux consommateurs de modèles de tirer des conclusions de la classification particulière apprise par le module éditeur. (Pour la classification d'images avec un nouvel ensemble de classes, il est courant de réutiliser un modèle de vecteur de caractéristiques d'image avec un nouveau classificateur.)

Un SavedModel réutilisable pour la classification d'images possède une méthode __call__ sur l'objet racine qui mappe un lot d'images à un lot de logits. Il peut être utilisé comme ceci :

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
logits = obj(images)   # A batch with shape [batch_size, num_classes].

En Keras, l'équivalent est

logits = hub.KerasLayer("path/to/model")(images)

La saisie suit la convention générale pour la saisie d'images . La documentation du modèle spécifie la plage autorisée pour height et width de l'entrée.

Les logits de sortie sont un tenseur unique de type float32 et shape [batch_size, num_classes] . Le batch_size est le même que dans l'entrée. num_classes est le nombre de classes dans la classification, qui est une constante spécifique au modèle.

La valeur logits[i, c] est un score prédisant l'appartenance de l'exemple i à la classe d'index 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 faire référence à une définition des indices de classe.

Détails de l'API

L' API réutilisable SavedModel fournit également une liste de obj.variables (par exemple, pour l'initialisation lorsque le chargement n'est pas précipité).

Un modèle prenant en charge le réglage fin fournit une liste de obj.trainable_variables . Cela peut vous obliger à réussir training=True pour exécuter en mode formation (par exemple, en cas d'abandon). Certains modèles permettent à des arguments facultatifs de remplacer les hyperparamètres (par exemple, le taux d'abandon ; à décrire dans la documentation du modèle). Le modèle peut également fournir une liste de obj.regularization_losses . Pour plus de détails, consultez l' API SavedModel réutilisable .

Dans Keras, cela est pris en charge par hub.KerasLayer : initialisez-le avec trainable=True pour permettre le réglage fin, et (dans les rares cas où les remplacements hparam s'appliquent) avec arguments=dict(some_hparam=some_value, ...)) .

Saisie d'images

Ceci est commun à tous les types de modèles d’images.

Un modèle qui prend un lot d'images en entrée les accepte comme un tenseur 4D dense de type float32 et de forme [batch_size, height, width, 3] dont les éléments sont des valeurs de couleur RVB de pixels normalisés dans la plage [0, 1] . C'est ce que vous obtenez de tf.image.decode_*() suivi de tf.image.convert_image_dtype(..., tf.float32) .

Le modèle accepte n'importe quel batch_size . La documentation du modèle spécifie la plage autorisée pour height et width . La dernière dimension est fixée à 3 canaux RVB.

Il est recommandé aux modèles d'utiliser la channels_last (ou NHWC ) de Tensors partout et de laisser à l'optimiseur de graphique de TensorFlow le soin de réécrire channels_first (ou NCHW ) si nécessaire.