Що ми дізналися, вимірюючи наш зчитувач судоку з фото
Оновлено 5 листопада 2026 р.
Що вважається правильним зчитуванням
Головоломку зчитано правильно лише тоді, коли правильно зчитано кожну з 81 клітинки: одна хибна цифра дає вже іншу головоломку. Тому ми рахуємо цілі головоломки, а не клітинки. Ці два показники можуть розповідати дуже різні історії, як видно з цієї сторінки: на фото друкованих головоломок зчитувач тепер правильно розпізнає 98,9% клітинок, проте частка цілих головоломок майже не змінилася, бо більшість хибних клітинок припадає на кілька складних зображень.
Ми також рахуємо найнебезпечнішу помилку: головоломку, зчитану неправильно, яка все одно має рівно один розв’язок. Справжнє судоку має один розв’язок, тож зчитування без розв’язку або з багатьма розв’язками виявляється одразу. Неправильна головоломка з одним розв’язком виглядає нормально, тому розв’язувач позначає кожну клітинку, у якій не був упевнений, і просить вас звірити їх зі своєю головоломкою перед розв’язуванням.
На 200 зображеннях точність результату обмежена. Для основних результатів ми наводимо 95-відсотковий діапазон, тобто інтервал Вілсона (Wilson): 89,5% із 200 зображень означає, що справжня частка найімовірніше лежить між 84,5% і 93,0%.
Зображення, на яких ми тестували
Ми почали з двох відкритих наборів даних. Набір даних Sudoku Image Recognition від Lexski (CC0) містить 1 400 зображень, здебільшого скриншоти й фото, якими люди поділилися в інтернеті: застосунки в усіх стилях, темні теми, олівцеві позначки, головоломки, наполовину розв’язані на папері. Набір даних Батіста Віхта (Baptiste Wicht) і Жана Еннебера (Jean Hennebert) за ліцензією CC BY 4.0 містить газетні судоку, сфотографовані телефонами, частину з них заповнено до кінця від руки ручкою.
Перш ніж щось змінювати, ми відклали три тестові набори: 200 зображень Lexski, 40 газетних фото і 40 газетних головоломок, заповнених до кінця від руки. Ми не навчали на них мережі й не дивилися на них під час роботи. Кожне рішення ухвалювали на 200 інших зображеннях Lexski, наборі для налаштування, а тестові набори зчитали один раз, наприкінці.
З чого все почалося
Перша версія від 31 жовтня точно зчитала 101 із 200 зображень Lexski, 34 із 40 газетних фото й жодної з 40 заповнених головоломок. Більшість її проблем виникала ще до цифр. Вона брала за дошку найбільшу майже квадратну фігуру з чорнила, а на скриншоті така фігура часто захоплює заголовок або панель цифр, тоді як тонкі сірі лінії темної теми взагалі пропускаються. На наборі для налаштування вона знаходила сітку в правильному місці лише 118 разів із 200.
Що ми змінили, крок за кроком
Кожен рядок означає одну зміну, а число показує, скільки з 200 зображень набору для налаштування після неї зчитано точно. Останні три рядки належать до другого раунду.
| Зміна | Точно зчитані зображення набору для налаштування (з 200) |
|---|---|
| Перша версія, 31 жовтня | 99 |
| Сітку знаходять за лініями: десять рівновіддалених ліній у кожному напрямку | 129 |
| Варіанти сітки порівнюються між собою; пробується зсув на одну клітинку | 136 |
| Для пошуку сітки використовуються бліді тонкі лінії | 138 |
| Клітинки вирізаються цілими; цифри вивчено на справжніх клітинках | 161 |
| Невелика мережа визначає, де розташована дошка | 162 |
| Лінії відстежуються там, де сторінка вигинається | 163 |
| Краща мережа для цифр, олівцеві позначки як окремий клас | 173 |
| Усереднення трьох мереж для цифр | 177 |
| Обережне правило одного розв’язку; заповнені дошки зчитуються як ціле | 177 |
| Другий раунд: повнорозмірні фото зменшуються вдвічі перед стисканням | 178 |
| Другий раунд: низький блідий слід чорнила вважається олівцевою позначкою | 179 |
| Другий раунд: фото, повернуті набік, оцінюють усі три мережі | 179 |
Більшу частину приросту дали три зміни. Тепер сітку знаходять за її лініями: кожне припущення щодо розташування дошки підганяють під десять рівновіддалених ліній у кожному напрямку й порівнюють варіанти між собою, а невелика мережа, яка визначає, де розташована дошка, теж має голос. Кожну клітинку вирізають цілою, тож олівцева позначка лишається маленькою у своєму куті, а світла цифра на темній плитці виглядає як чорнило на папері. А мережі для цифр навчалися на справжніх клітинках, вирізаних із навчальних зображень Lexski, причому олівцеві позначки утворюють окремий клас. Тепер кожну клітинку зчитують три невеликі мережі, навчені окремо, і їхні відповіді усереднюються, бо помиляються вони на різних клітинках.
Заповнена головоломка отримує додаткову допомогу. Коли на дошці 79 цифр або більше, зчитувач шукає найімовірнішу повну сітку, у якій кожен рядок, стовпець і блок містить цифри від 1 до 9. Під час зчитування клітинка за клітинкою точно вийшли лише 7 із 40 рукописних тестових головоломок; під час зчитування як завершеного судоку точно вийшли всі 40.
Другий раунд додав три менші зміни. Повнорозмірне фото з телефона крок за кроком зменшують удвічі, перш ніж стиснути, тож тонкі лінії й штрихи олівця усереднюються, а не пропускаються. Клітинку, у якій слід чорнила водночас значно нижчий і значно блідіший, ніж упевнено розпізнані цифри дошки, вважають імовірною олівцевою позначкою. А поворот фото, повернутого набік, оцінюють усі три мережі замість однієї.

