Sudoku Flow

Wat we leerden van het meten van onze sudokufotolezer

Bijgewerkt op 5 november 2026

Wat telt als goed gelezen

Een puzzel is alleen goed gelezen als alle 81 vakjes kloppen: één verkeerd cijfer maakt er een andere puzzel van. Daarom tellen we hele puzzels, geen vakjes. De twee kunnen heel verschillende verhalen vertellen, zoals deze pagina laat zien: op foto's van gedrukte puzzels leest de lezer nu 98,9% van de vakjes goed, maar het aandeel hele puzzels is nauwelijks veranderd, omdat de meeste verkeerde vakjes in een paar moeilijke afbeeldingen zitten.

We tellen ook de gevaarlijkste fout: een verkeerd gelezen puzzel die toch precies één oplossing heeft. Een echte sudoku heeft één oplossing, dus een lezing zonder oplossing of met meerdere oplossingen valt meteen op. Een verkeerde puzzel met één oplossing lijkt in orde, en daarom markeert de oplosser elk vakje waarover hij twijfelde en vraagt hij je die vóór het oplossen met je puzzel te vergelijken.

Met 200 afbeeldingen is een uitkomst maar beperkt nauwkeurig. Bij de belangrijkste uitkomsten geven we een bereik van 95% (een Wilson-interval): 89,5% van 200 afbeeldingen betekent dat het werkelijke percentage hoogstwaarschijnlijk tussen 84,5% en 93,0% ligt.

De afbeeldingen waarop we testten

We begonnen met twee open datasets. De dataset Sudoku Image Recognition van Lexski (CC0) bevat 1.400 afbeeldingen, de meeste screenshots en foto's die mensen online deelden: apps in alle stijlen, donkere thema's, potloodnotities, half op papier opgeloste puzzels. De dataset van Baptiste Wicht en Jean Hennebert (CC BY 4.0) bevat sudoku's uit kranten die met telefoons zijn gefotografeerd, waarvan sommige met de hand met pen zijn ingevuld.

Voordat we iets veranderden, legden we drie testsets apart: 200 afbeeldingen van Lexski, 40 krantenfoto's en 40 met de hand ingevulde krantenpuzzels. We hebben er niet op getraind en er tijdens het werk niet naar gekeken. Elke beslissing werd genomen op 200 andere afbeeldingen van Lexski, de afstemset, en de testsets werden één keer gelezen, aan het eind.

Het beginpunt

De eerste versie, van 31 oktober, las 101 van de 200 afbeeldingen van Lexski precies goed, 34 van de 40 krantenfoto's en geen van de 40 ingevulde puzzels. De meeste problemen ontstonden vóór de cijfers aan bod kwamen. Die versie nam de grootste min of meer vierkante inktvorm als bord, en op een screenshot omvat die vorm vaak ook een kopbalk of het cijferpaneel, terwijl de dunne grijze lijnen van een donker thema helemaal worden gemist. Op de afstemset plaatste hij het rooster maar 118 van de 200 keer op de juiste plek.

Wat we veranderden, stap voor stap

Elke rij is één wijziging, en het getal geeft aan hoeveel van de 200 afstemafbeeldingen daarna precies goed werden gelezen. De laatste drie rijen zijn de tweede ronde.

WijzigingPrecies goed gelezen afstemafbeeldingen (van 200)
Eerste versie, 31 oktober99
Rooster gevonden aan de hand van zijn lijnen: tien gelijkmatig verdeelde lijnen in elke richting129
Roosters naast elkaar beoordeeld; verschuiving van één vakje geprobeerd136
Vage haarlijnen gebruikt om het rooster te vinden138
Vakjes in hun geheel uitgesneden; cijfers geleerd van echte vakjes161
Een klein netwerk brengt in kaart waar het bord zit162
Lijnen gevolgd waar een pagina buigt163
Beter cijfernetwerk, potloodnotities als eigen klasse173
Drie cijfernetwerken gemiddeld177
Voorzichtige regel van één oplossing; ingevulde borden als geheel gelezen177
Tweede ronde: foto's op volle grootte gehalveerd vóór het verkleinen178
Tweede ronde: korte, vage inkt behandeld als potloodnotitie179
Tweede ronde: zijwaartse foto's beoordeeld door alle drie de netwerken179

