हस्तलिखित अंकों को पहचानें


22

आपका काम एक हस्तलिखित अंक वाली छवि को पढ़ना है, अंक को पहचानना और प्रिंट करना है।

इनपुट: एक 28 * 28 ग्रेस्केल छवि, जो 0 से 255 तक 784 प्लेन-टेक्स्ट नंबरों के अनुक्रम के रूप में दी गई है, अंतरिक्ष द्वारा अलग है। 0 का मतलब सफेद और 255 का मतलब काला होता है।

आउटपुट: मान्यता प्राप्त अंक।

स्कोरिंग: मैं MNIST डेटाबेस प्रशिक्षण सेट (ASCII फॉर्म में परिवर्तित) से छवियों के 1000 के साथ आपके कार्यक्रम का परीक्षण करूंगा । मैंने पहले ही छवियों (यादृच्छिक रूप से) का चयन कर लिया है, लेकिन सूची प्रकाशित नहीं करेगा। परीक्षण 1 घंटे के भीतर समाप्त होना चाहिए, और निर्धारित करेगा n- सही उत्तरों की संख्या।
nअर्हता प्राप्त करने के लिए आपके कार्यक्रम के लिए कम से कम 200 होना चाहिए। यदि आपके स्रोत कोड का आकार है s, तो आपके स्कोर की गणना की जाएगी s * (1200 - n) / 1000। सबसे कम स्कोर जीतता है।

नियम:

  • आपके प्रोग्राम को मानक इनपुट से छवि को पढ़ना चाहिए और अंक को मानक आउटपुट में लिखना चाहिए
  • कोई अंतर्निहित OCR फ़ंक्शन नहीं है
  • कोई तृतीय-पक्ष लाइब्रेरी नहीं
  • कोई बाहरी संसाधन (फ़ाइलें, कार्यक्रम, वेब साइट)
  • आपके प्रोग्राम को लिनक्स में स्वतंत्र रूप से उपलब्ध सॉफ़्टवेयर का उपयोग करना चाहिए (यदि आवश्यक हो तो शराब स्वीकार्य है)
  • स्रोत कोड को केवल 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। मैंने जाँच की और अंक अभी भी पहचानने योग्य हैं (मेरे मस्तिष्क द्वारा)। आप अन्य थ्रेसहोल्ड भी आज़मा सकते हैं, वे बेहतर परिणाम दे सकते हैं।
एडिट्स

जवाबों:


6

गोल्फस्क्रिप्ट 6D (v2: अनुमानित स्कोर 101 * 0.63 ~ = 64)

यह मेरे पहले के गोल्फस्क्रिप्ट उत्तर के लिए एक बहुत अलग दृष्टिकोण है, इसलिए इसे दूसरे उत्तर को संपादित करने और इस v2 को बनाने की तुलना में v1 पर एक अलग उत्तर के रूप में पोस्ट करने के लिए अधिक समझ में आता है।

~]: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
=

व्याख्या

कच्ची समस्या 784-आयामी स्थान में बिंदुओं का वर्गीकरण है। एक मानक दृष्टिकोण आयाम में कमी है: आयामों के एक छोटे उपसमूह की पहचान करना जो वर्गीकरण करने के लिए पर्याप्त विशिष्ट शक्ति प्रदान करता है। मैंने 18 आयामों (आयाम, सीमा की सीमा) की पहचान करने के लिए प्रत्येक आयाम और प्रत्येक संभावित सीमा का मूल्यांकन किया, जो आशाजनक लग रहा था। मैंने तब दहलीज की प्रत्येक श्रेणी का केंद्र चुना, और 18 जोड़े के 6-तत्व सबसेट का मूल्यांकन किया। अंत में मैंने सर्वश्रेष्ठ 6-डी प्रोजेक्शन के प्रत्येक आयाम के लिए सीमा को अनुकूलित किया, इसकी सटीकता को 56.3% से 56.6% तक सुधार दिया।

क्योंकि प्रक्षेपण 6 आयामों में है और प्रत्येक आयाम के लिए मैं एक साधारण सीमा लागू करता हूं, अंतिम लुकअप टेबल को केवल 64 तत्वों की आवश्यकता होती है। यह विशेष रूप से संपीड़ित नहीं लगता है, इसलिए मुख्य गोल्फिंग दोनों लुकअप टेबल (आयाम और थ्रेसहोल्ड की सूची; और आधा क्षेत्र वेक्टर से डिजिट मैप) को आधार-रूपांतरित करने के लिए है और आधार-रूपांतरण कोड साझा करना है।


7
आपने मुझे "784-आयामी स्थान" में खो दिया; ;-)
डिजिटल ट्रॉमा

मुझे डर है कि कहीं कोई गलती नहीं है, मुझे केवल 37 सही उत्तर मिल रहे हैं। इसके अलावा, आप चीजों को थोड़ा अस्पष्ट बना रहे हैं, क्या आप कृपया (1) और (2) (जैसे मैंने किया था) या आपके शीर्षकों के समान कुछ जोड़ सकते हैं?
2

@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. पिक्सल्स को ग्रुप करें। प्रारंभ में मैंने 4x ग्रिड में 28x28 ग्रिड को तोड़ा (प्रत्येक सबग्रिड 7x7 पिक्सेल); लेकिन इसे 3x3 ग्रिड (10x10, 10x8, या 8x8 पिक्सल के सबग्रिड) में तोड़कर सटीकता दर को लगभग 56% से लगभग 40% तक छोड़ने के दौरान लुकअप टेबल के आकार में भारी कमी आती है।
  3. प्रत्येक समूह में पिक्सेल को फिर से जोड़ो और फिर से सेट करें: यदि सेट पिक्सेल की संख्या ऊपर है, t2तो समूह को स्कोर करें 1; अन्यथा के रूप में 0
  4. समूह स्कोर के वेक्टर द्वारा एक टेबल लुकअप करें। (तालिका रन-लंबाई एन्कोडिंग और मानक आधार-रूपांतरण चाल का उपयोग करके संकुचित है। तालिका के 50% और 63% के बीच के अधिकांश विकल्प t1और t2छोड़ें "मानों की परवाह न करें", जिसे बढ़ाए जाने के लिए आसन्न मूल्यों के साथ जोड़ा जा सकता है। रन लंबाई, मेरी v1 तालिका में औसत रन लंबाई 3.6 है)।

यह पता चला है कि सेटिंग t1=t2=0, हालांकि इष्टतम नहीं है, के सर्वोत्तम मूल्यों से दूर नहीं हैt1 और t2सटीकता के मामले में है; तालिका संपीड़ितता के मामले में बहुत अच्छा है; और मुझे दो थ्रॉल्डिंग ऑपरेशन को []*0-!!समतल करने की अनुमति देता है (समतल 2 डी सरणी 1 डी के लिए; 0एस हटाएं ; जांचें कि क्या यह खाली है)।

लुकअप टेबल समूह स्कोर के दिए गए वेक्टर के लिए सबसे अधिक संभावित उम्मीदवार देता है। तालिका प्रविष्टियों की पहचान करके स्कोर को बेहतर बनाना संभव हो सकता है जिसे इस तरह बदला जा सकता है कि तालिका की बेहतर संपीड़ितता कम सटीकता से आगे निकल जाए।


बहुत बढ़िया, मेरे पास एक समान विचार था लेकिन कल्पना नहीं थी कि यह इतनी अच्छी तरह से संपीड़ित कर सकता है। अब मैं सोच रहा हूँ कि मुझे सटीकता पर अधिक जोर देने की आवश्यकता है: p लेकिन मैं इसे बदलने की योजना नहीं बनाता।
aditsu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.