Somiglianza immagine e testo | Introduzione alla somiglianza di immagini e testi

Contenuti

introduzione

Analisi e mappatura delle immagini in Earth Engine utilizzando NDVI ", ora è di nuovo un altro articolo sull'analisi delle immagini. A differenza del precedente articolo, questo articolo analizza generale analisi dell'immagine, no Immagine satellitare analisi. L'obiettivo di questa discussione è rilevare se due prodotti sono uguali o meno.. Ciascuno dei due prodotti ha nomi di immagini e di testo. Se la coppia di prodotti ha immagini o nomi di testo simili o uguali, ciò significa che i due prodotti sono gli stessi. I dati provengono da un concorso tenutosi a Kaggle.

Ci sono 4 pacchetti di base usati in questo script: NumPy, panda, matplotlib y seaborn. Ci sono anche altri pacchetti specifici. “Immagine” caricare e visualizzare i dati dell'immagine. “Imagehash” calcola la somiglianza di due immagini. “Fuzzywuzzy” rileva la somiglianza di due testi. Il “metrica” Il pacchetto calcola il punteggio di precisione dell'etichetta vera e dell'etichetta prevista.

# importare pacchetti
importa numpy come np
importa panda come pd
importa matplotlib.pyplot come plt
import seaborn come sns
da PIL import Immagine
import imagehash
da fuzzywuzzy import fuzz
da sklearn.tree import DecisionTreeClassifier
da sklearn import metrics

Somiglianza immagine

La somiglianza delle due immagini viene rilevata dal pacchetto “imagehash”. Se due immagini sono identiche o quasi identiche, la differenza di hash dell'immagine sarà 0. Due immagini sono più simili se la differenza di hash dell'immagine è più vicina a 0.

Il confronto della somiglianza di due immagini con imagehash consiste in 5 Passi. (1) Le immagini vengono convertite in scala di grigi. (2) Le dimensioni delle immagini sono ridotte per essere più piccole, ad esempio, un 8 × 8 pixel per impostazione predefinita. (3) Il valore medio di 64 pixel. (4) Viene verificato se il 64 i pixel sono maggiori del valore medio. Ora, ognuno di 64 pixel ha un valore booleano vero o falso. (5) La differenza tra le immagini è il numero di valori diversi tra le due immagini. Guarda la seguente illustrazione.

Immagine_1 (media: 71,96875)

48

20

34

40

40

32

30

32

34

210

38

50

42

41

230

40

47

230

33

44

34

50

245

50

43

230

46

50

36

34

250

30

30

200

190

38

41

240

39

39

38

7

200

210

220

240

50

48

48

8

45

43

47

37

37

47

10

8

6

5

6

6

5

5

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

CERTO

CERTO

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

CERTO

CERTO

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

Immagine_2 (media: 78,4375)

41

20

39

43

34

39

30

32

35

195

44

46

35

48

232

40

30

243

38

31

34

46

213

50

49

227

44

33

35

224

230

30

46

203

225

44

46

181

184

40

38

241

247

220

228

210

36

38

42

8

35

39

47

31

41

21

3

12

10

18

24

21

6

17

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

CERTO

CERTO

IMPOSTORE

IMPOSTORE

CERTO

CERTO

IMPOSTORE

IMPOSTORE

CERTO

CERTO

IMPOSTORE

IMPOSTORE

CERTO

CERTO

CERTO

CERTO

CERTO

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

IMPOSTORE

La differenza dell'immagine hash delle due immagini / sopra le matrici è 3. Vuol dire che c'è 3 pixel con diversi valori booleani. Le due immagini sono relativamente simili.

Per maggiore chiarezza, Esaminiamo l'hash dell'immagine applicato a quanto segue 3 coppie di immagini. La prima coppia è composta da due immagini uguali e la differenza tra le immagini è 0. La seconda coppia confronta due immagini simili. La seconda foto (image_b) in realtà è una versione modificata della prima immagine (immagine_a). La differenza tra le immagini è 6. L'ultima coppia mostra il confronto di due immagini totalmente diverse. La differenza dell'immagine hash è 30, qual è il più lontano da 0.

