Quale algoritmo utilizza Google per il suo sito "Cerca per immagine"?


45

Qual è la tua ipotesi migliore su come funziona Google Ricerca immagini? Posso caricare una foto e cercare immagini simili. Quale algoritmo utilizza per identificare immagini simili?


Potrebbero memorizzare l'istogramma dell'immagine. Funziona con scale diverse della stessa immagine e piccole differenze dovute a artefatti da compressione o altro.
elio,

1
Gli istogrammi non catturano le informazioni spaziali; otterresti false corrispondenze.
Emre,

Risposte:


29

Non so quale algoritmo venga utilizzato da Google. Ma, dal momento che volevi una migliore ipotesi, lasciami dare alcune idee su come potrebbe essere costruito un sistema simile .

L'intero campo relativo alla ricerca immagine-base-per-immagine si chiama Content Based Image Retrieval (CBIR) . L'idea è, in qualche modo, costruire una rappresentazione dell'immagine (non necessariamente comprensibile dagli umani) che contenga le informazioni sul contenuto dell'immagine .

Esistono due approcci di base:

  • recupero utilizzando funzionalità di basso livello (locale): colore, trama, forma in parti specifiche delle immagini (un'immagine è una raccolta di descrittori di caratteristiche locali )
  • approcci semantici in cui un'immagine è, in qualche modo, rappresentata come una raccolta di oggetti e delle loro relazioni

L'approccio locale di basso livello è molto ben studiato. L'approccio attuale migliore estrae le funzionalità locali (qui è disponibile una scelta dell'algoritmo di estrazione delle funzionalità) e utilizza i loro descrittori locali (di nuovo, la scelta dei descrittori) per confrontare le immagini.

Nelle opere più recenti, i descrittori locali vengono prima raggruppati e quindi i cluster vengono trattati come parole visive : la tecnica è quindi molto simile alla ricerca di documenti di Google, ma utilizza parole visive anziché lettere.

Puoi pensare alle parole visive come equivalenti alle radici delle parole nel linguaggio: ad esempio, le parole: lavoro, lavoro, lavoro appartengono tutte alla stessa parola radice.

Uno degli svantaggi di questo tipo di metodi è che di solito funzionano in modo insufficiente su immagini a trama bassa.

Ho già dato e visto molte risposte che descrivono in dettaglio questi approcci, quindi fornirò solo collegamenti a tali risposte:

  • CBIR: 1 , 2
  • estrazione / descrizione delle caratteristiche: 1 , 2 , 3 , 4

Gli approcci semantici si basano tipicamente su rappresentazioni gerarchiche dell'intera immagine. Questi approcci non sono ancora stati perfezionati, soprattutto per i tipi di immagine generali. C'è un certo successo nell'applicare questo tipo di tecniche a specifici domini di immagini.

Dato che sono attualmente nel mezzo della ricerca di questi approcci, non posso trarre alcuna conclusione. Ora, detto questo, ho spiegato un'idea generale dietro queste tecniche in questa risposta .

Ancora una volta, a breve: l'idea generale è quella di rappresentare un'immagine con una struttura a forma di albero, dove le foglie contengono i dettagli dell'immagine e gli oggetti si trovano nei nodi più vicini alla radice di tali alberi. Quindi, in qualche modo, si confrontano i sottoalberi per identificare gli oggetti contenuti in diverse immagini.

Ecco alcuni riferimenti per diverse rappresentazioni degli alberi. Non li ho letti tutti e alcuni usano questo tipo di rappresentazioni per la segmentazione anziché il CBIR, ma comunque eccoli qui:


22

Oltre alla risposta di penelope, ci sono due approcci, l'hashing percettivo e il modello bag-of-words le cui funzionalità di base sono facilmente implementabili e sono quindi piacevoli da giocare o da cui imparare, prima di avventurarsi in territori più avanzati.

Hash percettivo

Gli algoritmi di hashing percettivo mirano a costruire un hash, che a differenza di un hash crittografico, fornirà valori di hash simili o quasi simili per immagini identiche che sono state leggermente distorte, ad esempio dal ridimensionamento o dalla compressione JPEG. Servono a uno scopo utile nel rilevamento vicino ai duplicati in una raccolta di immagini.

Nella sua forma più semplice, puoi implementarlo come segue:

  1. Converti l'immagine in scala di grigi

  2. Rendi la tua immagine zero media

  3. Riduci l'immagine fino alla dimensione dell'anteprima, ad esempio [32x32]
  4. Esegui la trasformazione del coseno discreto bidimensionale
  5. Mantieni in alto a sinistra [8 x 8], i componenti a bassa frequenza più significativi
  6. Binarizzare il blocco, in base al segno dei componenti

Il risultato è un hash a 64 bit resiliente, poiché si basa sui componenti a bassa frequenza dell'immagine. Una variante di questo tema sarebbe quella di dividere ogni immagine in 64 sottoblocchi e confrontare la media dell'immagine globale con la media locale di sottoblocco e scrivere un 1 o 0 di conseguenza.

L'hashing percettivo è implementato ad esempio da phash

Modello bag-of-words

Il modello bag-of-words mira a identificare semanticamente un'immagine, ad esempio tutte le immagini con cani in esse. Lo fa usando alcune patch di immagini con lo stesso spirito in cui si classificherebbe un documento di testo in base al verificarsi di determinate parole. Si potrebbero classificare le parole, dire "cane" e "cani" e memorizzarle come identificatore in un file invertito in cui la categoria "cane" ora punta a tutti i documenti contenenti "cane" o "cani".

Nella sua forma più semplice, si può fare questo con le immagini come segue:

  1. Distribuire le cosiddette funzionalità SIFT, ad esempio utilizzando l'eccellente libreria vlfeat , che rileverà i punti funzione SIFT e un descrittore SIFT per punto. Questo descrittore è fondamentalmente un modello intelligente della patch di immagine che circonda quel punto caratteristica. Questi descrittori sono le tue parole grezze.
  2. Raccogli i descrittori SIFT per tutte le immagini pertinenti

Ora hai una vasta collezione di descrittori SIFT. Il problema è che anche da immagini quasi identiche ci sarà una discrepanza tra i descrittori. Volete raggruppare gli stessi identici più o meno come trattare alcune parole, come "cane" e "cani" come identici e dovete compensare gli errori. È qui che entra in gioco il clustering.

  1. Prendi tutti i descrittori SIFT e raggruppali, ad esempio con un algoritmo come k-mean. Questo troverà un numero prestabilito di cluster con centroidi nei dati del descrittore. Questi centroidi sono le tue nuove parole visive.
  2. Ora per immagine e i suoi descrittori trovati originali, puoi guardare i cluster a cui sono stati assegnati questi descrittori. Da questo, sai quali centroidi o parole visive 'appartengono' alla tua immagine. Questi centroidi o parole visive diventano il nuovo descrittore semantico della tua immagine che può essere memorizzato in un file invertito.

Una query di immagine, ad es. Trovami immagini simili alla query-immagine, viene quindi risolta come segue:

  1. Trova i punti SIFT e i relativi descrittori nell'immagine della query
  2. Assegna i descrittori di query ai centroidi trovati in precedenza nella fase di registrazione. Ora hai una serie di centroidi o parole visive che riguardano l'immagine della tua query
  3. Abbina le parole visive della query alle parole visive nel tuo file invertito e restituisci le immagini corrispondenti

1
Il tuo approccio bag-of-word è fondamentalmente ciò a cui portano i miei collegamenti per l '"approccio locale" :) Anche se non è veramente di natura semantica: non rappresenteresti mai un singolo cane con una caratteristica, né sarebbe così facile da identificare diverse spezie per cani come cani. Ma l'hashing percettivo è carino, non lo sapevo. Le spiegazioni sono belle. Cosa mi ha fatto pensare ... avresti qualche suggerimento su come applicare quella tecnica ad un'area non rettangolare? O forse fornire alcuni riferimenti ad articoli, potrei leggere un po 'e se la domanda ha senso, aprirla come una domanda separata.
penelope,

1
@penelope In realtà ho letto nell'articolo, anni fa, in cui gli autori dividevano un'immagine in triangoli arbitrari. E c'è la trasformazione in traccia che è stata anche usata come base per un hash percettivo. Tornerò da te.
Maurits,

Tutto ciò che voglio chiederti al riguardo è molto al di là dell'ambito di questa domanda, quindi ne ho aperto uno nuovo. Altre informazioni / riferimenti sulla tecnica di base sarebbero comunque fantastici, sia in questa risposta che in quella. In attesa :)
penelope,

2

L'altro approccio interessante che sembra essere trascurato nelle risposte precedenti sono le reti neurali profonde convoluzionali. Sembra che Google lo stia utilizzando proprio ora per il suo motore di ricerca di immagini e il suo servizio di traduzione . Le CNN sono estremamente potenti in compiti cognitivi come la ricerca della somiglianza. Sembra che la CNN esegua una procedura simile di Bag-of-worlds che è incorporata attraverso i suoi strati di rete. Il rovescio della medaglia di queste tecniche è l'incapacità di disimparare e la necessità di enormi set di dati per la formazione e, naturalmente, pesanti costi di calcolo in fase di formazione.

Documento suggerito al riguardo:

e implementazione di recupero di immagini di deep learning open source (il documento successivo): https://github.com/paucarre/tiefvision

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.