Reti neurali: trova la maggior parte delle immagini simili


11

Sto lavorando con Python, scikit-learn e keras. Ho 3000 mila immagini di orologi frontali come i seguenti: Watch_1 , Watch_2 , Watch_3 .

Voglio scrivere un programma che riceva come input una foto di un vero orologio che potrebbe essere scattata in condizioni meno ideali rispetto alle foto sopra (colore di sfondo diverso, fulmini più scuri ecc.) E trovare gli orologi più simili tra i 3000 ad esso. Per somiglianza intendo che se do come input una foto di un orologio marrone rotondo con pizzo sottile, allora mi aspetto come output orologi di forma rotonda, di colore scuro e con pizzo sottile.

Qual è l'algoritmo di machine learning più efficiente per farlo?

Ad esempio, seguendo questo link ho in mente due diverse soluzioni:

1) Usare una CNN come estrattore di caratteristiche e confrontare le distanze tra queste caratteristiche per ogni coppia di immagini con riferimento all'immagine di input.

2) Utilizzo di due CNN in una rete neurale siamese per confrontare le immagini.

Queste due opzioni sono le migliori per questa attività o suggeriresti qualcos'altro?

Conosci qualche rete neurale pre-allenata (con iperparametri predeterminati) per questo compito?

Ho trovato alcuni post interessanti su StackOverflow a riguardo, ma sono piuttosto vecchi: Post_1 , Post_2 , Post_3 .


