Riconosci le cifre scritte a mano


22

Il tuo compito è leggere un'immagine contenente una cifra scritta a mano, riconoscere e stampare la cifra.

Input: un'immagine in scala di grigi 28 * 28, data come una sequenza di 784 numeri in testo normale da 0 a 255, separati da spazio. 0 significa bianco e 255 significa nero.

Uscita: la cifra riconosciuta.

Punteggio: testerò il tuo programma con 1000 immagini dal set di addestramento del database MNIST (convertito in modulo ASCII). Ho già selezionato le immagini (in modo casuale), ma non pubblicherò l'elenco. Il test deve terminare entro 1 ora e determinerà nil numero di risposte corrette.
ndeve essere almeno 200 affinché il tuo programma sia idoneo. Se la dimensione del codice sorgente è s, il tuo punteggio verrà calcolato come s * (1200 - n) / 1000. Il punteggio più basso vince.

Regole:

  • Il programma deve leggere l'immagine dallo standard input e scrivere la cifra sullo standard output
  • Nessuna funzione OCR integrata
  • Nessuna libreria di terze parti
  • Nessuna risorsa esterna (file, programmi, siti Web)
  • Il tuo programma deve essere eseguibile su Linux utilizzando software liberamente disponibile (Wine è accettabile se necessario)
  • Il codice sorgente deve usare solo caratteri ASCII
  • Pubblica il tuo punteggio stimato e un numero di versione univoco ogni volta che modifichi la tua risposta

Esempio di input:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

A proposito, se si antepone questa riga all'input:

P2 28 28 255

otterrai un file di immagine valido in formato pgm, con colori invertiti / negati.

Ecco come si presenta con i colori corretti: cifra

Esempio di output:

5

Classifica:

No.| Name         | Language   | Alg | Ver | n   | s   |  Score
----------------------------------------------------------------
 1 | Peter Taylor | GolfScript | 6D  | v2  | 567 | 101 |  63.933
 2 | Peter Taylor | GolfScript | 3x3 | v1  | 414 | 207 | 162.702

Correlati, ma non uguali (non una sfida, ma molto utili per trovare i codici in lattice): detexify.kirelabs.org/classify.html . Riconosce anche i numeri.
Justin

1
Possiamo tranquillamente supporre che dobbiamo solo considerare i pixel neri? I> 127 pixel? Cosa possiamo supporre?
Giustino,

2
Soprattutto se questa è una domanda di golf del codice, si prega di limitare l'input in bianco e nero. Le persone fanno carriera intera risolvendo questo problema senza dover contare i caratteri nel loro codice. Non pubblicare quali personaggi hai scelto è un modo per smettere di imbrogliare, e lo rende una specie di scommessa ... e dato che è irragionevole per le persone che scrivono AI qui, il divertimento è fare qualche strano euristico e poi vedere quanto bene lo fa nel torneo vs. competizione.
Dr. Rebmu,

3
@aditsu Sì, chiunque può farlo male. Ma non stai chiedendo che venga fatto male, vuoi che qualcuno "vinca" in una competizione, in cui viene misurato il conteggio dei personaggi. Penso che ridurre un po 'il problema sia più realistico per i risolutori di puzzle per hobbisti. Vincolare l'input sembra un buon inizio per renderlo ragionevole. Suggerirei un pre-pass sull'input per dire che è in bianco e nero.
Dr. Rebmu,

2
@ Dr.Rebmu e chiunque altro voglia un input in bianco e nero: sentiti libero di convertire l'input usando una soglia come 128. Ho controllato e le cifre sono ancora riconoscibili (dal mio cervello). Puoi provare anche altre soglie, potrebbero dare risultati migliori.
aditsu,

Risposte:


6

GolfScript 6D (v2: punteggio stimato 101 * 0.63 ~ = 64)

Questo è un approccio molto diverso alla mia precedente risposta GolfScript, quindi ha più senso pubblicarlo come risposta separata su v1 piuttosto che modificare l'altra risposta e creare questa v2.

~]:B;569'!EM,R.==|%NL2+^=1'{{32-}%95{base}:^~\^}:&~2/{~B=<}%2^10'#]8Y,;KiZfnnRsDzPsvQ!%4C&..z,g,$m'&=

Ungolfed

~]:B;
[30 183 21 378 31 381 7 461 113 543 15 568]
2/{~B=<}%2base
7060456576664262556515119565486100005262700292623582181233639882 10base
=

Spiegazione

