首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >识别手写数字

识别手写数字
EN

Code Golf用户
提问于 2014-05-19 03:33:44
回答 2查看 1.6K关注 0票数 26

您的任务是读取包含手写数字的图像,识别并打印出该数字。

输入: 28*28灰度图像,以从0到255的784个纯文本数字序列,用空格分隔.0表示白色,255表示黑色。

输出:公认的数字。

评分:我将测试您的程序与1000张来自MNIST数据库培训集的图像(转换为ASCII格式)。我已经选择了图片(随机),但不会公布名单。测试必须在1小时内完成,并将确定n -正确答案的数量。

n必须至少是200,你的程序才有资格。如果您的源代码的大小是s,那么您的分数将被计算为s * (1200 - n) / 1000。最低分获胜。

规则:

  • 程序必须从标准输入中读取图像,并将数字写入标准输出。
  • 没有内置的OCR功能
  • 没有第三方图书馆
  • 没有外部资源(文件、程序、网站)
  • 您的程序必须在Linux中使用可免费使用的软件运行(如果需要,可以接受葡萄酒)
  • 源代码只能使用ASCII字符。
  • 每次修改答案时,请张贴您估计的分数和唯一的版本号。

示例输入:

代码语言:javascript
复制
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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

顺便说一句,如果您将这一行放在输入的前面:

代码语言:javascript
复制
P2 28 28 255

您将获得一个有效的图像文件的pgm格式,与倒置/否定的颜色。

这就是用正确的颜色看上去的样子:

示例输出:

代码语言:javascript
复制
5

排名:

代码语言:javascript
复制
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
EN

回答 2

Code Golf用户

回答已采纳

发布于 2014-05-20 16:59:10

GolfScript 6D (v2:估计得分101 * 0.63 ~= 64)

这是与我之前的GolfScript答案完全不同的方法,因此将它作为单独的答案在v1上发布比编辑另一个答案并生成v2更有意义。

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

Ungolfed

代码语言:javascript
复制
~]: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个元素。它似乎不是特别可压缩,所以主要的高尔夫是基础-转换两个查找表(尺寸和阈值的列表;半空间矢量到数字地图),并共享基本转换代码。

票数 8
EN

Code Golf用户

发布于 2014-05-20 11:47:49

GolfScript 3x3 (v1:估计得分207 * 0.8 ~= 166)

代码语言:javascript
复制
~]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/{))*~}%=

或者概括地说,

代码语言:javascript
复制
~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'MAGIC STRING'{32-}%95^?^2/{))*~}%=

解释

我在高层的做法是:

  1. 阈值像素:如果像素高于t1,那么将其设置为1;否则设置为0
  2. 分组像素。最初,我将28x28网格分解为一个4x4网格(每个子网格为7x7像素);但将其分解为一个3x3网格(子网格为10x10、10x8或8x8像素)使查找表的大小大幅度减少,同时将准确率从56%降至40%左右。
  3. 将每个组中的像素和阈值相加:如果集合像素的数量高于t2,则将组得分为1,否则为0
  4. 根据组分数的向量进行表格查找。(表是使用游程编码和标准基转换技巧进行压缩的。t1t2的大多数选择保留在表的50%到63%之间,作为“不关心”值,这些值可以与相邻值相结合以增加运行长度;我的v1表中的平均运行长度为3.6)。

结果表明,设置t1=t2=0虽然不是最优的,但在精度上与t1t2的最佳值相差不远;在表可压缩性方面非常好;并且允许我将这两个阈值操作组合成[]*0-!! (平面2D数组到1D;删除0s;检查它是否为空)。

查找表为给定的组分数向量提供了最有可能的候选值。可以通过识别可以更改的表条目来提高分数,使表的改进可压缩性超过降低的准确性。

票数 6
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/28207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档