Algoritmo per identificare il grado di somiglianza basato sulla categorizzazione precedente

3

Sto lavorando con le immagini digitali che le persone hanno categorizzato manualmente su un numero di parametri.

Voglio poter trovare immagini simili o dissimili in base a determinate categorie. Ad esempio, potremmo voler scegliere due immagini casuali dal nostro database che hanno "significanza" simile, ma sono altrimenti il più diverse possibile.

Ad esempio, questa immagine di Stonehenge sarebbe categorizzata in questo modo:

colors: blue, green, grey
themes: natural, land, sky
brightness: light
location: outdoor
shapes: angular
texture: hard
lines: vertical
significance: historical

Le categorie sono per lo più fisse e piccole, quindi quando categorizzato manualmente la persona sceglie i colori principali da un elenco di dieci colori (rosso, arancione, giallo, verde, blu, viola, bianco, nero, grigio, marrone), e lo stesso vale per le altre categorie. La maggior parte delle categorie ha solo un numero limitato di opzioni, ad esempio la posizione è coperta, all'aperto o sconosciuta e la luminosità è chiara, scura o neutra.

Il mio approccio ingenuo è qualcosa del genere:

  1. Interrogare il database per le immagini con significato storico
  2. Scegli un'immagine casuale a partire dalle immagini storicamente significative
  3. Delle restanti immagini storiche, fai un campionamento casuale di N immagini. Valori diversi di N ci daranno più varietà a scapito dell'accuratezza.
  4. Per ogni immagine selezionata casualmente, crea un vettore binario ordinato per tutti i possibili valori di categoria (es. rosso = 0, blu = 1, esterno = 1, ecc.), producendo un valore binario.
  5. Confronta i valori binari per l'immagine di partenza e l'immagine casuale, ad esempio utilizzando un'operazione XOR bit a bit (o un'operazione di set equivalente), quindi conta il numero di 1 nel risultato.

Non sono necessariamente interessato a trovare le immagini più dissimili. Qualsiasi due immagini che sono per la maggior parte dissimili andrà bene, e in effetti di solito desideriamo un po 'di casualità, quindi le stesse coppie di immagini non sono spesso selezionate.

Questo approccio ingenuo funziona bene. Esistono algoritmi o tecniche appropriati che dovrei esaminare per questo problema?

    
posta user1594322 02.10.2015 - 19:18
fonte

2 risposte

2

La risposta di Sirisian è iniziata sulla buona strada, ma poi mi ha perso, quindi ecco la mia versione del problema.

Il fatto che si tratti di immagini è irrilevante e anche il fatto che una delle proprietà sia identica è irrilevante. Sono entrambe false piste. Tutto quello che vedo qui sono entità con proprietà e il problema può essere facilmente ridefinito per escludere la proprietà che deve essere identica e considerare solo il sottoinsieme di entità che in effetti hanno lo stesso valore su quella proprietà esclusa.

Quindi, in sostanza, quello che hai è un insieme di entità in cui ogni entità ha una lista di proprietà N e tu hai un'entità separata che chiameremo l'entità "di riferimento" e vuoi cercare attraverso quella serie trova le entità che hanno i valori quanto più dissimili possibili dall'entità di riferimento.

In sostanza, vuoi una distanza massima nell'algoritmo dello spazio N-dimensionale.

Prima di tutto è necessario calcolare il vettore N-dimensionale dei valori della propria entità di riferimento. Questo è essenzialmente le coordinate di un punto nello spazio N-dimensionale. (Se vuoi, puoi immaginare che N = 3, quindi puoi pensare al problema nello spazio tridimensionale.)

Quindi, è necessario scorrere le altre entità e per ciascuna entità è necessario calcolare il suo vettore N-dimensionale, (immagina un altro punto nello spazio tridimensionale), quindi è necessario calcolare la distanza tra vettore di riferimento e questo vettore, che sarà un altro N-vettore, e quindi è necessario prendere il valore assoluto , alias magnitudine di quel vettore, che sarà un valore singolo e memorizzarlo.

Una volta che tutte le grandezze sono state raccolte, devi ordinare tutte le tue entità con questo valore di magnitudine, e i risultati desiderati saranno raccolti vicino alla fine dell'elenco, dove saranno le grandezze maggiori.