De meeste winst kwam van drie wijzigingen. Het rooster wordt nu gevonden aan de hand van zijn lijnen: elke schatting van het bord wordt verschoven naar tien gelijkmatig verdeelde lijnen in elke richting en naast elkaar beoordeeld, en een klein netwerk dat in kaart brengt waar een bord zit, krijgt een stem. Elk vakje wordt in zijn geheel uitgesneden, zodat een potloodnotitie klein in de hoek blijft en een licht cijfer op een donkere tegel eruitziet als inkt op papier. En de cijfernetwerken leerden van echte vakjes, uitgesneden uit de trainingsafbeeldingen van Lexski, met potloodnotities als aparte klasse. Drie kleine netwerken, apart getraind, lezen nu elk vakje en hun antwoorden worden gemiddeld, omdat ze hun fouten op verschillende vakjes maken.

Een ingevulde puzzel krijgt extra hulp. Als een bord 79 cijfers of meer bevat, zoekt de lezer naar het waarschijnlijkste volledige rooster waarin elke rij, elke kolom en elk blok de cijfers 1 tot en met 9 bevat. Vakje voor vakje gelezen kwamen maar 7 van de 40 handgeschreven testpuzzels precies goed uit; gelezen als ingevulde sudoku waren het alle 40.

De tweede ronde voegde drie kleinere wijzigingen toe. Een telefoonfoto op volle grootte wordt stap voor stap gehalveerd voordat hij wordt verkleind, zodat dunne lijnen en potloodstreepjes worden meegemiddeld in plaats van overgeslagen. Een vakje waarvan de inkt zowel veel korter als veel lichter is dan de zekere cijfers van het bord, wordt behandeld als een waarschijnlijke potloodnotitie. En de draaiing van een zijwaarts gemaakte foto wordt door alle drie de netwerken beoordeeld in plaats van door één.

Een sudokuscreenshot met donker thema, met potloodnotities en gekleurde cijfers, het bord rechtgezet met de kruispunten van de lijnen in groen gemarkeerd, de 81 vakjes als kleine afbeeldingen en de gelezen cijfers in blauw zonder de potloodnotities
Een screenshot met donker thema dat we zelf genereerden: het bord rechtgezet, met de kruispunten van de lijnen die de lezer vond; de 81 vakjes zoals de netwerken ze zien; en wat er gelezen werd. De potloodnotities zijn weggelaten.

Wat niet hielp

Ook deze hebben we op de afstemset gemeten, en we hebben ze weggelaten:

  • Een groter cijfernetwerk: 59.000 gewichten in plaats van 42.000 las één afstemafbeelding meer en was in de browser 3,8 keer zo traag.
  • 3.000 gegenereerde app-screenshots met potloodnotities en donkere thema's: dezelfde score met of zonder.
  • Kleur lezen in plaats van grijs, zodat een rode pen even donker is als zwarte inkt: twee afstemafbeeldingen meer, maar handschrift werd slechter gelezen.
  • De trainingscijfers vervormen zodat ze meer op handschrift lijken: handschrift werd slechter gelezen.
  • De regel van één oplossing meer vakjes laten veranderen: meer puzzels goed gelezen, maar ook meer van de gevaarlijke verkeerde puzzels met één oplossing.
  • De drie netwerken opnieuw trainen op nieuwe data, of er vier of zes gebruiken: binnen de ruis, dus de eerste bleven.
  • De rand van de afbeelding als rand van het bord behandelen, voor borden die door het beeldkader zijn afgesneden: evenveel afbeeldingen verloren als gewonnen.