Що не допомогло
Ці зміни ми також виміряли на наборі для налаштування й відмовилися від них:
- Більша мережа для цифр: 59 000 ваг замість 42 000 зчитала на одне зображення набору для налаштування більше й працювала в браузері в 3,8 раза повільніше.
- 3 000 згенерованих скриншотів застосунків з олівцевими позначками й темними темами: той самий результат із ними і без них.
- Зчитування кольору замість відтінків сірого, щоб червона ручка була такою ж темною, як чорне чорнило: на два зображення набору для налаштування більше, але почерк зчитувався гірше.
- Спотворення навчальних цифр, щоб вони більше скидалися на рукописні: почерк зчитувався гірше.
- Дозвіл правилу одного розв’язку змінювати більше клітинок: більше правильно зчитаних головоломок, але й більше небезпечних неправильних головоломок з одним розв’язком.
- Повторне навчання трьох мереж на нових даних або використання чотирьох чи шести мереж: у межах шуму, тож лишилися перші.
- Сприйняття краю зображення як краю дошки для дощок, обрізаних кадром: скільки зображень виграли, стільки ж і втратили.
Результати на перших тестових наборах
Кількість головоломок, точно зчитаних у кожному тестовому наборі першою версією і нинішнім зчитувачем:
| Тестовий набір | 31 жовтня | Тепер |
|---|---|---|
| Скриншоти й фото, якими поділилися в інтернеті (Lexski)Зображення: 200 | 10150,5% | 17989,5% |
| Газетні фото (Wicht і Hennebert)Зображення: 40 | 3485,0% | 40100,0% |
| Газетні головоломки, заповнені від руки (Wicht і Hennebert)Зображення: 40 | 00,0% | 40100,0% |
На зображеннях Lexski зчитувач покращився з 50,5% до 89,5% (від 84,5% до 93,0%), а кількість неправильно зчитаних головоломок з одним розв’язком зменшилася із 7 до 4. У трьох із цих чотирьох єдина зайва цифра і є тією цифрою, що має там стояти, тож головоломка все одно веде до правильного розв’язку; у четвертій це чітко надрукована 1, яку набір даних залишає порожньою. 177 із 179 було досягнуто наприкінці першого раунду. Останні дві додалися в другому раунді, після того як ми вивчили, що не спрацювало, тож цей набір уже не є недоторканим.
Сорок із сорока звучить ідеально, але 40 зображень можуть показати лише те, що справжня частка перевищує приблизно 91%. І перевірка, яку слід було зробити спершу: чотири з 40 газетних тестових фото є також у навчальній вибірці цього набору даних, два з них збігаються піксель у піксель. Без них результат 36 із 36.
Новий тест: 200 фото, яких не бачила жодна версія
На той час перші тестові набори вже були зчитані, а їхні невдачі вивчені, тож вони більше не могли показати, як зчитувач працює на зображеннях, яких ніколи не бачив. Ми шукали на Hugging Face, Kaggle, GitHub, Zenodo, Figshare та AIcrowd інші розмічені фото судоку. Більшість наборів містила згенеровані дошки, окремі цифри або копії фото з набору Wicht. Три колекції на GitHub містили справжні розмічені фото, усі з друкованими головоломками: 100 фото відкритої збірки головоломок (NatalijaPetric/SudokuDataset), 80 фото, здебільшого газет (mineshpatel1/sudoku-solver, після вилучення 49 фото, що є фото з самого набору Wicht, та однієї копії), і 20 надрукованих аркушів із проєкту курсу комп’ютерного зору Бухарестського університету (danielsociu/SudokuRecognition).
У жодній із трьох колекцій не вказано ліцензії, тож ми використовували їх лише для вимірювання: ніколи не навчали на них і не показуємо їх тут. Список зображень зафіксували й зберегли до будь-яких змін, відібравши його за правилом на основі хешів файлів і розмітки, а самі зображення не відкривали до останньої зміни другого раунду. Потім кожна версія зчитувача зчитала їх один раз. У таблиці наведено кількість точно зчитаних головоломок.
| Джерело | 31 жовтня | Перший раунд | Тепер |
|---|---|---|---|
| Відкрита збірка головоломок (NatalijaPetric)Фото: 100 | 7979,0% | 7676,0% | 7878,0% |
| Здебільшого газети (mineshpatel1)Фото: 80 | 6581,3% | 6885,0% | 6986,3% |
| Надруковані аркуші (курс Бухарестського університету)Фото: 20 | 20100,0% | 20100,0% | 20100,0% |
| Усі 200Фото: 200 | 16482,0% | 16482,0% | 16783,5% |
На друкованих головоломках, яких зчитувач ніколи не бачив, уся робота обох раундів мало що змінила. Перша версія точно зчитала 82,0% з них, а нинішня 83,5% (від 77,7% до 88,0%): вона виграла 14 головоломок і втратила 11. Покращилося зчитування клітинок: правильно зчитується 98,9% замість 94,2%, а сітку знайдено на кожному фото замість 195 із 200. Неправильно зчитаних головоломок з одним розв’язком: 5 тоді, 6 тепер.
Втрати мають зрозумілу причину. Щоб зчитувати олівцеві позначки й темні теми, кожну клітинку тепер вирізають цілою, і бліде чорнило теж враховується. На тонкому газетному папері просвічує зворотний бік сторінки, блідий і віддзеркалений, і новий зчитувач читає ці тіні як цифри; перша версія дивилася лише на найбільшу фігуру з чорнила в клітинці й ніколи їх не бачила. На вигнутих сторінках книжки зовнішня лінія дошки або лінія блоку може потрапити всередину клітинки й бути зчитаною як 1.
Два з промахів є помилками в розмітці: на фото видно 3 і 9 там, де в розмітці вказано 9 і 8, а також 4 там, де вказано 2. Якщо рахувати правильно, нинішній зчитувач зчитує 84,5%.
Що досі йде не так
Із 200 нових фото 33 не були зчитані точно. 22 з них є сторінками відкритої збірки головоломок: біля корінця сторінка вигинається сильніше, ніж зчитувач здатен відстежити, тож лінія опиняється всередині клітинки й зчитується як 1, або кутову клітинку вирізано поперек лінії. 7 є газетами, крізь які просвічує зворотний бік сторінки. Решта: фото екрана з муаром, край дошки, зчитаний як 1, і дві помилки розмітки.
Із 200 зображень Lexski не вдалося точно зчитати 21: олівцеві позначки, зчитані як цифри, зокрема стертий олівець, що залишив бліді цифри (7); одна зайва цифра, здебільшого поодинока олівцева позначка, зчитана як введена цифра (5); сітку знайдено не в тому місці або не знайдено зовсім, у темах застосунків без ліній між клітинками або на сітці, намальованій від руки (5); і незвичні плитки та кольори (4).
Чому не 97% і що далі
Усе працює у вашому браузері: модель на 224 КБ і близько 850 рядків JavaScript, медіана близько 300 мілісекунд на фото на ноутбуці й близько 1,2 секунди, якщо сповільнити процесор учетверо, як на повільному телефоні. Більша мережа в межах цього бюджету не допомогла. Залишився довгий хвіст: вигнуті сторінки, просвічування, олівцеві позначки й незвичні стилі застосунків. Усі знайдені нами публічні розмічені набори вже використано або переглянуто, тож для наступного раунду потрібні фото, які ми самі знімемо й розмітимо, і саме на них треба виправити й виміряти проблеми з блідим чорнилом і вигнутими сторінками.
Як отримати найкраще сканування
- Тримайте телефон рівно над головоломкою, так щоб уся сітка була в кадрі.
- Розпрямте книжку чи газету: вигнуті сторінки спричиняють більшість промахів на друкованих головоломках.
- Під тонку газетну сторінку підкладіть чистий аркуш паперу, щоб не просвічував зворотний бік.
- Скануйте до того, як писати олівцеві позначки в головоломці.
- Перед розв’язуванням звірте клітинки, позначені розв’язувачем, зі своєю головоломкою.
Дані та джерела
- 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), ліцензію не вказано, використано лише для вимірювання
- mineshpatel1, sudoku-solver (GitHub), ліцензію не вказано, використано лише для вимірювання
- danielsociu, SudokuRecognition (GitHub), University of Bucharest course project, ліцензію не вказано, використано лише для вимірювання
- Як розв’язувач зчитує фото, крок за кроком (English)