Domanda

Sono sicuro che molte persone hanno già visto dimostrazioni sull'uso di algoritmi genetici per generare un'immagine che corrisponda a un'immagine campione. Si inizia con il rumore e gradualmente si assomiglia sempre più all'immagine di destinazione, fino a quando si ottiene un duplicato più o meno esatto.

Tutti gli esempi che ho visto, tuttavia, usano un confronto pixel per pixel abbastanza semplice, risultante in una 'dissolvenza' abbastanza prevedibile dell'immagine finale. Quello che sto cercando è qualcosa di più nuovo: una misura di fitness che si avvicini a ciò che consideriamo "simile" all'approccio ingenuo.

Non ho in mente un risultato specifico: sto solo cercando qualcosa di più "interessante" rispetto al valore predefinito. Suggerimenti?

È stato utile?

Soluzione

Presumo che tu stia parlando di qualcosa come Programma di Roger Alsing .

Ho implementato una versione di questo, quindi sono anche interessato a funzioni di fitness alternative, anche se ci sto arrivando dal punto di vista del miglioramento delle prestazioni piuttosto che dell'estetica. Mi aspetto che ci sarà sempre qualche elemento di "dissolvenza in entrata" a causa della natura del processo evolutivo (sebbene modificare gli operatori evolutivi possa influenzare il modo in cui ciò appare).

Un confronto pixel per pixel può essere costoso per tutto tranne che per piccole immagini. Ad esempio, l'immagine di 200x200 pixel che uso ha 40.000 pixel. Con tre valori per pixel (R, G e B), sono 120.000 i valori che devono essere incorporati nel calcolo fitness per una singola immagine. Nella mia implementazione ridimensiono l'immagine prima di fare il confronto in modo che ci siano meno pixel. Il compromesso è una precisione leggermente ridotta dell'immagine evoluta.

Nell'investigare funzioni di fitness alternative mi sono imbattuto in alcuni suggerimenti per utilizzare invece lo spazio colore YUV di RGB poiché questo è più strettamente allineato con la percezione umana.

Un'altra idea che ho avuto è stata quella di confrontare solo un campione di pixel selezionato casualmente. Non sono sicuro di come funzionerebbe senza provarlo. Poiché i pixel confrontati sarebbero diversi per ciascuna valutazione, avrebbe l'effetto di mantenere la diversità all'interno della popolazione.

Oltre a ciò, sei nel regno della visione artificiale. Mi aspetto che queste tecniche, che si basano sull'estrazione delle caratteristiche, sarebbero più costose per immagine, ma potrebbero essere più veloci nel complesso se risultassero necessarie meno generazioni per ottenere un risultato accettabile. Potresti voler esaminare la libreria PerceptualDiff . Inoltre, questa pagina mostra alcuni Java codice che può essere utilizzato per confrontare le immagini per somiglianza in base alle funzionalità anziché ai pixel.

Altri suggerimenti

  

Una misura di fitness che si avvicina a ciò che consideriamo "simile" all'approccio ingenuo.

L'implementazione di tale misura nel software è sicuramente non banale. "Modello di visione umana" di Google, "metrica di errore percettivo" per alcuni punti di partenza. Puoi eludere il problema: basta presentare le immagini candidate a un essere umano per selezionare le migliori, anche se potrebbe essere un po 'noioso per l'essere umano.

Non ho visto una demo del genere (forse potresti collegarne una). Ma un paio di proto-idee dalla tua descrizione che potrebbero innescare una interessante:

  • Tre diversi algoritmi in esecuzione in parallelo, forse RGB o HSV.
  • Sposta, ruota o modifica leggermente l'immagine di destinazione durante la corsa.
  • Idoneità basata sulle differenze di contrasto / valore tra i pixel, ma senza conoscere il colore effettivo.
  • ... quindi " prime " un singolo pixel con il colore corretto?

Concordo con gli altri partecipanti sul fatto che ciò non è banale. Aggiungo anche che sarebbe molto prezioso commercialmente - ad esempio, le aziende che desiderano proteggere il proprio IP visivo sarebbero estremamente felici di essere in grado di navigare su Internet alla ricerca di immagini simili ai loro loghi.

Il mio approccio ingenuo a questo sarebbe quello di addestrare un riconoscitore di schemi su un numero di immagini, ciascuna generata dall'immagine di destinazione con una o più trasformazioni applicate ad essa: ad es. ruotato di qualche grado in entrambi i modi; una traduzione di qualche pixel in entrambi i modi; scale diverse della stessa immagine; varie sfocature ed effetti (le maschere di convoluzione sono buone qui). Aggiungerei anche un po 'di rumore di casualità a ciascuna delle immagini. Più campioni meglio è

L'allenamento può essere svolto off-line, quindi non dovrebbe causare problemi con le prestazioni di runtime.

Dopo aver addestrato un riconoscitore di schemi, puoi indicarlo sulle immagini della popolazione GA e ottenere un punteggio scalare dai riconoscitori.

Personalmente, mi piace Radial Basis Networks . Veloce da allenare. Comincerei con troppi input e li analizzerei con l'analisi dei componenti principali (IIRC). I risultati potrebbero essere solo una misura di similiarità e di dissomiglianza.

Un'ultima cosa; qualunque sia il tuo approccio, potresti scriverne un blog, pubblicare la demo, qualunque cosa; facci sapere come sei andato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top