Uitkomsten op de eerste testsets

Precies goed gelezen puzzels per testset, door de eerste versie en door de lezer zoals hij nu is:

Testset31 oktoberNu
Online gedeelde screenshots en foto's (Lexski)Afbeeldingen: 20010150,5%17989,5%
Krantenfoto's (Wicht en Hennebert)Afbeeldingen: 403485,0%40100,0%
Met de hand ingevulde krantenpuzzels (Wicht en Hennebert)Afbeeldingen: 4000,0%40100,0%

Op de afbeeldingen van Lexski ging de lezer van 50,5% naar 89,5% (84,5% tot 93,0%), en het aantal verkeerd gelezen puzzels met toch één oplossing daalde van 7 naar 4. Bij drie van die vier is het ene extra cijfer het cijfer dat daar hoort, zodat de puzzel toch tot de juiste oplossing leidt; de vierde is een duidelijk gedrukte 1 die in de dataset leeg is gelaten. Van de 179 werden er 177 aan het eind van de eerste ronde bereikt. De laatste twee kwamen in de tweede ronde, nadat we hadden bestudeerd wat misging, dus deze set is niet langer onaangeroerd.

Veertig van de veertig klinkt perfect, maar 40 afbeeldingen kunnen alleen laten zien dat het werkelijke percentage boven ongeveer 91% ligt. En een controle die we eerst hadden moeten doen: vier van de 40 krantenfoto's in de testset staan ook in de trainingsset van die dataset, twee ervan pixel voor pixel. Zonder die vier: 36 van de 36.

Een nieuwe test: 200 foto's die geen enkele versie had gezien

Inmiddels waren de eerste testsets gelezen en hun fouten bestudeerd, dus konden ze ons niet meer vertellen hoe de lezer het doet op afbeeldingen die hij nooit eerder is tegengekomen. We zochten op Hugging Face, Kaggle, GitHub, Zenodo, Figshare en AIcrowd naar meer gelabelde sudokufoto's. De meeste sets bestonden uit gegenereerde borden, losse cijfers of kopieën van de foto's van Wicht. Drie verzamelingen op GitHub bevatten echte gelabelde foto's, allemaal van gedrukte puzzels: 100 foto's van een open puzzelboek (NatalijaPetric/SudokuDataset), 80 foto's, vooral van kranten (mineshpatel1/sudoku-solver, nadat we 49 foto's hadden weggelaten die de eigen foto's van Wicht zijn, plus één kopie), en 20 gedrukte vellen uit een project voor een cursus computervisie aan de Universiteit van Boekarest (danielsociu/SudokuRecognition).

Geen van de drie vermeldt een licentie, dus we gebruikten ze alleen om te meten: nooit om op te trainen, en ze worden hier niet getoond. De lijst met afbeeldingen werd vóór elke wijziging vastgelegd en opgeslagen, volgens een vaste regel gekozen op basis van bestandshashes en labels, en de afbeeldingen werden pas geopend na de laatste wijziging van de tweede ronde. Daarna las elke versie van de lezer ze één keer. De tabel telt de precies goed gelezen puzzels.

Bron31 oktoberEerste rondeNu
Een open puzzelboek (NatalijaPetric)Foto's: 1007979,0%7676,0%7878,0%
Vooral kranten (mineshpatel1)Foto's: 806581,3%6885,0%6986,3%
Gedrukte vellen (cursus Universiteit van Boekarest)Foto's: 2020100,0%20100,0%20100,0%
Alle 200Foto's: 20016482,0%16482,0%16783,5%

Op gedrukte puzzels die de lezer nooit had gezien, veranderde al het werk van beide rondes weinig. De eerste versie las er 82,0% precies goed, de huidige 83,5% (77,7% tot 88,0%): hij won 14 puzzels en verloor er 11. Wat wel verbeterde, zijn de vakjes: 98,9% wordt goed gelezen in plaats van 94,2%, en het rooster wordt in elke foto gevonden in plaats van in 195 van de 200. Verkeerd gelezen puzzels met toch één oplossing: toen 5, nu 6.

