Classifying Cifre
È chiarito nei commenti che hai già isolato la parte numero dell'immagine pre-rilevamento, quindi inizierò sotto quel presupposto.
Forse è possibile approssimare gli effetti prospettiva e la "sfocatura" del numero trattandolo come un numero scritto a mano. In questo caso, esiste un famoso set di numeri scritti a mano per l'allenamento di classificazione chiamato mnist.
Yann LeCun ha elencato lo stato dell'arte su questo set di dati qui mnist hand-written dataset.
All'estremità dello spettro, le reti neurali convoluzionali producono outrageously low error rates (frazioni dell'1% di errore). Per una soluzione più semplice, i k-vicini più vicini che utilizzano l'allineamento, la rimozione del rumore, l'offuscamento e lo spostamento di 2 pixel, hanno prodotto un errore di circa l'1% ed è notevolmente più veloce da implementare. Python opencv has an implementation. Anche le reti neurali e le macchine vettoriali di supporto con il raddrizzamento hanno delle prestazioni piuttosto sorprendenti.
Nota che le reti convoluzionali non ti fanno scegliere le tue caratteristiche, quindi le importanti informazioni sul differenziale di colore qui potrebbero essere utilizzate solo per restringere la regione di interesse. Altri approcci, in cui definisci lo spazio delle tue funzionalità, potrebbero incorporare la differenza cromatica nota in modo più preciso.
Python supporta molte tecniche di apprendimento automatico nel fantastico pacchetto sklearn - here are examples of sklearn applied to mnist. Se siete alla ricerca di una spiegazione tutorialized di machine learning in python, sklearn's own tutorial is very verbose
Dal link sklearn:
Questi sono i tipi di elementi che si sta cercando di classificare se si impara di utilizzare questo approccio. Per sottolineare quanto sia facile per iniziare la formazione alcune di queste macchine classificatori di apprendimento basati su, qui è una sezione ridotta dal codice di esempio nel pacchetto sklearn collegato:
digits = datasets.load_digits() # built-in to sklearn!
data = digits.images.reshape((len(digits.images), -1))
# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)
# We learn the digits on the first half of the digits
classifier.fit(data[:n_samples/2], digits.target[:n_samples/2])
Se stai sposata a OpenCV (forse perché vuoi portarlo su un sistema in tempo reale in futuro), opencv3/python has a tutorial on this exact topic too! La loro demo utilizza k-closest-neighbor (elencato nella pagina LeCun), ma anche have svms e molti altri strumenti di sklearn.La loro pagina OCR utilizzando SVM utilizza raddrizzamento, che potrebbe essere utile con l'effetto prospettico nel vostro problema:
UPDATE: Ho usato l'out-of-the box skimage approccio descritto sopra su la tua immagine, fortemente ritagliata, e lo ha classificato correttamente . Un molto ulteriori test sarebbe necessario per vedere se questo è in pratica rhobust
^^ Quell'immagine piccola è la coltura 8x8 dell'immagine è stato incorporato nella sua interrogazione. mnist è immagini 8x8. Ecco perché si allena in meno di un secondo con argomenti predefiniti in skimage.
ho convertito che il formato corretto scalando fino alla gamma mnist utilizzando
number = scipy.misc.imread("cropped_image.png")
datum = (number[:,:,0]*15).astype(int).reshape((64,))
classifier.predict(datum) # returns 8
non ho cambiato niente altro dall'esempio; qui, sto solo usando il primo canale per la classificazione e nessun calcolo di funzioni intelligenti. 15 mi è sembrato giusto; sarà necessario sintonizzare per ottenere all'interno della gamma di destinazione o (idealmente) fornire la propria formazione e testing set
Object Detection
Se non è stato isolato il numero nell'immagine avrai bisogno di un rilevatore di oggetti. Lo spazio della letteratura su questo problema è gigantesco e non inizierò a scavare quella tana del coniglio (google Viola e Jones, forse?) This blog copre i fondamenti di un rivelatore a "finestra scorrevole" in python. Ad Adrian Rosebrock sembra che sia anche un contributore su SO, e quella pagina ha alcuni buoni esempi di rivelatori di oggetti basati su python e opencv e abbastanza tutorializzati (in realtà tu hai collegato quel blog alla tua domanda, non me ne sono reso conto).
In breve, classificare le finestre sull'immagine e selezionare la finestra di massima confidenza. Restringendo lo spazio di ricerca con una regione di interesse volontà di rendimento ovviamente enormi miglioramenti in tutte le aree di performance
La multi-scala non aiuta a risolvere l'immagine in modo più chiaro, sfortunatamente. Inoltre, avrai bisogno di riconoscere più font o dare priorità ai caratteri che riconoscerai (come il numero sopra). Dai un'occhiata a [questa domanda correlata] (http://stackoverflow.com/questions/7765810/is-there-a-way-to-detect-if-an-image-is-blurry) – Aaron3468
Ecco alcuni degli ultimi approcci di ricerca: 1) [Riconoscimento numerico a più cifre dalle immagini di Street View utilizzando Deep Neurevision Networks Convolutional] (http://research.google.com/pubs/pub42241.html); 2) [Reading Text in the Wild] (http://www.robots.ox.ac.uk/~vgg/research/text/). La rete neurale convoluzionale profonda è il mattone di base comune per questi approcci. – Jon