OCR 到底做了什么,以及它为什么那样出错
识别引擎分阶段工作。图片先被转成黑白,这个阈值必须猜出“纸在哪里结束、墨在哪里开始”;深色形状被归成行、再归成词、再归成字符;一个神经网络——LSTM,用数百万行扫描文本训练过——在上下文字符的帮助下读每个字符;最后一轮词典会往真实单词上轻轻推一把。这条链里没有一环涉及“理解”。识别器不知道一个词是什么意思,所以它发现不了 “reciept” 是错的,并且会乐于返回一个读起来通顺、意思却完全不同的句子。
这也正是它的失败模式如此可预测的原因。手写抛掉了模型训练时见过的字形,所以基本不在范围内——干净的印刷体大写字母有时能用,连笔字几乎不行。斜着拍的一页会让行定位器苦战。低对比度、阴影、手机闪光灯、细字体、文字压在照片上、以及低于约十个像素高的印刷字,都以同样的方式损失准确率:在神经网络看到之前,字母已经无法区分了。
结果里的置信度数字是识别器对整张图片自己的估计,值得一看:90 以上通常意味着干净印刷体被正确识别,六十多通常意味着某个地方很难——它是一个警告,提示你去核对文字而不是相信它。这里不会对返回结果做更正、拼写检查或整理,因为一个悄悄改写你文档的工具,比一个给你看它真正看到了什么的工具更糟。