Розпізнайте рукописні цифри


22

Ваше завдання - прочитати зображення, що містить рукописну цифру, розпізнати та роздрукувати цифру.

Введення: зображення в масштабах сірого 28 * 28, подане у вигляді послідовності 784 простотекстових чисел від 0 до 255, розділених пробілом. 0 означає білий, а 255 - чорний.

Вихід: Розпізнана цифра.

Оцінка балів: Я перевірю вашу програму з 1000 зображень із навчального набору баз даних MNIST (перетворений у форму ASCII). Я вже вибрав зображення (випадковим чином), але список не публікую. Тест повинен закінчитися протягом 1 години, і визначить n- кількість правильних відповідей.
nдля вашої програми має бути не менше 200. Якщо розмір вихідного коду дорівнює s, то ваш рахунок буде розраховуватися як s * (1200 - n) / 1000. Виграє найнижчий рахунок.

Правила:

  • Ваша програма повинна прочитати зображення зі стандартного вводу і записати цифру на стандартний вихід
  • Немає вбудованої функції OCR
  • Немає сторонніх бібліотек
  • Відсутність зовнішніх ресурсів (файлів, програм, веб-сайтів)
  • Ваша програма повинна бути запущена в Linux за допомогою вільно доступного програмного забезпечення (при необхідності вино прийнятне)
  • У вихідному коді повинні використовуватися лише символи ASCII
  • Будь ласка, публікуйте свій оціночний бал та унікальний номер версії щоразу, коли ви змінюєте свою відповідь

Приклад введення:

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

До речі, якщо ви додасте цей рядок до введення:

P2 28 28 255

ви отримаєте дійсний файл зображення у форматі pgm, із перевернутими / негативними кольорами.

Ось як це виглядає з правильними кольорами: цифра

Приклад виводу:

5

Таблиця:

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

Пов’язані, але не зовсім однакові (не виклик, але дуже корисні для пошуку кодів латексу): detexify.kirelabs.org/classify.html . Він також розпізнає числа.
Джастін

1
Чи можемо ми сміливо припустити, що нам потрібно розглянути лише чорні пікселі? > 127 пікселів? Що можна припустити?
Джастін

2
Особливо, якщо це питання з кодовим гольфом, будь ласка, обмежтеся чорно-білим введенням. Люди вирішують цю проблему всю свою кар’єру, не рахуючи символів у коді. Не публікувати, яких обраних вами персонажів - це спосіб зупинити обман, а робить це якоюсь азартною ... А враховуючи, що люди тут не пишуть AI, весело це робити якесь дивне евристичне, а потім бачити, як добре це в турнірі проти конкуренції.
Доктор Ребму

3
@aditsu Так, будь-хто може це зробити погано. Але ви не просите, щоб це було зроблено погано, ви хочете, щоб хтось "переміг" у змаганнях, де вимірюється кількість персонажів. Я думаю, що розбір проблеми трохи реалістичніший для вирішення головоломки для любителів. Обмеження вкладу здається гарним початком для того, щоб зробити його розумним. Я б запропонував попередній пропуск на вході, щоб сказати, що це чорно-білий колір.
Доктор Ребму

2
@ Dr.Rebmu та будь-хто інший, хто бажає чорно-білого введення: сміливо перетворюйте вхід, використовуючи поріг, такий як 128. Я перевірив, і цифри все ще впізнаються (моїм мозком). Ви також можете спробувати інші пороги, вони можуть дати кращі результати.
aditsu

Відповіді:


6

GolfScript 6D (v2: оціночний бал 101 * 0,63 ~ = 64)

Це дуже інший підхід до моєї попередньої відповіді GolfScript, тому має сенс розміщувати її як окрему відповідь на v1, ніж редагувати іншу відповідь і робити цю v2.

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

Безумовно

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

Пояснення

Основна проблема - класифікація точок у 784-мірному просторі. Одним із стандартних підходів є зменшення розмірів: визначення невеликої підмножини розмірів, які забезпечують достатню відмітну силу для класифікації. Я оцінював кожен вимір і кожен можливий поріг, щоб визначити 18 пар (розмірність, діапазон порогу), які виглядали перспективними. Потім я вибрав центр кожного діапазону порогу і оцінив 6-елементні підмножини з 18 пар. Нарешті я оптимізував поріг для кожного виміру найкращої 6-D проекції, покращуючи його точність з 56,3% до 56,6%.

Оскільки проекція складається з 6 розмірів, і для кожного виміру я застосовую простий поріг, остаточна таблиця пошуку потребує лише 64 елементів. Це не здається особливо стисливим, тому основне поле для гольфу полягає в перетворенні базових таблиць пошуку (список розмірів і порогів; вектор напівпростору для цифр) та обмін базовим кодом перетворення.


7
Ви втратили мене у "784-мірному просторі" ;-)
Digital Trauma

Боюся, що десь є помилка, я отримую лише 37 правильних відповідей. Крім того, ви робите щось неоднозначно, чи можете ви додайте (1) та (2) (як я) чи щось подібне до ваших заголовків?
aditsu

@aditsu, проста логічна помилка. Тепер виправлено.
Пітер Тейлор

Таким чином, ви в основному вибираєте 6 "відповідних" пікселів, кожен з яких має різний поріг, отримуючи 6 біт?
aditsu

@aditsu, точно.
Пітер Тейлор

5

GolfScript 3x3 (v1: оціночний бал 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/{))*~}%=

Або в огляді,

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

Пояснення

Мій підхід на високому рівні:

  1. Поріг пікселів: якщо піксель знаходиться вище, t1встановіть його 1; інакше до 0.
  2. Згрупуйте пікселі. Спочатку я розбив сітку 28х28 в сітку 4х4 (кожна підрешітка була 7x7 пікселів); але розбиття його на сітку 3х3 (підмережі 10х10, 10х8 або 8х8 пікселів) призводить до значного зменшення розміру таблиці пошуку при зниженні швидкості точності з приблизно 56% до приблизно 40%.
  3. Підсумуйте пікселі в кожній групі та поріг ще раз: якщо кількість встановлених пікселів вище, t2то оцініть групу як 1; інакше як 0.
  4. Зробіть пошук таблиці за вектором групових балів. (Таблиця стискається за допомогою кодування довжини пробігу та стандартного трюку базової конверсії. Більшість варіантів t1та t2залишків між 50% і 63% таблиці є значеннями "не байдуже", які можна комбінувати із суміжними значеннями для збільшення довжина пробігу; середня довжина ходу в моїй таблиці v1 - 3,6).

Виявляється, що налаштування t1=t2=0, хоча й не оптимальна, не за горами найкращих значень t1та t2з точки зору точності; досить добре з точки зору стисливості столу; і дозволяє мені комбінувати дві операції порогового значення в []*0-!!(згладити 2D масив до 1D; видалити 0s; перевірити, чи він порожній).

Таблиця пошуку дає найбільш ймовірного кандидата на даний вектор групових балів. Можливо, можливо покращити показник, визначивши записи таблиці, які можна змінити таким чином, щоб поліпшена стисливість таблиці перевищувала зменшену точність.


Дивовижно, у мене була схожа ідея, але я не уявляв, що вона може так добре стискатися. Тепер я думаю, що мені потрібен більший акцент на точність: p, але я не планую її змінювати.
aditsu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.