La rete neurale disegna immagini. Ostagram: un servizio basato su rete neurale che combina foto e ornamenti in capolavori artistici

Da agosto 2015, i ricercatori tedeschi dell'Università di Tubinga hanno presentato la loro possibilità di trasferimento di stile artisti famosi su altre foto iniziarono ad apparire servizi che monetizzavano questa opportunità. È stato lanciato sul mercato occidentale e sul mercato russo - la sua copia completa.

Ai segnalibri

Nonostante Ostagram sia stato lanciato a dicembre, ha iniziato a guadagnare rapidamente popolarità sui social network a metà aprile. Allo stesso tempo, al 19 aprile, c'erano meno di mille persone nel progetto su VKontakte.

Per utilizzare il servizio è necessario preparare due immagini: una foto da elaborare e un'immagine con un esempio di stile da sovrapporre all'immagine originale.

Il servizio ha una versione gratuita: crea un'immagine con una risoluzione minima fino a 600 pixel lungo il lato più lungo dell'immagine. L'utente riceve il risultato di una sola delle iterazioni dell'applicazione del filtro alla foto.

Esistono due versioni a pagamento: Premium produce un'immagine fino a 700 pixel lungo il lato più lungo e applica all'immagine 600 iterazioni di elaborazione della rete neurale (più iterazioni, più interessante e intensa è l'elaborazione). Una di queste foto costerà 50 rubli.

Nella versione HD, puoi regolare il numero di iterazioni: 100 costeranno 50 rubli e 1000 - 250 rubli. In questo caso l'immagine avrà una risoluzione fino a 1200 pixel sul lato più lungo, e potrà essere utilizzata per la stampa su tela: Ostagram offre questo servizio con consegna a partire da 1800 rubli.

A febbraio, i rappresentanti di Ostagram non accetteranno richieste di elaborazione delle immagini da parte di utenti "da paesi a capitalismo sviluppato", ma accederanno all'elaborazione di foto per gli utenti di VKontakte di tutto il mondo. A giudicare dal codice Ostagram pubblicato su GitHub, è stato sviluppato da Sergey Morugin, un residente di 30 anni di Nizhny Novgorod.

TJ contattato direttore commerciale progetto, introdotto da Andrey. Secondo lui, Ostagram è apparso prima di Instapainting, ma è stato ispirato da un progetto simile chiamato Vipart.

Ostagram è stato sviluppato da un gruppo di studenti dell'NNSTU. Alekseeva: dopo i primi test su un ristretto gruppo di amici alla fine del 2015, hanno deciso di rendere pubblico il progetto. Inizialmente, l'elaborazione delle immagini era completamente gratuita e si prevedeva di guadagnare denaro vendendo dipinti stampati. Secondo Andrey, la stampa si è rivelata il problema più grande: le foto di persone elaborate da una rete neurale raramente sembrano piacevoli all'occhio umano e il cliente finale deve aggiustare il risultato per molto tempo prima di applicarlo alla tela, che richiede molte risorse della macchina.

Per l'elaborazione delle immagini, i creatori di Ostagram volevano utilizzare i server cloud di Amazon, ma dopo l'afflusso di utenti è diventato chiaro che il loro costo avrebbe superato i mille dollari al giorno con un ritorno sull'investimento minimo. Andrey, che è anche un investitore nel progetto, ha affittato strutture server a Nizhny Novgorod.

Il pubblico del progetto è di circa mille persone al giorno, ma in alcuni giorni ha raggiunto le 40mila persone a causa di transizioni da media stranieri che avevano già notato il progetto prima di quelli nazionali (Ostagram è riuscita anche a collaborare con dj europei). Di notte, quando il traffico è basso, l'elaborazione delle immagini può richiedere 5 minuti e fino a un'ora durante il giorno.

Se prima gli utenti stranieri avevano deliberatamente limitato l'accesso all'elaborazione delle immagini (si pensava di avviare la monetizzazione dalla Russia), ora Ostagram fa già più affidamento su un pubblico occidentale.

Ad oggi, le prospettive di rimborso sono condizionate. Se ogni utente pagasse 10 rubli per l'elaborazione, forse sarebbe ripagato. […]

È molto difficile monetizzare nel nostro Paese: la nostra gente è pronta ad aspettare una settimana, ma non pagherà un centesimo per questo. Gli europei sono più favorevoli a questo - in termini di pagamento per l'accelerazione, miglioramento della qualità - quindi l'orientamento va a quel mercato.

Andrey, rappresentante di Ostagram

Secondo Andrey, il team di Ostagram sta lavorando nuova versione un sito con una forte attenzione alla socialità: “Sembrerà un servizio noto, ma cosa fare”. I rappresentanti di Facebook in Russia si sono già interessati al progetto, ma l'accordo non è ancora arrivato alle trattative sulla vendita.

Esempi di lavoro di servizio

Nel feed del sito di Ostagram si può anche vedere quale combinazione di immagini ha portato agli scatti finali: spesso questo è anche più interessante del risultato stesso. Allo stesso tempo, i filtri - immagini utilizzate come effetto per l'elaborazione - possono essere salvati per un ulteriore utilizzo.

Saluti, Habr! Sicuramente avrai notato che il tema dello styling delle foto per vari stili artistici discusso attivamente in questi tuoi internet. Leggendo tutti questi articoli popolari, potresti pensare che la magia avvenga sotto il cofano di queste applicazioni e che la rete neurale stia davvero fantasticando e ridisegnando l'immagine da zero. È successo che il nostro team si trovasse di fronte a un compito simile: come parte di un hackathon aziendale interno, abbiamo realizzato uno styling video, perché. c'era già un'app per le foto. In questo post, daremo un'occhiata a come la rete "ridisegna" le immagini e guarderemo gli articoli che lo hanno reso possibile. Ti consiglio di familiarizzare con l'ultimo post prima di leggere questo materiale e in generale con le basi delle reti neurali convoluzionali. Troverai alcune formule, alcuni codici (farò esempi su Theano e Lasagne), oltre a molte immagini. Questo post è integrato ordine cronologico aspetto degli articoli e, di conseguenza, delle idee stesse. A volte lo diluirò con la nostra recente esperienza. Ecco un ragazzo dall'inferno per l'attenzione.


Visualizzazione e comprensione delle reti convoluzionali (28 novembre 2013)

Prima di tutto, vale la pena menzionare l'articolo in cui gli autori hanno potuto dimostrare che una rete neurale non è una scatola nera, ma una cosa piuttosto interpretabile (a proposito, oggi si può dire non solo delle reti convoluzionali per computer visione). Gli autori hanno deciso di imparare a interpretare le attivazioni dei neuroni dello strato nascosto, per questo hanno utilizzato la rete neurale deconvoluzionale (deconvnet) proposta diversi anni prima (a proposito, dagli stessi Zeiler e Fergus, che sono gli autori di questa pubblicazione come BENE). Una rete deconvoluzionale è in realtà la stessa rete con convoluzioni e raggruppamenti applicati in ordine inverso. Il lavoro originale su deconvnet utilizzava la rete in una modalità di apprendimento senza supervisione per generare immagini. Questa volta, gli autori l'hanno utilizzato semplicemente per un passaggio inverso dalle caratteristiche ottenute dopo un passaggio in avanti attraverso la rete all'immagine originale. Il risultato è un'immagine che può essere interpretata come un segnale che ha causato questa attivazione sui neuroni. Naturalmente, sorge la domanda: come fare un passaggio inverso attraverso la convoluzione e la non linearità? E ancor di più attraverso il max-pooling, questa non è certo un'operazione invertita. Diamo un'occhiata a tutti e tre i componenti.

Reverse ReLu

Nelle reti convoluzionali viene spesso utilizzata la funzione di attivazione ReLu(x) = max(0, x), che rende tutte le attivazioni sul livello non negative. Di conseguenza, quando si ripercorre la non linearità, è necessario ottenere anche risultati non negativi. Per questo, gli autori propongono di utilizzare lo stesso ReLu. Da un punto di vista dell'architettura Theano, è necessario sovrascrivere la funzione gradiente dell'operazione (il taccuino infinitamente prezioso è nelle ricette di lasagne, da lì raccoglierai i dettagli di cosa sia la classe ModifiedBackprop).

Class ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # rettifica esplicitamente return (self.nonlinearità(grd),) # usa la non linearità data

Convoluzione inversa

Qui è un po' più complicato, ma tutto è logico: è sufficiente applicare la versione trasposta dello stesso kernel di convoluzione, ma alle uscite dal ReLu inverso invece del livello precedente utilizzato nel passaggio in avanti. Ma temo che a parole non sia così ovvio, diamo un'occhiata alla visualizzazione di questa procedura (troverete ancora più visualizzazioni di convoluzioni).


Convoluzione quando passo=1

Convoluzione quando passo=1 versione inversa

Convoluzione quando passo=2

Convoluzione quando passo=2 versione inversa

Raggruppamento inverso

Questa operazione (a differenza delle precedenti) generalmente non è reversibile. Ma vorremmo comunque passare attraverso il massimo in qualche modo durante il passaggio inverso. Per fare ciò, gli autori suggeriscono di utilizzare una mappa di dove si trovava il massimo durante il passaggio diretto (max location switch). Durante il passaggio inverso, il segnale di ingresso viene trasformato in unpooling in modo tale da preservare approssimativamente la struttura del segnale originale, è davvero più facile da vedere che descrivere qui.



Risultato

L'algoritmo di visualizzazione è estremamente semplice:

  1. Fai un passaggio dritto.
  2. Seleziona il layer che ci interessa.
  3. Correggi l'attivazione di uno o più neuroni e resetta il resto.
  4. Fai un'inferenza.

Ogni quadrato grigio nell'immagine qui sotto corrisponde a una visualizzazione di un filtro (che viene applicato per la convoluzione) o pesi di un singolo neurone, e ogni immagine a coloriè quella parte dell'immagine originale che attiva il neurone corrispondente. Per chiarezza, i neuroni all'interno di uno strato sono raggruppati in gruppi tematici. In generale, improvvisamente si è scoperto che la rete neurale apprende esattamente ciò di cui Hubel e Weisel hanno scritto nel loro lavoro sulla struttura del sistema visivo, per il quale sono stati premiati premio Nobel nel 1981. Grazie a questo articolo, abbiamo ottenuto una rappresentazione visiva di ciò che una rete neurale convoluzionale apprende a ogni livello. È questa conoscenza che consentirà in seguito di manipolare il contenuto dell'immagine generata, ma questo è ancora lontano, i prossimi anni sono andati a migliorare i metodi di "trapanazione" delle reti neurali. Inoltre, gli autori dell'articolo hanno proposto un modo per analizzare il modo migliore per costruire l'architettura di una rete neurale convoluzionale per raggiungere migliori risultati(tuttavia, non hanno vinto ImageNet 2013, ma sono entrati in cima; UPD: si scopre che hanno vinto, Clarifai è quello che sono).


Visualizzazione delle funzionalità


Ecco un esempio di visualizzazione delle attivazioni tramite deconvnet, oggi questo risultato sembra già così così, ma poi è stata una svolta.


Mappe di salienza utilizzando deconvnet

Deep Inside Convolutional Networks: visualizzazione di modelli di classificazione delle immagini e mappe di salienza (19 aprile 2014)

Questo articolo è dedicato allo studio dei metodi di visualizzazione della conoscenza contenuti in una rete neurale convoluzionale. Gli autori propongono due metodi di visualizzazione basati sulla discesa del gradiente.

Visualizzazione del modello di classe

Quindi, immagina di avere una rete neurale addestrata per risolvere un problema di classificazione in un certo numero di classi. Indichiamo come il valore di attivazione del neurone di output che corrisponde alla classe C. Quindi il seguente problema di ottimizzazione ci fornisce esattamente l'immagine che massimizza la classe selezionata:



Questo compito è facile da risolvere usando Theano. Di solito chiediamo al framework di prendere la derivata dei parametri del modello, ma questa volta assumiamo che i parametri siano fissi e la derivata sia presa dall'immagine di input. La seguente funzione seleziona il valore massimo del livello di output e restituisce una funzione che calcola la derivata rispetto all'immagine di input.


def compile_saliency_function(net): """ Compila una funzione per calcolare le mappe di salienza e le classi previste per un dato minibatch di immagini di input. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministic=True) max_outp = T.max(outp, axis=1) saliency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) return theano.funzione(, )

Probabilmente hai visto strane immagini di cani su Internet - DeepDream. Nell'articolo originale, gli autori usano processo successivo per generare immagini che massimizzino la classe selezionata:

  1. Inizializza l'immagine iniziale con zeri.
  2. Calcola il valore della derivata da questa immagine.
  3. Cambia l'immagine aggiungendo ad essa l'immagine risultante dalla derivata.
  4. Ritorna al passaggio 2 o esci dal ciclo.

Le immagini risultanti sono:




Ma cosa succede se si inizializza la prima immagine con una foto reale e si avvia lo stesso processo? Ma ad ogni iterazione sceglieremo una classe casuale, imposteremo il resto a zero e calcoleremo il valore della derivata, quindi otteniamo un sogno così profondo.


Attenzione 60mb


Perché ci sono così tante facce e occhi di cane? È semplice: ci sono quasi 200 cani nella rete dell'immagine su 1000 classi, hanno gli occhi. E anche molte classi in cui ci sono solo persone.

Estrazione della salienza di classe

Se questo processo viene inizializzato con una foto reale, interrotto dopo la prima iterazione e disegnando il valore della derivata, allora otterremo tale immagine, aggiungendola a quella originale, incrementeremo il valore di attivazione della classe selezionata.


Mappe di salienza che utilizzano la derivata


Ancora una volta, il risultato è "così così". È importante notare che questo nuovo modo visualizzazione delle attivazioni (nulla vieta di fissare i valori delle attivazioni non sull'ultimo layer, ma in generale su qualsiasi layer della rete e di prendere la derivata rispetto all'immagine di input). Il prossimo articolo combinerà entrambi gli approcci precedenti e ci fornirà uno strumento su come impostare il trasferimento di stile, che verrà descritto in seguito.

Alla ricerca della semplicità: The All Convolutional Net (13 aprile 2015)

Questo articolo generalmente non riguarda la visualizzazione, ma il fatto che sostituire il pooling con una convoluzione con un grande passo non porta a una perdita di qualità. Ma come sottoprodotto della loro ricerca, gli autori hanno proposto un nuovo modo di visualizzare le caratteristiche, che hanno applicato per analizzare più accuratamente ciò che il modello apprende. La loro idea è la seguente: se prendiamo semplicemente la derivata, allora quelle caratteristiche che erano meno di zero sull'immagine di input non tornano indietro durante la deconvoluzione (usando ReLu per l'immagine di input). E questo porta al fatto che sull'immagine posteriore propagata compaiono valori negativi. D'altra parte, se usi deconvnet, un altro ReLu viene preso dalla derivata di ReLu - questo ti permette di non saltare indietro valori negativi, ma come hai visto, il risultato è "così così". Ma cosa succede se combiniamo questi due metodi?




class GuidedBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd > 0).astype(dtype),)

Quindi ottieni un'immagine completamente pulita e interpretabile.


Mappe di salienza che utilizzano la retropropagazione guidata

Vai più a fondo

Ora pensiamo, cosa ci dà questo? Permettetemi di ricordarvi che ogni strato convoluzionale è una funzione che riceve un tensore tridimensionale come input e produce anche un tensore tridimensionale come output, magari di dimensione diversa D X w X H; D epth è il numero di neuroni nel livello, ognuno di essi genera una mappa delle caratteristiche con la dimensione w ottava x H otto.


Proviamo il seguente esperimento sulla rete VGG-19:



conv1_2

Sì, non vedi quasi nulla, perché. l'area ricettiva è molto piccola, questa è la seconda convoluzione 3x3, rispettivamente, l'area totale è 5x5. Ma ingrandendo, vediamo che la funzione è solo un rilevatore di gradiente.




conv3_3


conv4_3


conv5_3


piscina5


E ora immagina che invece del massimo sulla lastra, prenderemo la derivata del valore della somma di tutti gli elementi della lastra sull'immagine di input. Quindi ovviamente l'area ricettiva del gruppo di neuroni coprirà l'intera immagine in ingresso. Per i primi strati vedremo mappe luminose, dalle quali deduciamo che si tratta di rilevatori di colore, poi gradienti, poi bordi e così via verso pattern più complessi. Più profondo è lo strato, si ottiene un'immagine più scura. Ciò è spiegato dal fatto che gli strati più profondi hanno uno schema più complesso che rilevano e uno schema complesso appare meno spesso di uno semplice, e quindi la mappa di attivazione si attenua. Il primo modo è adatto per comprendere strati con schemi complessi e il secondo è giusto per quelli semplici.


conv1_1


conv2_2


conv4_3


È possibile scaricare un database più completo di attivazioni per diverse immagini e file .

Un algoritmo neurale dello stile artistico (2 settembre 2015)

Quindi, sono passati un paio d'anni dalla prima trapanazione riuscita della rete neurale. Noi (nel senso di umanità) abbiamo tra le mani un potente strumento che ci permette di capire cosa impara la rete neurale, oltre a rimuovere ciò che non vorremmo davvero che imparasse. Gli autori di questo articolo stanno sviluppando un metodo che consente di fare in modo che un'immagine generi una mappa di attivazione simile a un'immagine di destinazione, e forse anche più di una: questa è la base dello stile. Forniamo rumore bianco all'input e, in un processo iterativo simile a quello del sogno profondo, portiamo questa immagine a un'immagine in cui le mappe delle caratteristiche sono simili all'immagine target.

perdita di contenuto

Come già accennato, ogni strato della rete neurale produce un tensore tridimensionale di una certa dimensione.




Indichiamo l'output io esimo livello dall'input come . Quindi se riduciamo al minimo la somma ponderata dei residui tra l'immagine di input e qualche immagine a cui aspiriamo C, quindi ottieni esattamente ciò di cui hai bisogno. Forse.



Per sperimentare questo articolo, puoi utilizzare questo laptop magico, dove si svolgono i calcoli (sia sulla GPU che sulla CPU). La GPU viene utilizzata per calcolare le caratteristiche della rete neurale e il valore della funzione di costo. Theano produce una funzione che può calcolare il gradiente della funzione obiettivo eval_grad dall'immagine di input X. Questo viene quindi inserito in lbfgs e inizia il processo iterativo.


# Inizializza con un'immagine di rumore generated_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generated_image.get_value().astype("float64") xs = xs.append(x0) # Ottimizza, salvando periodicamente il risultato per i in range(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generate_image.get_value().astype("float64") xs.append(x0)

Se eseguiamo l'ottimizzazione di tale funzione, otterremo rapidamente un'immagine simile a quella di destinazione. Ora possiamo ricreare immagini dal rumore bianco che assomiglino a un'immagine di contenuto.


Perdita di contenuto: conv4_2



Processo di ottimizzazione




È facile notare due caratteristiche dell'immagine risultante:

  • colori persi - questo è il risultato del fatto che in esempio specificoè stato utilizzato solo il livello conv4_2 (o, in altre parole, il peso w era diverso da zero per esso e zero per gli altri livelli); come ricorderete, sono i primi strati che contengono informazioni sui colori e le transizioni dei gradienti, e quelli successivi contengono informazioni su dettagli più grandi, che è ciò che osserviamo: i colori si perdono, ma il contenuto no;
  • alcune case "andiamo", cioè le linee rette sono leggermente curve - questo perché più profondo è lo strato, minori sono le informazioni sulla posizione spaziale dell'elemento che contiene (il risultato dell'applicazione di convoluzioni e raggruppamenti).

L'aggiunta di strati iniziali corregge immediatamente la situazione con i colori.


Perdita di contenuto: conv1_1, conv2_1, conv4_2


Spero che ormai tu abbia la sensazione di avere il controllo su ciò che viene ridisegnato sull'immagine del rumore bianco.

perdita di stile

E ora siamo arrivati ​​al più interessante: come possiamo trasmettere lo stile? Cos'è lo stile? Ovviamente lo stile non è quello che abbiamo ottimizzato in Content Loss, perché contiene molte informazioni sulle posizioni spaziali delle feature, quindi la prima cosa da fare è rimuovere in qualche modo queste informazioni dalle visualizzazioni ricevute su ogni layer.


L'autore propone il seguente metodo. Prendiamo il tensore all'uscita di qualche strato, espandiamolo in coordinate spaziali e calcoliamo la matrice di covarianza tra le lastre. Indichiamo questa trasformazione come G. Cosa abbiamo veramente fatto? Si può dire che abbiamo contato la frequenza con cui le caratteristiche all'interno della piastra si presentano in coppia, o, in altre parole, abbiamo approssimato la distribuzione delle caratteristiche nelle piastre con una distribuzione normale multivariata.




Quindi Style Loss viene inserito come segue, dove Sè qualche immagine con stile:



Proviamo per Vincent? In linea di principio, otteniamo qualcosa di previsto: il rumore nello stile di Van Gogh, le informazioni sulla disposizione spaziale delle caratteristiche sono completamente perse.


Vincenzo




E se mettiamo una foto invece di un'immagine di stile? Ottieni caratteristiche già familiari, colori familiari, ma la posizione spaziale è completamente persa.


Foto con perdita di stile


Sicuramente ti sei chiesto perché calcoliamo la matrice di covarianza e non qualcos'altro? Dopotutto, ci sono molti modi per aggregare le caratteristiche in modo che le coordinate spaziali vengano perse. Questa è davvero una domanda aperta e se prendi qualcosa di molto semplice, il risultato non cambierà radicalmente. Controlliamo questo, non calcoleremo la matrice di covarianza, ma semplicemente il valore medio di ogni piatto.




semplice perdita di stile

Perdita combinata

Naturalmente, c'è il desiderio di mescolare queste due funzioni di costo. Quindi genereremo un'immagine tale dal rumore bianco che manterrà le caratteristiche dell'immagine-contenuto (che hanno un legame con le coordinate spaziali), e ci saranno anche caratteristiche di "stile" che non sono legate alle coordinate spaziali, ad es. speriamo di mantenere intatti i dettagli dell'immagine del contenuto, ma ridisegnati con lo stile giusto.



Esiste infatti anche un regolarizzatore, ma lo ometteremo per semplicità. Resta da rispondere alla seguente domanda: quali livelli (pesi) utilizzare nell'ottimizzazione? E temo di non avere una risposta a questa domanda, e nemmeno gli autori dell'articolo. Hanno un suggerimento per utilizzare quanto segue, ma questo non significa affatto che un'altra combinazione funzionerà peggio, lo spazio di ricerca è troppo grande. L'unica regola che segue dalla comprensione del modello è che non ha senso prendere strati vicini, perché i loro segni non differiranno molto l'uno dall'altro, pertanto allo stile viene aggiunto un livello da ciascun gruppo conv*_1.


# Definisci la funzione di perditaloss = # perdita di contenutoloss.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # perdita di stileloss.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1"))loss.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv4_1") ) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # penalità di variazione totale loss.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(losses)

Il modello finale può essere presentato nella seguente forma.




Ed ecco il risultato delle case con Van Gogh.



Tentativo di controllare il processo

Ricordiamo le parti precedenti, già due anni prima dell'attuale articolo, altri scienziati hanno esplorato ciò che la rete neurale impara davvero. Grazie a tutti questi articoli, puoi generare visualizzazioni di funzionalità di vari stili, varie immagini, diverse risoluzioni e dimensioni, e cerca di capire quali strati con quale peso prendere. Ma anche ri-ponderare i livelli non dà il pieno controllo su ciò che sta accadendo. Il problema qui è più concettuale: stiamo ottimizzando la funzione sbagliata! In che modo, chiedi? La risposta è semplice: questa funzione minimizza il residuo ... beh, hai capito. Ma quello che vogliamo veramente è che ci piaccia l'immagine. La combinazione convessa delle funzioni di perdita di contenuto e di stile non è una misura di ciò che la nostra mente considera bello. È stato osservato che se lo styling viene protratto troppo a lungo, la funzione di costo scende naturalmente sempre più in basso, ma la bellezza estetica del risultato diminuisce drasticamente.




Ok, c'è un altro problema. Diciamo che abbiamo trovato un livello che estrae le caratteristiche di cui abbiamo bisogno. Diciamo che alcune trame sono triangolari. Ma questo livello contiene ancora molte altre caratteristiche, come i cerchi, che in realtà non vogliamo vedere nell'immagine risultante. In generale, se potessimo assumere un milione di cinesi, potremmo visualizzare tutte le caratteristiche di un'immagine di stile e, mediante una ricerca esaustiva, contrassegnare solo quelle di cui abbiamo bisogno e includerle solo nella funzione di costo. Ma per ovvie ragioni, non è così facile. Ma cosa succede se rimuoviamo semplicemente tutti i cerchi che non vogliamo che appaiano nel risultato dal foglio di stile? Quindi l'attivazione dei neuroni corrispondenti che rispondono ai cerchi semplicemente non funzionerà. E, naturalmente, questo non apparirà nell'immagine risultante. È lo stesso con i fiori. Presenta un'immagine luminosa con molti colori. La distribuzione dei colori sarà molto sfumata in tutto lo spazio, la distribuzione dell'immagine risultante sarà la stessa, ma durante il processo di ottimizzazione, i picchi che erano sull'originale andranno probabilmente persi. Si è scoperto che una semplice diminuzione della profondità di bit palette dei colori risolve questo problema. La densità di distribuzione della maggior parte dei colori sarà vicina allo zero e vi saranno ampi picchi in diverse aree. Pertanto, manipolando l'originale in Photoshop, stiamo manipolando le caratteristiche che vengono estratte dall'immagine. È più facile per una persona esprimere visivamente i propri desideri piuttosto che cercare di formularli nel linguaggio della matematica. Ciao. Di conseguenza, designer e manager, armati di Photoshop e script per la visualizzazione delle funzionalità, hanno ottenuto un risultato tre volte più velocemente di quello che hanno fatto matematici e programmatori.


Un esempio di manipolazione del colore e delle dimensioni delle caratteristiche


E puoi immediatamente prendere una semplice immagine come stile



risultati








Ed ecco un vidosik, ma solo con la giusta consistenza

Texture Networks: sintesi feed-forward di texture e immagini stilizzate (10 marzo 2016)

Sembra che questo potrebbe essere fermato, se non una sfumatura. L'algoritmo di styling di cui sopra funziona per molto tempo. Se prendiamo un'implementazione in cui lbfgs viene eseguito sulla CPU, il processo richiede circa cinque minuti. Se lo riscrivi in ​​​​modo che l'ottimizzazione vada alla GPU, il processo richiederà 10-15 secondi. Non va bene. Forse gli autori di questo e del prossimo articolo hanno pensato allo stesso modo. Entrambe le pubblicazioni sono uscite indipendentemente a distanza di 17 giorni, quasi un anno dopo l'articolo precedente. Gli autori dell'attuale articolo, come gli autori del precedente, erano impegnati nella generazione delle trame (se si ripristina semplicemente la perdita di stile, questo è approssimativamente ciò che si ottiene). Hanno suggerito di ottimizzare non un'immagine ottenuta dal rumore bianco, ma una rete neurale che genera un'immagine stilizzata.




Ora, se il processo di styling non include alcuna ottimizzazione, è necessario eseguire solo un passaggio in avanti. E l'ottimizzazione è necessaria solo una volta per addestrare la rete del generatore. Questo articolo utilizza un generatore gerarchico in cui ogni seguente z.z più grande del precedente e viene campionato dal rumore in caso di generazione di texture e da alcuni database di immagini per l'addestramento dello stilizzatore. È fondamentale utilizzare qualcosa di diverso dalla parte di addestramento di imagenet, perché le funzionalità all'interno della rete Loss sono calcolate dalla rete addestrata solo sulla parte di formazione.



Perdite percettive per il trasferimento di stile in tempo reale e la super risoluzione (27 marzo 2016)

Come suggerisce il nome, gli autori, che erano in ritardo di soli 17 giorni con l'idea di una rete generatrice, erano impegnati ad aumentare la risoluzione delle immagini. Sembra che siano stati ispirati dal successo dell'apprendimento residuo sull'ultima imagenet.




Di conseguenza blocco residuo e blocco conv.



Così, ora oltre al controllo dello styling, abbiamo tra le mani anche un generatore veloce (grazie a questi due articoli, il tempo di generazione di un'immagine si misura in decine di ms).

Finale

Abbiamo utilizzato le informazioni degli articoli recensiti e il codice degli autori come punto di partenza per creare un'altra applicazione di stile per la prima applicazione di stile video:



Genera qualcosa di simile.


Nelle fotografie più ordinarie compaiono entità numerose e non del tutto distinguibili. Molto spesso per qualche motivo cani. Tali immagini hanno iniziato a riempire Internet nel giugno 2015, quando è stato lanciato DeepDream di Google, uno dei primi servizi aperti basati su reti neurali e progettato per l'elaborazione delle immagini.

Succede più o meno così: l'algoritmo analizza le fotografie, trova in esse frammenti che gli ricordano alcuni oggetti familiari e distorce l'immagine in base a questi dati.

In primo luogo, il progetto è stato presentato come open source, quindi i servizi online creati secondo gli stessi principi sono apparsi su Internet. Uno dei più convenienti e popolari è Deep Dream Generator: ci vogliono solo circa 15 secondi per elaborare una piccola foto qui (in precedenza, gli utenti dovevano aspettare più di un'ora).

In che modo le reti neurali imparano a creare tali immagini? E perché, a proposito, si chiamano così?

Le reti neurali nel loro design imitano le vere reti neurali di un organismo vivente, ma lo fanno con l'aiuto di algoritmi matematici. Dopo aver creato una struttura di base, puoi addestrarla utilizzando metodi di apprendimento automatico. Se parliamo di pattern recognition, migliaia di immagini devono passare attraverso la rete neurale. Se il compito della rete neurale è diverso, gli esercizi di allenamento saranno diversi.

Gli algoritmi per giocare a scacchi, ad esempio, analizzano le partite di scacchi. Lungo lo stesso percorso, l'algoritmo AlphaGo di DeepMind di Google nel gioco cinese di Go, che è stato salutato come un passo avanti perché Go è molto più complesso e non lineare degli scacchi.

    Puoi giocare con un modello di rete neurale semplificato e comprenderne meglio i principi.

    YouTube ha anche una serie di intelligibili disegnati a mano rulli su come funzionano le reti neurali.

Un altro servizio popolare è Dreamscope, che non solo può sognare i cani, ma anche imitare vari stili di pittura. Anche qui l'elaborazione delle immagini è molto semplice e veloce (circa 30 secondi).

A quanto pare, la parte algoritmica del servizio è una modifica del programma in stile Neural, di cui abbiamo già parlato.

Più recentemente, è apparso un programma che dipinge realisticamente immagini in bianco e nero. Nelle versioni precedenti, programmi simili svolgevano il loro lavoro molto meno bene ed era considerato un grande risultato se almeno il 20% delle persone non riusciva a distinguere tra un'immagine reale e una colorata al computer.

Inoltre, la colorazione qui richiede solo circa 1 minuto.

La stessa società di sviluppo ha anche lanciato un servizio che riconosce nelle immagini tipi diversi oggetti.

Questi servizi possono sembrare solo intrattenimento divertente, ma in realtà tutto è molto più interessante. Le nuove tecnologie entrano nella pratica degli artisti umani e cambiano la nostra comprensione dell'arte. Forse presto le persone dovranno competere con le macchine nel campo della creatività.

Insegnare gli algoritmi di riconoscimento dei modelli è un compito con cui gli sviluppatori di intelligenza artificiale hanno lottato per molto tempo. Pertanto, i programmi che colorano vecchie fotografie e disegnano cani nel cielo possono essere considerati parte di un processo più ampio e intrigante.


Superiore