È possibile fornire immagini di dimensioni variabili come input per una rete neurale convoluzionale?


17

Possiamo fornire immagini di dimensioni variabili come input per una rete neurale convoluzionale per il rilevamento di oggetti? Se possibile, come possiamo farlo?


Ma se proviamo a ritagliare l'immagine, perderemo una parte dell'immagine e se proviamo a ridimensionare, allora la chiarezza dell'immagine andrà persa. Significa che l'uso della proprietà di rete intrinseca è il migliore se la chiarezza dell'immagine è il principale punto di considerazione?

Risposte:


9

Esistono diversi modi per farlo. Molti di questi sono già stati trattati in numerosi post su StackOverflow, Quora e altri siti Web di contenuti.

Riassumendo, la maggior parte delle tecniche elencate possono essere raggruppate in due classi di soluzioni, vale a dire,

  1. trasformazioni
  2. Proprietà di rete inerente

Nelle trasformazioni, si possono cercare tecniche come

  • Ridimensiona , che è la più semplice di tutte le tecniche menzionate
  • Ritaglia , che può essere fatto come una finestra scorrevole o ritaglio una tantum con perdita di informazioni

Si può anche esaminare le reti che hanno proprietà intrinseche di essere immuni alle dimensioni dell'input in virtù del comportamento dei livelli che costruisce la rete. Esempi di questo possono essere trovati in termini di,

  • Reti completamente convoluzionali (FCN) , che non hanno alcuna limitazione sulla dimensione dell'input perché una volta descritte le dimensioni del kernel e del passo, la convoluzione su ogni strato può generare output di dimensione appropriati in base agli input corrispondenti.

  • Spatial Pyramid Pooling (SPP) , gli FCN non hanno uno strato denso completamente collegato e quindi sono agnostici rispetto alla dimensione dell'immagine, ma dicono che se si desidera utilizzare un livello denso senza considerare le trasformazioni di input, allora c'è un documento interessante che spiega lo strato in una rete di apprendimento profondo.

Riferimenti:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS Potrei essermi perso citando alcune tecniche. Non pretendere che questo sia un elenco esaustivo.


1
Questo suona bene in teoria, ma non funziona su Tensorflow. Qualcuno ha qualche implementazione per questo?
Hossein,

1
@Hossein Ho anche incontrato alcuni problemi nell'implementazione pratica, ma ho avuto una CNN di dimensioni variabili che lavora in Tensorflow Keras 2.x oggi con alcune limitazioni. Ho pubblicato una descrizione dell'approccio nella mia risposta per quanto riguarda alcuni dettagli pratici. Buona fortuna!
J Trana,

4

Gli strati convoluzionali e gli stessi pool pool sono indipendenti dalle dimensioni di input. Tuttavia, l'output degli strati convoluzionali avrà dimensioni spaziali diverse per immagini di dimensioni diverse e ciò causerà un problema se in seguito avremo uno strato completamente connesso (poiché il nostro livello completamente connesso richiede un input di dimensioni fisse). Esistono diverse soluzioni a questo:

1. Pool globale: evita i layer completamente collegati alla fine dei layer convoluzionali e utilizza invece il pool (come il pool medio globale) per ridurre le mappe delle caratteristiche da una forma di (N, H, W, C) (prima del pool globale ) per modellare (N, 1,1, C) (dopo il pool globale), dove:

N = Numero di campioni minibatch
H = Altezza spaziale della mappa delle caratteristiche
W = Larghezza spaziale della mappa delle caratteristiche
C = Numero di mappe delle caratteristiche (canali)

As si può vedere, la dimensionalità di output (N * C) è ora indipendente dalla dimensione spaziale (H, W) delle mappe caratteristiche. In caso di classificazione, è quindi possibile procedere con l'uso di un livello completamente collegato in alto per ottenere i log per le classi.