897791-3292547
Fig.1 hash immagine
# Prima coppia
hash1 = imagehash.average_hash(Immagine.apri('D: /immagine_a.jpg'))
hash2 = imagehash.average_hash(Immagine.apri('D:/ immagine_a.jpg'))
diff = hash1 - hash2
Stampa(differenza)
# 0
# Seconda coppia
hash1 = imagehash.average_hash(Immagine.apri('D: /immagine_a.jpg'))
hash2 = imagehash.average_hash(Immagine.apri('D:/ immagine_b.jpg'))
diff = hash1 - hash2
Stampa(differenza)
# 6
# Terza coppia
hash1 = imagehash.average_hash(Immagine.apri('D: /immagine_a.jpg'))
hash2 = imagehash.average_hash(Immagine.apri('D:/ immagine_c.jpg'))
diff = hash1 - hash2
Stampa(differenza)
# 30

Ecco come appare l'hash medio dell'immagine

>imagehash.average_hash(Immagine.apri('D:/immagine_a.jpg'))
Vettore([[ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [falso,  Vero, falso, falso, falso, falso, falso, falso],
       [ Vero,  Vero, falso, falso, falso, falso, falso, falso],
       [falso, falso, falso,  Vero, falso, falso, falso, falso],
       [falso, falso, falso,  Vero, falso, falso, falso, falso],
       [falso, falso, falso, falso, falso, falso, falso, falso]])
>imagehash.average_hash(Immagine.apri('D:/immagine_b.jpg'))
Vettore([[ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [falso,  Vero,  Vero,  Vero,  Vero, falso, falso, falso],
       [ Vero,  Vero,  Vero, falso, falso, falso, falso, falso],
       [ Vero,  Vero, falso, falso, falso, falso, falso, falso],
       [falso, falso, falso,  Vero, falso, falso, falso, falso],
       [falso, falso, falso,  Vero, falso, falso, falso, falso],
       [falso, falso, falso, falso, falso, falso, falso, falso]])
>imagehash.average_hash(Immagine.apri('D:/immagine_c.png'))
Vettore([[falso, falso, falso, falso, falso, falso, falso, falso],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [ Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero,  Vero],
       [falso, falso, falso, falso,  Vero, falso, falso, falso],
       [falso, falso, falso, falso, falso, falso, falso, falso]])

Somiglianza del testo

La somiglianza del testo può essere valutata utilizzando l'elaborazione del linguaggio naturale (PNL). Ci sono 4 modi per confrontare la somiglianza di una coppia di testi forniti dal pacchetto “fuzzywuzzy”. La funzione in questo pacchetto restituisce un valore intero di 0 un 100. Il valore più alto significa la massima somiglianza.

1. rapporto fuzz – è il più semplice confronto di testi. Il valore del fuzz.ratio di “camicia blu” e “camicia blu”. è 95. Significa che i due testi sono simili o quasi uguali, ma il punto li rende un po' diversi

da fuzzywuzzy import fuzz
rapporto fuzz('camicia blu','camicia blu.')
#95

La misurazione si basa sulla distanza di Levenshtein (chiamato per Vladimir Levenshtein). La distanza di Levenshtein misura quanto sono simili due testi. Misura il numero minimo di modifiche, come inserire, eliminare o sostituire un testo in un altro testo. Il testo “Camicia blu” richiede solo una modifica per essere “camicia blu”. Basta un solo punto per essere lo stesso. Perciò, la distanza di Levenshtein è “1”. La relazione fuzz viene calcolata con questa equazione (len (un) + len (B) – lev) / ((len (un) + len (B), dove len (un) y len (B) sono le lunghezze del primo e del secondo testo, e lev è la distanza di Levenshtein La relazione è (10 + 11 – 1) / (10 + 11) = 0,95 oh 95%.

2. fuzz.partial_ratio: può rilevare se un testo fa parte di un altro testo. Ma non è in grado di rilevare se il testo è in un ordine diverso. L'esempio seguente mostra che “camicia blu” Fa parte di “camicia azzurra pulita”, quindi fuzz.partial_ratio è 100. fuzz.ratio restituisce il valore 74 perché rileva solo che c'è molta differenza tra i due testi.

Stampa(rapporto fuzz('camicia blu','camicia blu pulita.'))
#74
Stampa(fuzz.partial_ratio('camicia blu','camicia blu pulita.'))
#100

3. Token_Sort_Ratio: può rilevare se un testo fa parte di un altro testo, anche se sono in un ordine diverso. Fuzz.token_sort_ratio devuelve 100 per il testo “cappello pulito e camicia azzurra” e “camicia azzurra e cappello pulito” perché in realtà significano la stessa cosa, ma sono in ordine inverso.

Stampa(rapporto fuzz("cappello pulito e camicia blu","camicia blu e cappello pulito"))
#42
Stampa(fuzz.partial_ratio("cappello pulito e camicia blu","camicia blu e cappello pulito"))
#42
Stampa(fuzz.token_sort_ratio("cappello pulito e camicia blu","camicia blu e cappello pulito"))
#100

4. Token_Set_Ratio: può rilevare la somiglianza del testo considerando il testo parziale, l'ordine del testo e le diverse lunghezze del testo. Puoi rilevare che il testo "cappello pulito" e "camicia blu" fa parte del testo "La gente vuole indossare una maglietta blu e un cappello pulito" in un ordine diverso. In questo studio, Usiamo solo "Token_Set_Ratio" poiché è il più adatto.

Stampa(rapporto fuzz("cappello pulito e camicia blu","La gente vuole indossare una maglia azzurra e un cappello pulito"))
#53
Stampa(fuzz.partial_ratio("cappello pulito e camicia blu","La gente vuole indossare una maglia azzurra e un cappello pulito"))
#62
Stampa(fuzz.token_sort_ratio("cappello pulito e camicia blu","La gente vuole indossare una maglia azzurra e un cappello pulito"))
#71
Stampa(fuzz.token_set_ratio("cappello pulito e camicia blu","La gente vuole indossare una maglia azzurra e un cappello pulito"))
#100

La siguiente celda cargará el conjunto de datos de addestramento y agregará características de hash, così come la proporzione del set di token.

# caricare il set di allenamento
trainingSet = pd.read_csv('D:/new_training_set.csv', index_col=0).reset_index()
# Calcola la differenza di hash dell'immagine
hashDiff = []
per me in trainingSet.index:
    hash1 = imagehash.average_hash(Immagine.apri(percorso_img + trainingSet.iloc[io,2]))
    hash2 = imagehash.average_hash(Immagine.apri(percorso_img + trainingSet.iloc[io,4]))
    diff = hash1 - hash2
    hashDiff.append(differenza)
trainingSet = trainingSet.iloc[:-1,:]
set di allenamento['hash'] = hashDiff
# Calcola token_set_ratio
Token_test = []
per me in trainingSet.index:
    TokenSet = fuzz.token_set_ratio(trainingSet.iloc[io,1], trainingSet.iloc[io,3])
    Set di token = (io, Set di token)
    Token_tes.append(Set di token)
dfToken = pd.DataFrame(token_test)
set di allenamento['Gettone'] = dfToken

Di seguito è riportata l'illustrazione del set di dati di allenamento. In realtà, non è il set di dati originale perché il set di dati originale non è in lingua inglese. Creo un altro dato in inglese per capirlo. Ogni riga ha due prodotti. Le colonne “Testo 1” e “immagine 1” appartengono al primo prodotto. Le colonne “testo_2” e “immagine_2” appartengono al secondo prodotto. "Etichetta" definisce se i prodotti corrispondenti sono gli stessi (1) o no (0). Nota che ci sono altre due colonne: “hash” e “tokenSet”. Queste due colonne vengono generate, non dal set di dati originale, ma dal codice precedente.

indiceTesto 1immagine_1testo_2immagine_2EtichettaHashtokenSet
0Camicia bluGdsfdfs.jpgCamicia blu.Safsfs.jpg16100
1Cappello pulitoFsdfsa.jpgPantaloni pulitiYjdgfbs.jpg02571
2topoDfsdfasd.jpgtopoFgasfdg.jpg030100
. . .. . .. . .. . .. . .. . .. . .. . .

Applicare l'apprendimento automatico

Ora, sappiamo che una differenza di Imagehash più bassa e un Token_Set_Ratio più alto indicano che è più probabile che una coppia di prodotti sia la stessa. Il valore più basso di imagehash è 0 e il valore più alto di Token_Set_Ratio è 100. Ma, la domanda è quanto sono le soglie. Per impostare le soglie, possiamo usare il classificatore dell'albero decisionale.

Un modello di apprendimento automatico dell'albero decisionale viene creato utilizzando il set di dati di addestramento. L'algoritmo di apprendimento automatico troverà il modello di differenza dell'hash dell'immagine e il rapporto del set di token di prodotti identici e diversi. L'albero decisionale viene visualizzato per l'immagine di copertina di questo articolo. Il codice seguente crea un modello di albero decisionale con Python. (Ma, la visualizzazione dell'immagine di copertina è l'albero decisionale generato con R perché, secondo me, R visualizza l'albero decisionale in un modo più piacevole). Dopo, riproverà il set di dati di allenamento. Finalmente, possiamo ottenere la precisione.

# Crea classificatore albero decisionale: hash e set di token
Dtc = DecisionTreeClassifier(profondità_max=4) 
Dtc = Dtc.fit(trainingSet.loc[:,['hash', 'insieme di gettoni']],
              trainingSet.loc[:,'Etichetta'])
Predizione2 = Dtc.predict(trainingSet.loc[:,['hash', 'insieme di gettoni']])
metrics.accuracy_score(trainingSet.loc[:,'Etichetta'], Pronostico2)

L'albero decisionale viene utilizzato per prevedere nuovamente la classificazione del set di dati di addestramento. La precisione è 0,728. In altre parole, il 72,8% del set di dati di allenamento è previsto correttamente.

Dall'albero delle decisioni, possiamo estrarre l'informazione che se la differenza di Imagehash è inferiore a 12, la coppia di prodotti è classificata come identica. Se la differenza di Imagehash è maggiore o uguale a 12, dobbiamo controllare il valore Token_Set_Ratio. El Token_Set_Ratio inferiore a 97 confermare che la coppia di prodotti è diversa. Altrimenti, ricontrolla se il valore della differenza di Imagehash. Se la differenza dell'immagine hash è maggiore o uguale a 22, allora i prodotti sono identici. Altrimenti, i prodotti sono diversi.

Applica per testare il set di dati

Ora, caricheremo il set di dati di prova, genereremo la differenza Imagehash e Token_Set_Ratio, e infine pronosticare se ogni coppia di prodotti corrisponde.

# percorso verso l'immagine
path_img = 'D:/prova_img/'
# set di prova di carico
test = pd.read_csv('D:/nuovo_set_test.csv', index_col=0).reset_index()
# lista hashDiff
hashDiff = []
# Calcola la differenza dell'immagine
per me in test.index[:100]:
    hash1 = imagehash.average_hash(Immagine.apri(percorso_img + test.iloc[io,2]))
    hash2 = imagehash.average_hash(Immagine.apri(percorso_img + test.iloc[io,4]))
    diff = hash1 - hash2
    hashDiff.append(differenza)
test['hash'] = hashDiff
# Token_set list
Token_set = []
# Calcola la differenza di testo usando il set di token
per me in test.index:
    TokenSet = fuzz.token_set_ratio(test.iloc[io,1], test.iloc[io,3])
    Token_set.append(Set di token)
test['gettone'] = Token_set

Dopo aver calcolato la differenza di Imagehash e Token_Set_ratio, la prossima cosa che devi fare è applicare l'albero decisionale per il rilevamento della corrispondenza del prodotto.

# Rilevamento della corrispondenza del prodotto
test['etichettaPredizione'] = np.dove(test['hash']<12, 1,
                               np.dove(test['gettone']<97, 0,
                                        np.dove(test['hash']>=22, 0, 1)))
# o
test['etichettaPredizione'] = Dtc.predict(test[['hash','gettone']])
indiceTesto 1immagine_1testo_2immagine_2HashtokenSetlabelPredict
0matitaFdfgsdfhg.jpgpenna a sferaAdxsea.jpg8331
1disco fissoSgytueyuyt.jpgun buon disco rigidoErewbva.jpg201001
2brutta copiaSadssadad.jpgstazionarioSafdfgs.jpg25250
. . .. . .. . .. . .. . .. . .. . .. . .

La tabella sopra è l'illustrazione del risultato finale. L'obiettivo di questo articolo è dimostrare come prevedere se due immagini e due testi sono simili o uguali. Potresti scoprire che il modello di apprendimento automatico utilizzato è abbastanza semplice e non esiste alcuna ottimizzazione o suddivisione degli iperparametri dei dati di addestramento e test. L'altra app di machine learning, come i metodi di insiemi basati su alberi, può aumentare la precisione. Ma non è il nostro punto focale della discussione qui. Se sei interessato a imparare un altro machine learning basato su alberi più accurato dell'albero decisionale, cerca un articolo qui.

Circa l'autore

Connettiti con me qui https://www.linkedin.com/in/rendy-kurnia/

Il supporto mostrato in questo articolo non è di proprietà di DataPeaker e viene utilizzato a discrezione dell'autore.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.