← Back to Home

把系统拉出去考试

自己的画板上,我们的"切碎 + 动态规划 + k-NN"流水线看起来相当能打。 但画板是主场:笔迹粗细统一、背景纯白、写字的人还会体谅机器。 真正的考场是别人的数据——这里用的是 CVL 数字串数据集 (维也纳工业大学,ICDAR 2013 竞赛官方数据):约 120 个人用圆珠笔在纸上写的 1262 串数字,扫描件。 真值就写在文件名里,评测全自动。

同一套流水线,只换预处理入口(彩色扫描 → 灰度 → Otsu 二值化 → 缩放到画板尺度),其余原样上阵。

成绩阶梯

字符准确率(1 − 编辑距离/总字符)
参考库:仅 MNIST 60k 64.8%
+ CVL 本地 14k诚实评测 72.6%
+ CVL 不屏蔽本人标签泄漏 77.9%
整串全对率
仅 MNIST 60k 17.1%
+ CVL 本地 14k诚实评测 27.7%
+ CVL 不屏蔽本人标签泄漏 39.5%

"诚实评测":CVL 单字样本加入参考库,但查询某人写的串时屏蔽库里他本人的全部样本(leave-writer-out)。 "标签泄漏"行展示不屏蔽会虚高多少——库里混进考生自己的字,成绩 +5~12 个点,这就是为什么竞赛必须按书写者划分数据。 另注:切割长度全对率只有 60.8%,它封死了整串成绩的上限——目前的短板在切割,不在认字。

画板上的 96% 到了真实考场先掉到 65%——这一跳叫域偏移:MNIST 是美国人口普查员的笔迹, CVL 是奥地利人的圆珠笔字,两种"字体"。给参考库加入 14k 张本地样本后回到 72.6%: 数据分布的匹配,比数据的数量重要(14k 本地样本干翻了 60k MNIST 做不到的事)。

案例展廊

每张图上的紫框是系统的切割结果,框下数字是该段的判定。三行文字分别是真值与两种参考库下的识别串,认错的位红色标出。

混淆对的前后对比

仅 MNIST 库

真值 → 误判次数
1 → 497
7 → 189
1 → 766
9 → 349
3 → 142
2 → 141

+ CVL 本地库(诚实)

真值 → 误判次数
7 → 158
9 → 348
9 → 437
9 → 133
5 → 122
1 → 4(跌出前八)

换库前的头号冤案"帽子 1 → 4"(97 次)直接消失——库里有了欧式写法的 1,帽子不再是罪证。 剩下的混淆几乎被 9 一个数字包场:欧式 9 圈小、尾巴直,和 3、4 的局部形状撞车, 这是光靠"比像素距离"跨不过去的坎。

这一趟学到什么

三个教训

1. 主场成绩不算数。画板 96% → 真实数据 65%,域偏移是所有识别系统出门的第一课; 诊断也要对症——我们先试了"笔画增粗",各项指标一涨一跌净收益为零,说明瓶颈不是笔画是字体。

2. 换本地题库比堆数据有效。14k 张同分布样本带来 +8 个字符点, 错误结构的变化(1→4 消失)证明它修的正是域偏移本身。

3. 评测方法决定数字可信度。参考库里混进考生本人的字,成绩虚高 5-12 个点。 leave-writer-out 不是洁癖,是底线。

往上的路也看清了:切割长度全对率 60.8% 是整串成绩的天花板(粘连的 "79"、挤成一团的 "000"), 而 9 的混淆群暴露了像素距离的极限。竞赛级系统在这类数据上能到 85% 以上, 差距的名字叫"让机器自己学特征"——这正是下一课的主题。