2. Pooling di dimensioni variabili:Utilizzare aree di pool di dimensioni variabili per ottenere le stesse dimensioni della mappa delle caratteristiche per dimensioni di input diverse.

3. Ritaglia / Ridimensiona / Pad immagini di input: puoi provare a ridimensionare / ritagliare / pad le tue immagini di input per avere tutte la stessa forma.


Nel contesto dell'apprendimento del trasferimento, è possibile che si desideri utilizzare input di dimensioni diverse rispetto agli input originali con cui è stato formato il modello. Ecco alcune opzioni per farlo:

4. Crea nuovi livelli completamente connessi: puoi abbandonare completamente i livelli originali completamente collegati e inizializzare un nuovo livello completamente connesso con la dimensionalità di cui hai bisogno e allenarlo da zero.

5. Tratta il livello completamente connesso come una convoluzione: normalmente, rimodelliamo le mappe delle caratteristiche da (N, H, W, C) a (N, H * W * C) prima di inviarlo al livello completamente collegato. Ma puoi anche trattare il livello completamente connesso come una convoluzione con un campo ricettivo di (H, W). Quindi, puoi semplicemente coinvolgere questo kernel con le tue mappe caratteristiche indipendentemente dalle loro dimensioni (usa il riempimento zero se necessario) [http://cs231n.github.io/transfer-learning/ ].


1

Ho dovuto risolvere questo problema oggi, quindi ho pensato di condividere ciò che ho scoperto che ha funzionato. Ho scoperto che sul web c'erano parecchie risposte e notizie "questo potrebbe funzionare in teoria" ma meno da un pratico "ecco come concretamente implementarlo".

Per implementarlo usando Tensorflow Keras, ho dovuto fare quanto segue. Forse qualcun altro può trovare alcuni di questi possono essere modificati, rilassati o eliminati.

  1. Impostare l'input della rete in modo da consentire un input di dimensioni variabili utilizzando "Nessuno" come dimensione segnaposto su input_shape. Vedi la risposta di Francois Chollet qui .
  2. Utilizzare i livelli convoluzionali solo fino a quando non si è verificata un'operazione di raggruppamento globale (ad esempio GlobalMaxPooling2D). Quindi è possibile utilizzare layer densi, ecc. Perché le dimensioni sono ora fisse.
  3. Utilizzare solo una dimensione batch di 1. Ciò evita di gestire formati misti all'interno di un batch.
  4. Scrivi una piccola sequenza personalizzata che crea batch di dimensioni 1 dall'elenco degli input. L'ho fatto per evitare di gestire dimensioni diverse all'interno di un singolo array Numpy.
  5. Usa Model.fit_generator sulla tua sequenza personalizzata per allenamento e validazione. (vs Model.fit)
  6. Per qualche motivo, Model.predict_generator è saltato fuori anche quando si utilizza la sequenza come sopra. Ho dovuto ricorrere all'uso di Model.predict su singoli input.

Si noti che le chiamate a Model.predict si sono lamentate delle prestazioni - il che non sorprende dato l'inefficienza della soluzione - ma funziona!


-2

Sì, è sufficiente selezionare una rete backbone appropriata che non si basa sulla dimensione dell'immagine di input per essere un valore preciso: la maggior parte delle reti soddisfa questi criteri.


3
Non ti sbagli, ma la tua risposta non è molto istruttiva - che ne dici di espanderla per spiegare perché la maggior parte della CNN moderna può lavorare con immagini di dimensioni variabili? Inoltre, quali sono i limiti di questa variabilità (ad esempio, non provare a mescolare immagini di dimensioni diverse nello stesso mini-batch ...)? La maggior parte delle persone provenienti da MLP vecchio stile (la lunghezza di input è fissa) o CNN vecchio stile (AlexNet e VGG-1X), con i loro fastidiosi Flattenlivelli, non capiscono come in linea di principio le moderne CNN possano scattare immagini di qualsiasi dimensione.
DeltaIV
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.