Questo è il modo standard per risolvere la maggior parte del tuo problema e ti consiglio caldamente di risolverlo esattamente in questo modo, in modo da implementare un algoritmo che sarà comprensibile da altri, e anche da te, se dovessi rivederlo pochi mesi dopo.

Ora, la tua situazione particolare ha alcune peculiarità:

  • I valori delle tue proprietà non sono numeri reali, sono set di valori discreti. Quindi, dovrai mapparli a numeri reali. Un range da 0 a 1 funzionerà bene, come suggerito da Sirisian. Probabilmente puoi combinare insieme il tuo colore discreto e la tua luminosità discreta in tre valori di proprietà, che siano HSV, HSL o forse anche RGB, non credo che ne importi molto.

  • Vuoi un numero variabile di risultati e vuoi un po 'di casualità. Quindi, seleziona una percentuale di entità alla fine dell'elenco ordinato e scegli un numero specifico da esse, a caso.

risposta data 02.10.2015 - 22:06
fonte
1

Tutto ciò che hai detto sembra vicino, ma mancano alcuni dettagli sulla creazione e l'interrogazione del vettore che sono importanti. Idealmente è necessario formare vettori unici per ogni immagine. Dovrai convertire il colore in HSV (o HSL) o in uno spazio colore che si presti a confronti. Assegna un numero a ciascuna scelta per i componenti.

Quindi assegna un peso a ciascun componente nel tuo vettore. Questo dovrebbe normalizzare l'importanza di ciascun componente. Se riesci a immaginare il tuo vettore nello spazio n-dimensionale, desideri che ogni componente abbia lo stesso peso (o essere influenzato dalla sua importanza nel confronto). Ad esempio, le linee potrebbero non essere importanti, quindi nell'intervallo [0, 1] orizzontale = 0,2 e verticale = 0,4. L'esterno potrebbe essere una distinzione importante quindi indoor = 0.5 e outdoor = 1.0. (Non devi rimanere tra 0 e 1, ma è semplice).

Per i colori devi gestirli appositamente. Per colore assegnare a ciascun componente un numero compreso tra [0, 1] (per ciascun componente HSV).

La mia unica preoccupazione per la configurazione è la categorizzazione è molto semplice e il tuo sistema di colori e temi è un po 'complesso con più colori e temi. Quando generi un vettore, in sostanza, vuoi unire i risultati con il vettore e ogni colore e tema. Quindi per una singola immagine con te genereresti ogni combinazione di vettore (filtraggio per i componenti che stai cercando). Esempio:

(blu, naturale, leggero, ...)
(blu, terra, luce, ...)
(blu, cielo, luce, ...)
(verde, naturale, leggero, ...)
(verde, terra, luce, ...)
(verde, cielo, luce, ...)
(grigio, naturale, leggero, ...)
(grigio, terra, luce, ...)
(grigio, cielo, luce, ...)

Converti ciascun componente in valori ponderati numerici, quindi avresti un vettore reale nello spazio n-dimensionale. (il blu verrebbe convertito in 3 componenti HSV solo per essere molto chiaro).

Quando disponi di vettori basati sui parametri che vuoi confrontare, di solito utilizzi un albero k-d più vicino alla ricerca del vicino.

link

Quindi, esegui per ogni vettore una ricerca adiacente per ottenere una serie di vettori associati a un'immagine. Quindi unione i set risultanti. Se non trovi nulla aumenta nel tuo campionamento. È possibile utilizzare un calcolo del prodotto con punti calcolato per tutti i confronti vettoriali per ottenere un fattore di somiglianza se si sta cercando una percentuale di somiglianza. (Potrebbe essere intelligente a tale proposito se si confrontano molti componenti poiché renderà le immagini più dissimili di quanto potrebbero sembrare alla vista).

Questa è una panoramica molto approssimativa del data mining dell'albero k-d. Avresti bisogno di leggere un libro di data mining per ottenere la risposta più precisa e altri approcci. (Creare i pesi è un po 'un'arte dato che tocca a te se il colore è più importante del tema o della forma).

    
risposta data 02.10.2015 - 21:00
fonte

Leggi altre domande sui tag