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.
# 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 addestramentoLa formazione è un processo sistematico volto a migliorare le competenze, conoscenze o abilità fisiche. Viene applicato in vari ambiti, come lo sport, Formazione e sviluppo professionale. Un programma di allenamento efficace include la pianificazione degli obiettivi, Pratica regolare e valutazione dei progressi. L'adattamento alle esigenze individuali e la motivazione sono fattori chiave per ottenere risultati di successo e sostenibili in qualsiasi disciplina.... 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.
indiceIl "Indice" È uno strumento fondamentale nei libri e nei documenti, che consente di individuare rapidamente le informazioni desiderate. In genere, Viene presentato all'inizio di un'opera e organizza i contenuti in modo gerarchico, compresi capitoli e sezioni. La sua corretta preparazione facilita la navigazione e migliora la comprensione del materiale, rendendolo una risorsa essenziale sia per gli studenti che per i professionisti in vari settori.... | Testo 1 | immagine_1 | testo_2 | immagine_2 | Etichetta | Hash | tokenSet |
0 | Camicia blu | Gdsfdfs.jpg | Camicia blu. | Safsfs.jpg | 1 | 6 | 100 |
1 | Cappello pulito | Fsdfsa.jpg | Pantaloni puliti | Yjdgfbs.jpg | 0 | 25 | 71 |
2 | topo | Dfsdfasd.jpg | topo | Fgasfdg.jpg | 0 | 30 | 100 |
. . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . |
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']])
indice | Testo 1 | immagine_1 | testo_2 | immagine_2 | Hash | tokenSet | labelPredict |
0 | matita | Fdfgsdfhg.jpg | penna a sfera | Adxsea.jpg | 8 | 33 | 1 |
1 | disco fisso | Sgytueyuyt.jpg | un buon disco rigido | Erewbva.jpg | 20 | 100 | 1 |
2 | brutta copia | Sadssadad.jpg | stazionario | Safdfgs.jpg | 25 | 25 | 0 |
. . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . |
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.
Imparentato
Articoli correlati:
- Somiglianza immagine | Implementa la somiglianza delle immagini in Python
- Super risoluzione dell'immagine | Apprendimento profondo per la super risoluzione delle immagini
- Filigrana immagini utilizzando OpenCV | Come contrassegnare un'immagine con OpenCV
- Classificazione delle immagini della CNN | Classificazione delle immagini utilizzando la CNN