Il problema principale è la classificazione dei punti in uno spazio di 784 dimensioni. Un approccio standard è la riduzione dimensionale: identificare un piccolo sottoinsieme di dimensioni che fornisca un potere distintivo sufficiente per effettuare la classificazione. Ho valutato ogni dimensione e ogni possibile soglia per identificare 18 coppie di (dimensione, intervallo di soglia) che sembravano promettenti. Ho quindi selezionato il centro di ciascun intervallo di soglia e valutato i sottoinsiemi a 6 elementi delle 18 coppie. Alla fine ho ottimizzato la soglia per ogni dimensione della migliore proiezione 6-D, migliorandone l'accuratezza dal 56,3% al 56,6%.

Poiché la proiezione è in 6 dimensioni e per ogni dimensione applico una soglia semplice, la tabella di ricerca finale richiede solo 64 elementi. Non sembra essere particolarmente comprimibile, quindi il golf principale è quello di convertire in base entrambe le tabelle di ricerca (l'elenco di dimensioni e soglie; e il vettore di mezzo spazio nella mappa delle cifre) e condividere il codice di conversione di base.


7
Mi hai perso in "spazio 784 dimensionale" ;-)
Digital Trauma,

Temo che ci sia un errore da qualche parte, sto ricevendo solo 37 risposte corrette. Inoltre, stai rendendo le cose un po 'ambigue, potresti aggiungere (1) e (2) (come ho fatto io) o qualcosa di simile ai tuoi titoli?
aditsu,

@aditsu, semplice errore logico. Ora risolto.
Peter Taylor,

Quindi fondamentalmente stai campionando 6 pixel "rilevanti", ognuno con una soglia diversa, ottenendo 6 bit?
aditsu,

@aditsu, esattamente.
Peter Taylor,

5

GolfScript 3x3 (v1: punteggio stimato 207 * 0,8 ~ = 166)

~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'"yN(YZ5B 7k{&w,M`f>wMb>}F2A#.{E6T9kNP_s 3Q?V`;Z\'C-z*kA5M@?l=^3ASH/@*@HeI@A<^)YN_bDI^hgD>jI"OUWiGct%7/U($*;h*<"r@xdTz6x~,/M:gT|\\:#cII8[lBr<%0r&y4'{32-}%95^?^2/{))*~}%=

O in sintesi,

~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'MAGIC STRING'{32-}%95^?^2/{))*~}%=

Spiegazione

Il mio approccio ad alto livello è:

  1. Soglia i pixel: se il pixel è sopra, t1impostalo su 1; altrimenti a 0.
  2. Raggruppa i pixel. Inizialmente ho rotto la griglia 28x28 in una griglia 4x4 (ogni griglia secondaria era 7x7 pixel); ma suddividendolo in una griglia 3x3 (sottogriglie di 10x10, 10x8 o 8x8 pixel) si ottiene una notevole riduzione delle dimensioni della tabella di ricerca mentre si riduce la percentuale di precisione da circa il 56% a circa il 40%.
  3. Somma i pixel in ciascun gruppo e di nuovo la soglia: se il numero di pixel impostati è superiore, t2segna il gruppo come 1; altrimenti come 0.
  4. Esegui una ricerca tabella dal vettore dei punteggi di gruppo. (La tabella viene compressa utilizzando la codifica di lunghezza di esecuzione e il trucco standard di conversione di base. La maggior parte delle scelte di t1e t2lascia tra il 50% e il 63% della tabella come valori "non importa", che possono essere combinati con valori adiacenti per aumentare lunghezze della corsa; la lunghezza media della corsa nella mia tabella v1 è 3.6).

Si scopre che l'impostazione t1=t2=0, sebbene non ottimale, non è lontana dai migliori valori t1e t2in termini di precisione; è abbastanza buono in termini di compressibilità della tabella; e mi permette di combinare le due operazioni di soglia in []*0-!!(appiattire l'array 2D a 1D; rimuovere 0s; verificare se è vuoto).

La tabella di ricerca fornisce il candidato più probabile per il dato vettore di punteggi di gruppo. Potrebbe essere possibile migliorare il punteggio identificando le voci della tabella che possono essere modificate in modo tale che la migliorata comprimibilità della tabella superi la precisione ridotta.


Fantastico, avevo un'idea simile ma non immaginavo che potesse comprimere così bene. Ora sto pensando di aver bisogno di una maggiore enfasi sull'accuratezza: p ma non ho intenzione di cambiarlo.
aditsu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.