把系统拉出去考试
在自己的画板上,我们的"切碎 + 动态规划 + k-NN"流水线看起来相当能打。 但画板是主场:笔迹粗细统一、背景纯白、写字的人还会体谅机器。 真正的考场是别人的数据——这里用的是 CVL 数字串数据集 (维也纳工业大学,ICDAR 2013 竞赛官方数据):约 120 个人用圆珠笔在纸上写的 1262 串数字,扫描件。 真值就写在文件名里,评测全自动。
同一套流水线,只换预处理入口(彩色扫描 → 灰度 → Otsu 二值化 → 缩放到画板尺度),其余原样上阵。
成绩阶梯
"诚实评测":CVL 单字样本加入参考库,但查询某人写的串时屏蔽库里他本人的全部样本(leave-writer-out)。 "标签泄漏"行展示不屏蔽会虚高多少——库里混进考生自己的字,成绩 +5~12 个点,这就是为什么竞赛必须按书写者划分数据。 另注:切割长度全对率只有 60.8%,它封死了整串成绩的上限——目前的短板在切割,不在认字。
画板上的 96% 到了真实考场先掉到 65%——这一跳叫域偏移:MNIST 是美国人口普查员的笔迹, CVL 是奥地利人的圆珠笔字,两种"字体"。给参考库加入 14k 张本地样本后回到 72.6%: 数据分布的匹配,比数据的数量重要(14k 本地样本干翻了 60k MNIST 做不到的事)。
案例展廊
每张图上的紫框是系统的切割结果,框下数字是该段的判定。三行文字分别是真值与两种参考库下的识别串,认错的位红色标出。
混淆对的前后对比
仅 MNIST 库
| 真值 → 误判 | 次数 |
|---|---|
| 1 → 4 | 97 |
| 7 → 1 | 89 |
| 1 → 7 | 66 |
| 9 → 3 | 49 |
| 3 → 1 | 42 |
| 2 → 1 | 41 |
+ CVL 本地库(诚实)
| 真值 → 误判 | 次数 |
|---|---|
| 7 → 1 | 58 |
| 9 → 3 | 48 |
| 9 → 4 | 37 |
| 9 → 1 | 33 |
| 5 → 1 | 22 |
| 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% 以上, 差距的名字叫"让机器自己学特征"——这正是下一课的主题。