8

4 anni fa ho pubblicato this question e ho ottenuto alcune risposte che sfortunatamente erano al di fuori del mio livello di abilità. Ho appena assistito a una conferenza del tour di costruzione in cui hanno parlato dell'apprendimento automatico e questo mi ha fatto pensare alla possibilità di utilizzare ML come soluzione al mio problema. ho trovato this sul sito azzurro, ma non penso che mi aiuterà perché il suo ambito è piuttosto stretto.Usa la macchina di Azure imparando a rilevare il simbolo all'interno di un'immagine

Ecco quello che sto cercando di realizzare:

ho un immagine di origine:

source image

e voglio che uno dei seguenti simboli (se presenti) sono contenuti nel sopra:

symbols

la confronta necessità di sostenere distorsione minore, scalatura, co Per differenze, rotazione e differenze di luminosità.

il numero di simboli per abbinare alla fine almeno essere maggiore di 100.

è ML un valido strumento per risolvere questo problema? se sì, qualche consiglio di partenza?

risposta

18

Per quanto ne so, Project Oxford (API Azure CV MS) non è adatto per l'attività. Le loro API sono molto focalizzate sulle attività relative al volto (rilevamento, verifica, ecc.), OCR e descrizione dell'immagine. E a quanto pare non puoi estendere i loro modelli o addestrarne di nuovi da quelli esistenti.

Tuttavia, anche se non conosco una soluzione pronta per il rilevamento di oggetti; ci sono approcci abbastanza semplici che potresti provare e che ti darebbero dei risultati di punto di partenza.

Per esempio, ecco un metodo ingenuo si può usare:

1) Creare il set di dati: Questo è probabilmente il passo più noioso e, paradossalmente cruciale. Immagino che tu abbia una buona quantità di immagini con cui lavorare. Quello che dovresti fare è scegliere una dimensione fissa della finestra ed estrarre esempi positivi e negativi. enter image description here

Se alcune delle immagini nel set di dati sono di dimensioni diverse, è necessario ridurle a una dimensione comune. Non è necessario diventare troppo pazzi per le dimensioni, probabilmente le immagini 30x30 sarebbero più che sufficienti. Per semplificare le cose, trasformo anche le immagini in scala di grigi.

2) Scegliere un algoritmo di classificazione e addestrarlo: C'è una quantità terribile di algoritmi di classificazione là fuori. Ma se sei nuovo nell'apprendimento automatico sceglierò quello che comprenderò di più. Tenendo questo a mente, darei un'occhiata alla regressione logistica che dà risultati decenti, è abbastanza facile per i principianti e ha un sacco di librerie ed esercitazioni. Ad esempio, this one o this one. All'inizio direi di concentrarsi su un problema di classificazione binaria (come se ci fosse un logo UD nella foto o meno) e quando si padroneggia quello si può passare al caso multi-classe. Ci sono risorse per questo too oppure puoi sempre avere più modelli uno per logo ed eseguire questa ricetta per ognuno separatamente.

Per addestrare il modello, è sufficiente leggere le immagini generate nel passaggio 1 e trasformarle in un vettore ed etichettarle di conseguenza. Quello sarebbe il set di dati che alimenterà il tuo modello. Se si utilizzano le immagini in scala di grigi, ciascuna posizione nel vettore corrisponderebbe a un valore di pixel compreso tra 0 e 255. A seconda dell'algoritmo, potrebbe essere necessario ridimensionare tali valori nell'intervallo [0-1] (questo perché alcuni algoritmi hanno prestazioni migliori con valori compresi nell'intervallo). Si noti che la riscalatura dell'intervallo in questo caso è abbastanza semplice (new_value = value/255).

È inoltre necessario suddividere il set di dati, riservando alcuni esempi per la formazione, un sottoinsieme per la convalida e un altro per il test. Ancora una volta, ci sono diversi modi per farlo, ma sto mantenendo questa risposta il più ingenua possibile.

3) Eseguire il rilevamento: Quindi ora iniziamo la parte divertente. Data qualsiasi immagine che si desidera eseguire il modello e produrre le coordinate nella foto in cui vi è un logo. Ci sono diversi modi per farlo e ne descriverò uno che probabilmente lo non è il migliore né il più efficiente, ma è più facile da sviluppare secondo me.

Si sta eseguendo la scansione dell'immagine, estraendo i pixel in una "finestra", ridimensionando tali pixel alla dimensione selezionata al passaggio 1 e quindi alimentandoli al modello.

Extracting windows to feed the model

Se il modello vi darà una risposta positiva, allora si contrassegna quella finestra nell'immagine originale. Poiché il logo potrebbe apparire in scale diverse, è necessario ripetere questo processo con finestre di dimensioni diverse. Dovresti anche modificare la quantità di spazio tra le finestre.

4) Sciacquare e ripetere: alla prima iterazione è molto probabile che si otterrà un sacco di falsi positivi. Quindi è necessario prendere quelli come esempi negativi e riqualificare il modello. Questo sarebbe un processo iterativo e si spera che in ogni iterazione si ottengano sempre meno falsi positivi e meno falsi negativi.

Una volta che si è ragionevoli soddisfatti della soluzione, si potrebbe desiderare di migliorarla. Potresti provare altri algoritmi di classificazione come SVM o Deep Learning Artificial Neural Networks o provare strutture di rilevamento di oggetti migliori come Viola-Jones. Inoltre, probabilmente dovrai usare crossvalidation per confrontare tutte le tue soluzioni (puoi effettivamente utilizzare la crossvalidation dall'inizio). A questo punto, scommetto che saresti abbastanza sicuro che vorresti usare OpenCV o un altro framework pronto per l'uso, nel qual caso avrai una buona comprensione di cosa sta succedendo sotto il cofano.

Inoltre è possibile ignorare tutta questa risposta e andare per un tutorial di rilevamento di oggetti OpenCV come questo one. Oppure prendi un'altra risposta da un'altra domanda come questa one. In bocca al lupo!

+1

wow, che risposta. Lo apprezzo molto. sfortunatamente ho saltato la lezione di computer vision al college, quindi mi ci vorrà del tempo per superare tutti i link e le informazioni che hai fornito. Non voglio ancora contrassegnarlo come risposta perché volevo vedere se potevo usare Azure ML (non il progetto oxford) che probabilmente riassume parte di ciò che hai scritto sopra e idealmente abbasserebbe la curva di apprendimento a una soluzione funzionante. Ho postato questa domanda (http://bit.ly/1FmU05e) anche ai forum di msdn. – josh

+1

@josh Cool ... Facci sapere come va. L'ultima volta che ho provato Azure ML Studio non ha funzionato direttamente con le immagini (a meno che non si usi il progetto oxford) ma dovrebbe essere possibile se si scrivono gli script R per trasformare i dati da binari in testo e viceversa. – Pedrom

Problemi correlati