Algos governati dai dati, come le reti neurali, hanno preso d'assalto il mondo. La loro evoluzione è stata causata da diversi fattori, tra cui hardware economico e potente e un enorme volume di dati. Le reti neurali sono attualmente all'avanguardia in tutto ciò che riguarda compiti 'cognitivi', come il riconoscimento delle immagini, la comprensione del linguaggio naturale, ecc. Ma non dovrebbero essere limitate a questi compiti. In questo materiale si parlerà di un modo di comprimere le immagini usando reti neurali, attraverso l'apprendimento residuo. L'approccio presentato nell'articolo funziona più velocemente e meglio dei codec standard. Schemi, equazioni e, naturalmente, una tabella con i test sono sotto il tag.
Questo articolo si basa su un lavoro. Si presuppone che tu sia familiare con le reti neurali e i loro concetti convoluzione e funzione di perdita.
Che cos'è la compressione delle immagini e quali tipi esistono?
La compressione delle immagini è il processo di trasformazione di un'immagine in modo che occupi meno spazio. La semplice memorizzazione delle immagini occuperebbe molto spazio, quindi esistono codec come JPEG e PNG che mirano a ridurre le dimensioni dell'immagine originale.
Come è noto, esistono due tipi di compressione delle immagini: senza perdita e con perdita. Come suggeriscono i nomi, con la compressione senza perdita è possibile ottenere i dati dell'immagine originale, mentre con la compressione con perdita alcuni dati vengono persi durante la compressione. Ad esempio, JPG è un algoritmo con perdita [nota del traduttore: non dimentichiamo anche JPEG senza perdita], mentre PNG è un algoritmo senza perdita.

Confronto tra compressione senza perdita e con perdita
Si prega di notare che nell'immagine a destra ci sono molti artefatti a blocchi. Questa è informazione persa. I pixel adiacenti di colori simili vengono compressi come un'unica area per risparmiare spazio, ma con ciò si perde l'informazione sui pixel effettivi. Certo, gli algoritmi utilizzati nei codec JPEG, PNG, ecc. sono molto più complessi, ma questo è un buon esempio intuitivo di compressione con perdita. La compressione senza perdita è buona, ma i file compressi senza perdita occupano molto spazio su disco. Ci sono metodi più efficienti per comprimere le immagini senza perdere una grande quantità di informazioni, ma sono abbastanza lenti e molti applicano approcci iterativi. Questo significa che non possono essere eseguiti in parallelo su più core della CPU o della GPU. Questa limitazione li rende completamente impraticabili nell'uso quotidiano.
Input della rete neurale convoluzionale
Se c'è qualcosa da calcolare e i calcoli possono essere approssimativi, aggiungi . Gli autori hanno utilizzato una rete neurale convoluzionale abbastanza standard per migliorare la compressione delle immagini. Il metodo presentato non solo funziona alla pari con le migliori soluzioni (se non meglio), ma può anche utilizzare i calcoli paralleli, il che porta a un aumento drastico della velocità. La ragione è che le reti neurali convoluzionali (CNN) sono molto abili nell'estrarre informazioni spaziali dalle immagini, che vengono poi rappresentate in forma più compatta (ad esempio, vengono salvati solo i bit "importanti" dell'immagine). Gli autori volevano utilizzare questa capacità delle CNN per meglio rappresentare le immagini.
Architettura
Gli autori hanno proposto una rete doppia. La prima rete riceve in ingresso l'immagine e genera una rappresentazione compatta (ComCNN). I dati in uscita di questa rete vengono poi elaborati da un codec standard (ad esempio, JPEG). Dopo che il codec ha elaborato l'immagine, viene passata a una seconda rete, che "corregge" l'immagine dal codec nel tentativo di restituire l'immagine originale. Gli autori hanno chiamato questa rete CNN ricostruttiva (RecCNN). Simile ai GAN, entrambe le reti vengono addestrate in modo iterativo.

La rappresentazione compatta di ComCNN viene passata a un codec standard

. I dati in uscita di ComCNN vengono ingranditi e passati a RecCNN, che tenterà di apprendere il resto
I dati di output del codec vengono scalati all'aumento e poi trasmessi a RecCNN. RecCNN cercherà di produrre un'immagine che assomigli all'originale il più possibile.

Framework di compressione delle immagini a passaggio. Co(.) è un algoritmo di compressione delle immagini. Gli autori hanno utilizzato JPEG, JPEG2000 e BPG
Cos'è il residuo?
Il residuo può essere considerato un passo di post-elaborazione per "migliorare" l'immagine decodificata dal codec. Dotata di una grande quantità di "informazioni" sul mondo, la rete neurale può prendere decisioni cognitive su cosa correggere. Questa idea si basa su , di cui puoi leggere i dettagli .
Funzioni di perdita
Vengono utilizzate due funzioni di perdita perché abbiamo due reti neurali. La prima, ComCNN, è contrassegnata come L1 e viene definita così:

Funzione di perdita per ComCNN
Spiegazione
Questa equazione potrebbe sembrare complessa, ma in realtà è un errore quadratico medio (MSE) standard. MSE. ||² rappresenta la norma del vettore che racchiudono.

Equazione 1.1
Cr rappresenta i dati di output di ComCNN. θ rappresenta l'apprendibilità dei parametri di ComCNN, XK è l'immagine di input.

Equazione 1.2
Re() rappresenta RecCNN. Questa equazione trasmette semplicemente il valore dell'equazione 1.1 a RecCNN. θ rappresenta i parametri apprendibili di RecCNN (l'accento sopra indica che i parametri sono fissi).
Definizione intuitiva
L'equazione 1.0 farà sì che ComCNN cambi i suoi pesi in modo che, dopo la ricreazione tramite RecCNN, l'immagine finale assomigli il più possibile all'immagine di input. La seconda funzione di perdita di RecCNN viene definita così:

