è relativo alla libray libpuzzle per php (http://libpuzzle.pureftpd.org/project/libpuzzle) di Mr. Frank Denis. Sto cercando di capire come indicizzare e memorizzare i dati nel mio database mysql. La generazione del vettore non è assolutamente un problema.Libpuzzle Indicizzazione milioni di immagini?
Esempio:
# Compute signatures for two images
$cvec1 = puzzle_fill_cvec_from_file('img1.jpg');
$cvec2 = puzzle_fill_cvec_from_file('img2.jpg');
# Compute the distance between both signatures
$d = puzzle_vector_normalized_distance($cvec1, $cvec2);
# Are pictures similar?
if ($d < PUZZLE_CVEC_SIMILARITY_LOWER_THRESHOLD) {
echo "Pictures are looking similar\n";
} else {
echo "Pictures are different, distance=$d\n";
}
Questo è tutto chiaro per me - ma ora come faccio a lavorare quando ho una grande quantità di immagini> 1.000.000? Calcolo il vettore e lo memorizzo con il nome file nel database? Come trovare le immagini simili ora? Se immagazzino ogni vettore nel mysql devo aprire ogni record e calcolare la distanza con la funzione puzzle_vector_normalized_distance. Che le procedure prende un sacco di tempo (aperto ogni voce del database - ha messo gettare la funzione, ...)
ho letto il readme dal libaray di puzzle lib e trovato il seguente:
Funzionerà con un database che ha milioni di immagini?
Una tipica firma di immagine richiede solo 182 byte, utilizzando le funzioni di compressione/decompressione integrate .
firme simili condividono "parole" identiche, vale a dire. sequenze identiche di valori nelle stesse posizioni. Usando gli indici composti (parola + posizione), l'insieme di possibili vettori simili è drammaticamente ridotto a e, nella maggior parte dei casi, non viene calcolata la distanza vettoriale necessaria a .
L'indicizzazione tramite parole e posizioni facilita inoltre la suddivisione dei dati in più tabelle e server.
Quindi sì, la libreria Puzzle non è certo incompatibile con i progetti che devono indicizzare milioni di immagini.
Inoltre ho trovato questa descrizione sul indexing:
------------------------ INDEXING ----- -------------------
Come trovare rapidamente immagini simili, se sono milioni di record?
La carta originale ha una risposta semplice ma efficace.
Taglia il vettore in parole a lunghezza fissa. Per esempio, prendiamo in considerazione il seguente vettore:
[abcdefghijklmnopqrstu vwxyz]
Con una lunghezza di parola (K) di 10, è possibile ottenere le seguenti parole:
[abcdefghij] trovato alla posizione 0 [bcdefghijk] trovato in posizione 1 [cdefghijkl] trovato in posizione 2 ecc fino alla posizione N-1
Poi, indicizzare il vettore con un indice composto di (parola + posizione).
Anche con milioni di immagini, K = 10 e N = 100 dovrebbero essere sufficienti per avere pochissime voci che condividono lo stesso indice.
Ecco uno schema di database di esempio molto semplice:
+-----------------------------+
| signatures |
+-----------------------------+
| sig_id | signature | pic_id |
+--------+-----------+--------+
+--------------------------+
| words |
+--------------------------+
| pos_and_word | fk_sig_id |
+--------------+-----------+
io consiglierei scissione almeno tabella "parole" in molteplici tavoli e/o server.
Per impostazione predefinita (lambas = 9) le firme sono lunghe 544 byte. Per salvare lo spazio di archiviazione , è possibile comprimerli a 1/3 delle loro dimensioni originali tramite la funzione puzzle_compress_cvec(). Prima dell'uso, devono essere decompressi con puzzle_uncompress_cvec().
Penso che la compressione sia la causa sbagliata, quindi devo decomprimere ogni vettore prima di confrontarlo.
La mia domanda è ora - qual è il modo di gestire milioni di immagini e come confrontarle in modo rapido ed efficiente. Non capisco come il "taglio del vettore" dovrebbe aiutarmi con il mio problema.
Mille grazie - forse posso trovare qualcuno qui che sta lavorando con libaray libpuzzle.
Cheers.
Questa è una buona informazione - grazie. Giusto per chiarire, hai agito in questo modo - o è solo "in teoria"? Non influenzerà la generosità, ma sarà sicuramente interessata a vedere un'implementazione funzionante. In particolare, sembra che i tuoi indici potrebbero aver bisogno di modifiche per eseguire query efficienti. – barryhunter
È una teoria, non ho esperienza diretta con libpuzzle, ho appena pensato di fornire del codice per espandere gli esempi della documentazione di libpuzzle principalmente come esercizio. – Jason
nota rapida ... abbiamo effettivamente implementato il (leggermente modificato) sopra ... funziona come un fascino! e ... ecco, un po 'più accurato poi eseguendo il puzzle confronta le funzioni immagine vs immagine ... finora abbiamo sperimentato con forza di 20 ... e praticamente stiamo ottenendo risultati accurati al 100% per i nostri 4 milioni di immagini forti base ... grazie !!! –