come formattare i dati dell'immagine per l'addestramento / previsione quando le immagini sono di dimensioni diverse?


87

Sto cercando di addestrare il mio modello che classifica le immagini. Il problema che ho è che hanno dimensioni diverse. come dovrei formattare le mie immagini / o l'architettura del modello?


2
Mostra cosa hai provato finora e cosa sembra non funzionare per te.
Keith John Hutchison,

16
E bam ci va il codice di Inception v4. Non sono d'accordo con questo commento standard. Un po 'più di input sarebbe bello - come il tipo di rete di cui stiamo parlando - ma i voti negativi non sono affatto giustificati. Questo è un vero problema lì.
sunside

4
La domanda è: come formatta ImageNet i dati delle immagini per essere utili per l'addestramento?
mskw

Risposte:


147

Non hai detto di quale architettura stai parlando. Dato che hai detto di voler classificare le immagini, presumo che sia una rete in parte convoluzionale, in parte completamente connessa come AlexNet, GoogLeNet, ecc. In generale, la risposta alla tua domanda dipende dal tipo di rete con cui stai lavorando.

Se, ad esempio, la tua rete contiene solo unità convoluzionali, vale a dire non contiene livelli completamente connessi, può essere invariante alla dimensione dell'immagine in ingresso. Una tale rete potrebbe elaborare le immagini in ingresso e a sua volta restituire un'altra immagine ("convoluzionale fino in fondo"); dovresti assicurarti che l'output corrisponda a quello che ti aspetti, dal momento che devi determinare la perdita in qualche modo, ovviamente.

Se stai utilizzando unità completamente connesse, però, sei nei guai: qui hai un numero fisso di pesi appresi con cui la tua rete deve lavorare, quindi input variabili richiederebbero un numero variabile di pesi - e questo non è possibile.

Se questo è il tuo problema, ecco alcune cose che puoi fare:

  • Non preoccuparti di schiacciare le immagini. Una rete potrebbe comunque imparare a dare un senso al contenuto; la scala e la prospettiva significano comunque qualcosa per il contenuto?
  • Ritaglia al centro le immagini a una dimensione specifica. Se temi di perdere dati, esegui più ritagli e usali per aumentare i tuoi dati di input, in modo che l'immagine originale venga suddivisa in Nimmagini diverse di dimensioni corrette.
  • Riempi le immagini con un colore a tinta unita in una dimensione quadrata, quindi ridimensiona.
  • Fai una combinazione di quello.

L'opzione di riempimento potrebbe introdurre un'ulteriore fonte di errore nella previsione della rete, poiché la rete potrebbe (leggi: probabilmente lo sarà) essere influenzata dalle immagini che contengono un bordo così imbottito. Se hai bisogno di qualche idea, dai un'occhiata alla sezione Immagini della documentazione di TensorFlow, ci sono pezzi del genere resize_image_with_crop_or_padche portano via il lavoro più grande.

Per quanto riguarda il non preoccuparsi dello schiacciamento, ecco un pezzo della pipeline di pre-elaborazione della famosa rete Inception:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Ne sono totalmente consapevoli e lo fanno comunque.

A seconda di quanto lontano vuoi o devi andare, in realtà c'è un documento qui chiamato Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognition che gestisce input di dimensioni arbitrarie elaborandoli in un modo molto speciale.


11
Questo argomento sembra molto più complicato quando si ha a che fare con il rilevamento di oggetti e la segmentazione delle istanze, perché le dimensioni della scatola di ancoraggio che sono anche iperparametri devono essere regolate se si dispone di un set di dati con un'elevata varianza nelle dimensioni dell'immagine.
CMCDragonkai

Le proporzioni svolgono un ruolo piuttosto importante per una rete che consiste nel distinguere tra cerchi ed ellissi.
Ciao Arrivederci

1
Un'altra osservazione generale è che i lotti non devono necessariamente avere le stesse dimensioni; il primo lotto potrebbe trattare con immagini 4: 3, il secondo con 16: 9 ecc., purché gli strati densi siano presi in considerazione.
sunside

1
@Tobitor, rendi sempre gli input della rete il più vicino possibile ai dati effettivi (di test o tempo di inferenza). Se tutte le tue immagini stanno andando molto più larghe che alte, dovresti anche modellare la tua rete per elaborare le tue immagini in questo modo. Detto questo, se non puoi dire come appariranno i tuoi dati di "utilizzo", devi fare alcuni sacrifici durante l'allenamento. E in quel caso, ridimensionare un'immagine da 1000x200 a 256x256 va generalmente bene (immagina di guardare quella targa con un angolo di 60 gradi: ora è molto approssimativamente quadrata).
sunside

2
@Tobitor Non è affatto necessario che le immagini siano quadrate, è solo il compromesso meno negativo se non si conoscono le dimensioni effettive dell'immagine durante l'inferenza. : ^) Per quanto riguarda le dimensioni, più piccole sono, meglio è, ma le immagini devono essere abbastanza grandi da catturare comunque i minimi dettagli richiesti - in generale, tieni presente che se tu, come esperto umano, non puoi determinare cosa c'è nel immagine, anche la rete non sarà in grado.
sunside

11

Prova a creare uno strato di raggruppamento piramidale spaziale. Quindi inseriscilo dopo il tuo ultimo livello di convoluzione in modo che i livelli FC ottengano sempre vettori dimensionali costanti come input. Durante l'addestramento, addestrare le immagini dall'intero set di dati utilizzando una particolare dimensione dell'immagine per un'epoca. Quindi, per l'epoca successiva, passare a una dimensione dell'immagine diversa e continuare l'allenamento.


Potresti approfondire un po 'cosa si intende per "pooling piramidale spaziale" rispetto al pooling normale?
Matthieu

si prega di leggere Raggruppamento piramidale spaziale in reti convoluzionali profonde per il riconoscimento visivo in blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.