Equazione 2.0
Spiegazione
Ancora una volta, la funzione può sembrare complessa, ma è per la maggior parte una funzione di perdita standard per reti neurali (MSE).

Equazione 2.1
Co() rappresenta l'output del codec, x con l'accento sopra rappresenta l'output di ComCNN. θ2 sono i parametri apprendibili di RecCNN, res() rappresenta semplicemente l'output residuo di RecCNN. Vale la pena notare che RecCNN viene addestrato sulla differenza tra Co() e l'immagine di input, ma non sull'immagine di input.
Definizione intuitiva
L'equazione 2.0 farà sì che RecCNN cambi i suoi pesi affinché i dati di output assomiglino il più possibile all'immagine di input.
Schema di apprendimento
I modelli vengono addestrati iterativamente, similmente a . I pesi del primo modello vengono fissati mentre i pesi del secondo modello vengono aggiornati, quindi i pesi del secondo modello vengono fissati mentre il primo modello si allena.
Test
Gli autori hanno confrontato il loro metodo con metodi esistenti, inclusi codec semplici. Il loro metodo funziona meglio degli altri, mantenendo alta velocità sull'hardware appropriato. Inoltre, gli autori hanno tentato di utilizzare solo una delle due reti e hanno notato una diminuzione delle prestazioni.

Confronto dell'indice di somiglianza strutturale (SSIM). Valori elevati indicano una migliore somiglianza con l'originale. In grassetto il risultato degli autori.
Conclusione
Abbiamo esaminato un nuovo modo di applicare l'apprendimento profondo per la compressione delle immagini, discutendo la possibilità di utilizzare le reti neurali anche in compiti oltre ai "generali", come la classificazione delle immagini e l'elaborazione del linguaggio. Questo metodo non solo soddisfa le attuali esigenze, ma consente anche di elaborare le immagini molto più velocemente.
Studiare le reti neurali è diventato più semplice, poiché abbiamo creato un codice promozionale appositamente per gli utenti di Habr. HABR, che offre uno sconto aggiuntivo del 10% sullo sconto indicato nel banner.
Altri corsi
Articoli consigliati
Fonte: habr.com