De verliezen hebben een duidelijke oorzaak. Om potloodnotities en donkere thema's te kunnen lezen, wordt elk vakje nu in zijn geheel uitgesneden en telt ook vage inkt mee. Bij dun krantenpapier schijnt de achterkant door, vaag en gespiegeld, en de nieuwe lezer leest die schaduwen als cijfers; de eerste versie keek alleen naar de grootste inktvorm in een vakje en zag ze nooit. Op gekrulde boekpagina's kan de buitenlijn van het bord of een bloklijn binnen een vakje vallen en als een 1 worden gelezen.

Twee van de missers zijn fouten in de labels: de foto toont een 3 en een 9 waar het label 9 en 8 zegt, en een 4 waar het 2 zegt. Als die goed worden geteld, komt de huidige lezer op 84,5%.

Wat nog misgaat

Van de 200 nieuwe foto's werden er 33 niet precies goed gelezen. Daarvan zijn er 22 pagina's uit het open puzzelboek: bij de rug krult de pagina meer dan de lezer kan volgen, zodat een lijn binnen een vakje terechtkomt en als een 1 wordt gelezen, of een hoekvakje dwars door een lijn wordt uitgesneden. Bij 7 gaat het om kranten waarbij de achterkant doorschijnt. De rest zijn een foto van een scherm met moiré, een bordrand die als een 1 is gelezen en de twee labelfouten.

Van de 200 afbeeldingen van Lexski werden er 21 niet precies goed gelezen: potloodnotities die als cijfers werden gelezen, waaronder uitgegumd potlood dat vage cijfers achterliet (7); één extra cijfer, meestal een losse potloodnotitie die als ingevuld cijfer werd gelezen (5); het rooster op de verkeerde plek of niet gevonden, bij app-thema's zonder lijnen tussen de vakjes of bij een met de hand getekend rooster (5); en ongewone tegels en kleuren (4).

Waarom geen 97%, en wat er nu komt

Alles draait in je browser: een model van 224 kB en ongeveer 850 regels JavaScript, met een mediaan van ongeveer 300 milliseconden per foto op een laptop en ongeveer 1,2 seconden met de processor vier keer vertraagd, zoals op een trage telefoon. Een groter netwerk hielp binnen dat budget niet. Wat overblijft is een lange staart: gekrulde pagina's, doorschijnende achterkanten, potloodnotities en ongewone app-stijlen. Elke openbare gelabelde set die we vonden, is nu gebruikt of gezien, dus de volgende ronde heeft foto's nodig die we zelf maken en labelen, en daarop worden de problemen met vage inkt en gekrulde pagina's opgelost en gemeten.

Voor de beste scan

  • Houd de telefoon recht boven de puzzel, met het hele rooster in beeld.
  • Leg een boek of krant plat: gekrulde pagina's veroorzaken de meeste missers bij gedrukte puzzels.
  • Leg bij dun krantenpapier een blanco vel papier achter de pagina, zodat de achterkant niet doorschijnt.
  • Scan voordat je potloodnotities in de puzzel schrijft.
  • Vergelijk vóór het oplossen de vakjes die de oplosser markeert met je puzzel.

Gegevens en bronnen

Probeer de oplosser →

Pictogram van de Sudoku-app

Wil je meer van zulke puzzels?

We maken ook een Sudoku-app voor iPhone, iPad, Mac en Android. De app bevat helemaal geen advertenties, werkt offline en laat je bij een hint de techniek zien in plaats van alleen een cijfer in te vullen.

Sudoku Flow wordt gemaakt door Rubigo Games, de ontwikkelaar van de Sudoku-app die we op deze website aanbevelen.