Hva vi lærte av å måle sudokufotoleseren vår
Oppdatert 5. november 2026
Hva som regnes som lest riktig
En oppgave er bare lest riktig hvis alle 81 rutene er riktige: ett feil siffer gir en annen oppgave. Derfor teller vi hele oppgaver, ikke ruter. De to kan fortelle svært ulike historier, som denne siden viser: på trykte fotografier får leseren nå 98,9 % av rutene riktig, men andelen hele oppgaver har knapt endret seg, fordi de fleste feilleste rutene finnes i noen få vanskelige bilder.
Vi teller også den farligste feilen: en oppgave som er lest feil, men som likevel har nøyaktig én løsning. En ekte sudoku har én løsning, så en avlesning med ingen eller mange løsninger blir fanget opp med en gang. En feil oppgave med én løsning ser grei ut, og derfor markerer løseren hver rute den var usikker på, og ber deg sammenligne dem med oppgaven din før den løser oppgaven.
Med 200 bilder har et resultat begrenset presisjon. For hovedresultatene oppgir vi et område med 95 % sikkerhet (et Wilson-intervall): 89,5 % av 200 bilder betyr at den sanne andelen mest sannsynlig ligger mellom 84,5 % og 93,0 %.
Bildene vi testet på
Vi begynte med to åpne datasett. Datasettet Sudoku Image Recognition fra Lexski (CC0) har 1 400 bilder, de fleste skjermbilder og fotografier som folk har delt på nettet: apper i alle stiler, mørke temaer, blyantmarkeringer, oppgaver halvveis løst på papir. Datasettet til Baptiste Wicht og Jean Hennebert (CC BY 4.0) har avissudokuer fotografert med mobiltelefon, noen av dem ferdig utfylt for hånd med penn.
Før vi endret noe, satte vi av tre testsett: 200 Lexski-bilder, 40 avisfotografier og 40 avisoppgaver ferdig utfylt for hånd. Vi trente ikke på dem og så ikke på dem mens vi arbeidet. Hver beslutning ble tatt på 200 andre Lexski-bilder, justeringssettet, og testsettene ble lest én gang, til slutt.
Utgangspunktet
Den første versjonen, fra 31. oktober, leste 101 av de 200 Lexski-bildene helt riktig, 34 av de 40 avisfotografiene og ingen av de 40 ferdig utfylte oppgavene. Det meste av problemene oppsto før den kom til sifrene. Den tok den største omtrent kvadratiske blekkformen som brettet, og på et skjermbilde omfatter den formen ofte et toppfelt eller talltastaturet, mens de tynne grå linjene i et mørkt tema blir oversett helt. På justeringssettet plasserte den rutenettet riktig bare 118 ganger av 200.
Hva vi endret, trinn for trinn
Hver rad er én endring, og tallet er hvor mange av de 200 justeringsbildene som deretter ble lest helt riktig. De tre siste radene er den andre runden.
| Endring | Justeringsbilder lest helt riktig (av 200) |
|---|---|
| Første versjon, 31. oktober | 99 |
| Rutenett funnet ut fra linjene: ti jevnt fordelte linjer i hver retning | 129 |
| Rutenett vurdert side om side; forskyvning på én rute prøvd | 136 |
| Svake hårlinjer brukt til å finne rutenettet | 138 |
| Ruter skåret ut hele; sifre lært fra ekte ruter | 161 |
| Et lite nettverk kartlegger hvor brettet er | 162 |
| Linjer fulgt der en side bøyer seg | 163 |
| Bedre siffernettverk, blyantmarkeringer som egen klasse | 173 |
| Gjennomsnitt av tre siffernettverk | 177 |
| Forsiktig én-løsningsregel; ferdige brett lest som en helhet | 177 |
| Andre runde: fotografier i full størrelse halvert før nedskalering | 178 |
| Andre runde: kort, svakt blekk behandlet som blyantmarkering | 179 |
| Andre runde: sidelengs fotografier vurdert av alle tre nettverkene | 179 |
Mesteparten av gevinsten kom fra tre endringer. Rutenettet finnes nå ut fra linjene sine: hvert anslag for brettet justeres inn på ti jevnt fordelte linjer i hver retning og vurderes side om side, og et lite nettverk som kartlegger hvor et brett befinner seg, får en stemme. Hver rute skjæres ut i sin helhet, slik at en blyantmarkering forblir liten i hjørnet sitt og et lyst siffer på en mørk flis ser ut som blekk på papir. Og siffernettverkene lærte av ekte ruter skåret ut fra treningsbildene fra Lexski, med blyantmarkeringer som en egen klasse. Tre små nettverk, trent hver for seg, leser nå hver rute, og det tas gjennomsnitt av svarene deres, fordi de gjør feilene sine på ulike ruter.
En ferdig utfylt oppgave får ekstra hjelp. Når et brett inneholder 79 sifre eller flere, ser leseren etter det mest sannsynlige komplette rutenettet der hver rad, kolonne og boks inneholder 1 til 9. Lest rute for rute kom bare 7 av de 40 håndskrevne testoppgavene helt riktig ut; lest som ferdig løste sudokuer gjorde alle 40 det.
Den andre runden la til tre mindre endringer. Et mobilfoto i full størrelse halveres trinn for trinn før det skaleres ned, slik at tynne linjer og blyantstreker tas med i gjennomsnittet i stedet for å hoppes over. En rute der blekket er både mye kortere og mye svakere enn brettets sikre sifre, behandles som en sannsynlig blyantmarkering. Og rotasjonen til et sidelengs fotografi vurderes av alle tre nettverkene i stedet for ett.

