Questa pagina descrive le firme comuni che dovrebbero essere implementate dai moduli nel formato TF1 Hub per le attività relative alle immagini. (Per il formato TF2 SavedModel , vedere l'analoga API SavedModel .)
Alcuni moduli possono essere utilizzati per più di un compito (ad esempio, i moduli di classificazione delle immagini tendono a eseguire alcune estrazioni di funzionalità durante il processo). Pertanto, ciascun modulo fornisce (1) firme denominate per tutte le attività previste dall'editore e (2) un output = m(images)
per l'attività primaria designata.
Vettore delle caratteristiche dell'immagine
Riepilogo dell'utilizzo
Un vettore di caratteristiche dell'immagine è un tensore 1D denso che rappresenta un'immagine intera, tipicamente per la classificazione in base al modello di consumo. (A differenza delle attivazioni intermedie delle CNN, non offre una scomposizione spaziale. A differenza della classificazione delle immagini , scarta la classificazione appresa dal modello dell'editore.)
Un modulo per l'estrazione delle caratteristiche dell'immagine ha una firma predefinita che associa un batch di immagini a un batch di vettori di caratteristiche. Può essere usato in questo modo:
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].
Definisce inoltre la firma con nome corrispondente.
Specificazione della firma
La firma denominata per l'estrazione dei vettori delle caratteristiche dell'immagine viene richiamata come
outputs = module(dict(images=images), signature="image_feature_vector",
as_dict=True)
features = outputs["default"]
L'input segue la convenzione generale per l'input delle immagini .
Il dizionario degli output contiene un output "default"
di dtype float32
e shape [batch_size, num_features]
. Il batch_size
è lo stesso dell'input, ma non è noto al momento della costruzione del grafico. num_features
è una costante nota, specifica del modulo, indipendente dalla dimensione dell'input.
Questi vettori di caratteristiche sono pensati per essere utilizzabili per la classificazione con un semplice classificatore feed-forward (come le caratteristiche raggruppate dallo strato convoluzionale più alto in una tipica CNN per la classificazione delle immagini).
L'applicazione (o meno) dell'esclusione alle funzionalità di output deve essere lasciata al consumatore del modulo. Il modulo stesso non dovrebbe eseguire la caduta sulle uscite effettive (anche se utilizza la caduta internamente in altri posti).
Il dizionario degli output può fornire ulteriori output, ad esempio, l'attivazione di layer nascosti all'interno del modulo. Le loro chiavi e valori dipendono dal modulo. Si consiglia di anteporre alle chiavi dipendenti dall'architettura un nome di architettura (ad esempio, per evitare di confondere lo strato intermedio "InceptionV3/Mixed_5c"
con lo strato convoluzionale più alto "InceptionV2/Mixed_5c"
).
Classificazione delle immagini
Riepilogo dell'utilizzo
La classificazione delle immagini associa i pixel di un'immagine a punteggi lineari (logit) per l'appartenenza alle classi di una tassonomia selezionate dall'editore del modulo . Ciò consente ai consumatori di trarre conclusioni dalla particolare classificazione appresa dal modulo editore e non solo dalle sue caratteristiche sottostanti (cfr. Image Feature Vector ).
Un modulo per l'estrazione delle caratteristiche dell'immagine ha una firma predefinita che associa un batch di immagini a un batch di logit. Può essere usato in questo modo:
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].
Definisce inoltre la firma con nome corrispondente.
Specificazione della firma
La firma denominata per l'estrazione dei vettori delle caratteristiche dell'immagine viene richiamata come
outputs = module(dict(images=images), signature="image_classification",
as_dict=True)
logits = outputs["default"]
L'input segue la convenzione generale per l'input delle immagini .
Il dizionario degli output contiene un output "default"
di dtype float32
e shape [batch_size, num_classes]
. Il batch_size
è lo stesso dell'input, ma non è noto al momento della costruzione del grafico. num_classes
è il numero di classi nella classificazione, che è una costante nota indipendente dalla dimensione dell'input.
La valutazione outputs["default"][i, c]
produce un punteggio che prevede l'appartenenza dell'esempio i
alla classe con indice c
.
Dipende dalla classificazione sottostante se questi punteggi devono essere utilizzati con softmax (per classi mutuamente esclusive), sigmoide (per classi ortogonali) o qualcos'altro. La documentazione del modulo dovrebbe descriverlo e fare riferimento a una definizione degli indici delle classi.
Il dizionario degli output può fornire ulteriori output, ad esempio, l'attivazione di layer nascosti all'interno del modulo. Le loro chiavi e valori dipendono dal modulo. Si consiglia di anteporre alle chiavi dipendenti dall'architettura un nome di architettura (ad esempio, per evitare di confondere lo strato intermedio "InceptionV3/Mixed_5c"
con lo strato convoluzionale più alto "InceptionV2/Mixed_5c"
).
Ingresso immagine
Questo è comune a tutti i tipi di moduli immagine e firme immagine.
Una firma che prende un batch di immagini come input le accetta come un tensore 4-D denso di dtype float32
e forma [batch_size, height, width, 3]
i cui elementi sono valori di colore RGB di pixel normalizzati nell'intervallo [0, 1] . Questo è ciò che ottieni da tf.image.decode_*()
seguito da tf.image.convert_image_dtype(..., tf.float32)
.
Un modulo con esattamente un (o un principale) input di immagini utilizza il nome "images"
per questo input.
Il modulo accetta qualsiasi batch_size
e di conseguenza imposta la prima dimensione di TensorInfo.tensor_shape su "unknown". L'ultima dimensione è fissata al numero 3
dei canali RGB. Le dimensioni height
e width
sono fissate alla dimensione prevista delle immagini di input. (Il lavoro futuro potrebbe rimuovere tale restrizione per i moduli completamente convoluzionali.)
Gli utenti del modulo non devono ispezionare direttamente la forma, ma ottenere le informazioni sulla dimensione chiamando hub.get_expected_image_size() sul modulo o sulle specifiche del modulo e sono tenuti a ridimensionare le immagini di input di conseguenza (in genere prima/durante l'invio in batch).
Per semplicità, i moduli TF-Hub utilizzano il layout channels_last
(o NHWC
) dei tensori e lasciano all'ottimizzatore grafico di TensorFlow il compito di riscrivere channels_first
(o NCHW
) se necessario. Lo fa per impostazione predefinita dalla versione 1.7 di TensorFlow.