Benvenuti nel sito! Impara un incorporamento (consiglio un hash binario per il recupero veloce nell'ordine di mille bit) quindi esegui una ricerca di somiglianza.
Emre,

È un piacere essere qui ... ahah! ... Sì, questa è una buona idea e avevo già letto questo documento ...
Emarginato il

Risposte:


4

Non penso che un'architettura di alto livello come tale sia la soluzione migliore, ma dipende piuttosto da molti fattori e dettagli. Da quello che sono a conoscenza del primo approccio è promettente soprattutto se esteso con passaggi aggiuntivi come fatto in TiefVision :

  1. Un'ulteriore rete di delimitazione viene utilizzata per discriminare la parte rilevante dell'immagine dal resto
  2. I vettori di funzionalità non vengono semplicemente confrontati direttamente, ma piuttosto utilizzati per formare una rete di confronto utilizzando terzine (apprendimento della somiglianza basata su vettori di funzionalità ed esempi per casi più e meno simili).

Questo lavoro è molto più recente (2016/17) di quello che hai postato e viene fornito con un bel set di strumenti e di una più dettagliata di carta .

Perché usare le terzine aka Deep Ranking?

Come affermato nei commenti: Perché si dovrebbero usare le terzine per la somiglianza delle immagini invece di apprendere i vettori delle caratteristiche e calcolare la loro distanza? Le terzine sono un modo per formulare la domanda di somiglianza come un problema di apprendimento invece di vettori di funzioni di apprendimento che sostanzialmente non si preoccupano della somiglianza. Questo approccio ha senso soprattutto nei casi in cui è importante la somiglianza percepita dall'uomo, che potrebbe differire dalla percezione della macchina.

Le terzine funzionano così: fornisci 3 immagini. Una da confrontare, un'immagine simile (vicina) e un'immagine non così simile (distante). Questi sono i dati di allenamento / test / convalida. La formazione della rete su tali campioni e la previsione dell'ordine corretto (classificare immagini simili da immagini non simili) in generale consente alla rete di imparare come ordinare le immagini in base alla loro somiglianza.

Tutto sommato questo approccio è relativamente complesso. Potrebbe essere troppo ingegnerizzato ma hai anche chiesto il modo migliore per farlo e Deep Ranking raggiunge valori di precisione molto elevati.


Grazie per la vostra risposta. Questo è interessante (l'ho votato). L'idea della tripletta è buona anche se non sono esattamente sicuro del perché l'uso delle terzine di immagini sia necessariamente migliore dell'uso delle coppie di immagini per il mio compito. Se lo desideri, puoi spiegarlo meglio al tuo post. Inoltre darò un'occhiata a TiefVision.
Emarginato il

@Universalis grazie per il suggerimento (e il voto). Ho aggiornato la mia risposta con alcuni dettagli in più sulle terzine e sul ragionamento. Il documento è anche scritto molto bene, quindi dai un'occhiata a tutti i dettagli. Potrebbero esserci nuovi modi fantasiosi per farlo da quando sono sorti TiefVision e DeepRanking.
Gegenwind,

Grazie ancora per la tua risposta. Sì, ho dato un'occhiata al documento ed era abbastanza chiaro su cosa hai aggiunto alla tua risposta. In questo senso, avevo già capito cosa hai aggiunto la tua risposta e la mia domanda più chiaramente era la seguente: perché non usare 2 immagini (una coppia) invece di 3 immagini (una tripletta) per classificare le immagini in base alla loro somiglianza? Qual è il vantaggio aggiuntivo dell'utilizzo delle terzine anziché delle coppie?
Emarginato il

Hmm forse ho frainteso il tuo approccio. La tripletta fornisce informazioni comparative sul fatto che l'immagine 1 è più vicina all'immagine 2 che all'immagine 3. Avere solo 2 immagini e dichiarare "questi 2 sono simili" manca di un fattore comparativo "simile per quanto riguarda" perché in questo approccio si assume che la distanza normale del vettore di funzionalità non ti dice abbastanza. in altre parole: impari la somiglianza per ordine e ti manca senza avere almeno 2 articoli da ordinare.
Gegenwind,

Grazie ancora per la tua risposta Tuttavia, anche ora e dopo aver letto un po 'più attentamente il documento, non mi è chiaro perché hai necessariamente bisogno di terzine e non di coppie di immagini per questo approccio senza supervisione. Quando si usano le etichette è chiaro che usando le terzine si otterrà una classifica di somiglianza completa delle immagini che non è possibile ottenere con le coppie. Ma in questo (tipo di) approccio non supervisionato che proponi quindi perché non confrontare i valori della funzione di perdita per ciascuna coppia di immagini (sempre un'immagine della coppia è l'immagine di input) per trovare, ad esempio, i 5 più simili a immagine di input?
Emarginato il

2

Sceglierei un classificatore, come VGG-16, che funziona bene con le classi imagenet. Quindi, esegui le immagini dell'orologio attraverso di esso. Di sicuro, ci si può aspettare che l'output sia principalmente "watch" con alta probabilità.

Tuttavia, otterrai quindi funzionalità extra: il livello di attivazione di tutte le altre categorie. Questo ti dà un vettore di mille valori tra 0 e 1.

È inoltre possibile estrarre l'attivazione in vari punti della rete. Quindi, la somiglianza di tali attivazioni e uscite dovrebbe essere simile tra due casi solo se le immagini sono simili.


Grazie per la tua risposta (votazione). Sì, avevo questo nella mia mente e in un certo senso è legato alla prima opzione che ho fornito al mio post. Quindi stavo anche pensando di usare altri rivelatori come SURF ... Vedrò se questi hanno successo ...
Emarginato il

2

Mi concentrerei innanzitutto sull'aumento dei dati. Dato che le tue immagini hanno uno sfondo bianco, le hai un po 'più facili. Trasforma lo sfondo bianco in uno sfondo trasparente, ridimensiona l'immagine, ruotala e mettila in uno sfondo simile ai tuoi dati di destinazione.

Fallo un sacco di volte con combinazioni diverse e hai un'etichetta per ogni orologio. Quindi suggerirei di utilizzare una normale rete neurale convoluzionale per la classificazione. Ogni etichetta avrà un punteggio, scegli quello con la massima sicurezza e quello dovrebbe essere il più simile .

Ad esempio, supponiamo che tu esegua il classificatore con un'immagine e ottenga questo risultato:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

La CNN afferma di avere una sicurezza del 51% sul fatto che Watch1 sia l'orologio nell'immagine di input. Ma anche ciò che è vero è che è quello che ritiene più simile, Watch2 sarebbe il prossimo più simile e così via.

Se non ottieni buoni risultati, fai il solito. Sperimenta con i parametri e / o aggiungi più livelli. Prova a scoprire dove sta fallendo. Dopo aver acquisito queste informazioni, puoi utilizzarlo per scegliere un tipo più specializzato di rete convoluzionale per il tuo problema specifico. Cercare questo senza una conoscenza preliminare di come si comporterebbe non è l'approccio giusto. Vorrei suggerire di iniziare con un modello convoluzionale di base e poi lavorare da lì.


1
Grazie per la tua risposta (votazione). Sì, avevo già in mente l'aumento dei dati. Tuttavia, la tua risposta non è chiara. Cosa intendi con "avere un'etichetta per ogni orologio"? Intendi etichettare ogni orologio singolarmente o etichettarli come coppia con un altro a seconda che siano simili o no? (Se è il primo, spiega perché questo è efficace, per favore)
Emarginato il

È il primo suggerimento, supponevo che tu avessi già un modo pratico per etichettarli tutti. Questa è sostanzialmente la soluzione più semplice, quindi non sarà efficiente. Il mio suggerimento era che il modello base potesse forse fornirti informazioni sufficienti per inseguire un modello più specializzato. Guardare una classifica profonda sembra molto promettente come ha detto @Gegenwind. Ho aggiornato la mia risposta per renderla un po 'più chiara.
zimio,

Hm, sì ora è più chiaro cosa intendevi ... Questo è certamente un buon suggerimento generale: inizia con le basi e passa passo per passo a cose più complesse ... Grazie in ogni caso ...
Emarginato il
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.