Hva som ikke hjalp
Disse målte vi også på justeringssettet, og vi utelot dem:
- Et større siffernettverk: 59 000 vekter i stedet for 42 000 leste ett justeringsbilde til og kjørte 3,8 ganger tregere i nettleseren.
- 3 000 genererte app-skjermbilder med blyantmarkeringer og mørke temaer: samme resultat med eller uten dem.
- Å lese farge i stedet for gråtoner, slik at en rød penn blir like mørk som svart blekk: to justeringsbilder til, men håndskrift ble lest dårligere.
- Å forvrenge treningssifrene så de lignet mer på håndskrift: håndskrift ble lest dårligere.
- Å la én-løsningsregelen endre flere ruter: flere oppgaver lest riktig, men også flere av de farlige feilleste oppgavene med én løsning.
- Å trene de tre nettverkene på nytt med ferske data, eller å bruke fire eller seks av dem: innenfor støyen, så de første ble beholdt.
- Å behandle kanten av bildet som kanten av brettet, for brett som rammen skjærer av: like mange bilder tapt som vunnet.
Resultater på de første testsettene
Oppgaver lest helt riktig i hvert testsett, av den første versjonen og av leseren slik den er nå:
| Testsett | 31. oktober | Nå |
|---|---|---|
| Skjermbilder og fotografier delt på nettet (Lexski)Bilder: 200 | 10150,5 % | 17989,5 % |
| Avisfotografier (Wicht og Hennebert)Bilder: 40 | 3485,0 % | 40100,0 % |
| Avisoppgaver ferdig utfylt for hånd (Wicht og Hennebert)Bilder: 40 | 00,0 % | 40100,0 % |
På Lexski-bildene gikk leseren fra 50,5 % til 89,5 % (84,5 % til 93,0 %), og oppgaver lest feil, men likevel med én løsning, gikk fra 7 til 4. I tre av de fire er det ene ekstra sifferet det sifferet som hører hjemme der, så oppgaven fører fortsatt til riktig løsning; den fjerde er en tydelig trykt 1-er der datasettet har en tom rute. 177 av de 179 kom på slutten av den første runden. De to siste kom i den andre runden, etter at vi hadde studert hva som feilet, så dette settet er ikke lenger urørt.
Førti av førti høres perfekt ut, men 40 bilder kan bare vise at den sanne andelen ligger over omtrent 91 %. Og en kontroll vi burde ha gjort først: fire av de 40 avistestfotografiene finnes også i treningssettet til det datasettet, to av dem piksel for piksel. Uten dem: 36 av 36.
En ny test: 200 fotografier ingen versjon hadde sett
Da var de første testsettene lest og feilene i dem studert, så de kunne ikke lenger fortelle oss hvordan leseren gjør det på bilder den aldri har møtt. Vi søkte på Hugging Face, Kaggle, GitHub, Zenodo, Figshare og AIcrowd etter flere merkede sudokufotografier. De fleste settene var genererte brett, enkeltsifre eller kopier av fotografiene til Wicht. Tre GitHub-samlinger hadde ekte merkede fotografier, alle av trykte oppgaver: 100 fotografier av en oppslått oppgavebok (NatalijaPetric/SudokuDataset), 80 fotografier for det meste av aviser (mineshpatel1/sudoku-solver, etter at vi fjernet 49 som er fotografier tatt av Wicht selv, og én kopi), og 20 trykte ark fra et emneprosjekt i datasyn ved Universitetet i Bucuresti (danielsociu/SudokuRecognition).
Ingen av de tre oppgir en lisens, så vi brukte dem bare til måling: aldri til trening, og de vises ikke her. Listen over bilder ble fastsatt og lagret før noen endring, valgt etter en regel ut fra filhasher og merking, og bildene ble ikke åpnet før den andre rundens siste endring. Deretter leste hver versjon av leseren dem én gang. Tabellen teller oppgavene som ble lest helt riktig.
| Kilde | 31. oktober | Runde én | Nå |
|---|---|---|---|
| En oppslått oppgavebok (NatalijaPetric)Fotografier: 100 | 7979,0 % | 7676,0 % | 7878,0 % |
| For det meste aviser (mineshpatel1)Fotografier: 80 | 6581,3 % | 6885,0 % | 6986,3 % |
| Trykte ark (emne ved Universitetet i Bucuresti)Fotografier: 20 | 20100,0 % | 20100,0 % | 20100,0 % |
| Alle 200Fotografier: 200 | 16482,0 % | 16482,0 % | 16783,5 % |
På trykte oppgaver leseren aldri hadde sett, endret alt arbeidet i begge rundene lite. Den første versjonen leste 82,0 % av dem helt riktig, den nåværende 83,5 % (77,7 % til 88,0 %): den vant 14 oppgaver og tapte 11. Det som ble bedre, er rutene: 98,9 % leses riktig i stedet for 94,2 %, og rutenettet blir funnet i alle fotografiene i stedet for i 195 av 200. Oppgaver lest feil, men likevel med én løsning: 5 da, 6 nå.
Tapene har en klar årsak. For å kunne lese blyantmarkeringer og mørke temaer skjæres hver rute nå ut i sin helhet, og svakt blekk teller. På tynt avispapir skinner baksiden gjennom, svak og speilvendt, og den nye leseren leser disse skyggene som sifre; den første versjonen så bare på den største blekkformen i en rute og så dem aldri. På buede boksider kan brettets ytterlinje eller en bokslinje havne inne i en rute og bli lest som en 1-er.
To av bommene skyldes feil i merkingen: fotografiet viser en 3 og en 9 der merkingen sier 9 og 8, og en 4 der den sier 2. Regnet riktig leser den nåværende leseren 84,5 %.
Hva som fortsatt går galt
Av de 200 nye fotografiene ble 33 ikke lest helt riktig. 22 er sider fra den oppslåtte oppgaveboken: nær ryggen bøyer siden seg mer enn leseren klarer å følge, så en linje havner inne i en rute og blir lest som en 1-er, eller en hjørnerute blir skåret ut over en linje. 7 er aviser der baksiden skinner gjennom. Resten er et fotografi av en skjerm med moaré, en brettkant lest som en 1-er og de to feilene i merkingen.
Av de 200 Lexski-bildene ble 21 ikke lest helt riktig: blyantmarkeringer lest som sifre, blant annet utvisket blyant som etterlot svake sifre (7); ett ekstra siffer, oftest en enslig blyantmarkering lest som en utfylling (5); rutenettet på feil sted eller ikke funnet, i app-temaer uten linjer mellom rutene eller på et håndtegnet rutenett (5); og uvanlige fliser og farger (4).
Hvorfor ikke 97 %, og hva som kommer nå
Alt kjører i nettleseren din: en modell på 224 kB og omtrent 850 linjer JavaScript, en median på omtrent 300 millisekunder per fotografi på en bærbar PC, og omtrent 1,2 sekunder med prosessoren bremset fire ganger, som på en treg telefon. Et større nettverk hjalp ikke innenfor det budsjettet. Det som gjenstår, er en lang hale: buede sider, gjennomskinn, blyantmarkeringer og uvanlige appstiler. Alle offentlige merkede sett vi fant, er nå brukt eller sett, så neste runde trenger fotografier vi tar og merker selv, med problemene med svakt blekk og buede sider rettet og målt på dem.
For best mulig skanning
- Hold telefonen rett over oppgaven, med hele rutenettet i bildet.
- Glatt ut en bok eller en avis: buede sider står for de fleste bommene på trykte oppgaver.
- På tynt avispapir kan du legge et blankt ark bak siden, så den andre siden ikke skinner gjennom.
- Skann før du skriver blyantmarkeringer i oppgaven.
- Før du løser, sammenlign rutene løseren markerer, med oppgaven din.
Data og kilder
- Lexski, Sudoku Image Recognition (Hugging Face), CC0 1.0
- Wicht, B. and Hennebert, J., Sudoku dataset (GitHub), CC BY 4.0; "Camera-based Sudoku recognition with deep belief network", SoCPaR 2014
- NatalijaPetric, SudokuDataset (GitHub), ingen lisens oppgitt, brukt kun til måling
- mineshpatel1, sudoku-solver (GitHub), ingen lisens oppgitt, brukt kun til måling
- danielsociu, SudokuRecognition (GitHub), University of Bucharest course project, ingen lisens oppgitt, brukt kun til måling
- Slik leser løseren et bilde, steg for steg (English)