报销季看同事三秒录完一张发票,我把OCR这东西刨了个底
上周四下午,办公室最后一排那位哥们儿。
一沓纸,三十多张发票。餐饮的、打车的、楼下打印店的。我还在那儿一张一张敲金额、敲开票日期,手指头发酸。他呢?手机往桌上一架,对着摊开的一堆纸,咔嚓、咔嚓、咔嚓——十几秒,一张表格出来了。
我当时的第一反应是:这也太不公平了。
第二反应是:这玩意儿到底怎么做到的。
那天晚上回去我就没睡好。倒不是焦虑,是好奇心上来了,越琢磨越觉得有意思。今天就把我扒拉出来的这些东西,用大白话讲给你听。
手机拍摄纸质发票OCR识别框选界面截图

手写体文字识别准确率对比示例图

你随手拍的那张图,后来去哪了
这个我觉得比准确率重要得多。
很多App里,OCR是在云端算的。也就是你的照片先上传,服务器跑完模型,再把结果发回你手机。中间那张原图在哪、留多久、会不会被拿去做别的,你一般是看不到的。
当然也有本地算的。现在手机芯片跑一个轻量模型,识别一段印刷体完全够用。但本地模型小,遇到脏图、手写、复杂版面,效果就是比云端的差一截。
所以厂商很难不做取舍。
我的习惯是:身份证、银行卡、合同、体检单这一类的,能用系统自带的相机文字提取就用自带的,尽量别往陌生的识别App里塞。真要用,先看看它有没有说明白数据怎么处理。
顺带说一个有点黑色幽默的事。早期那些图形验证码,设计出来的初衷就是「人认得、机器不认得」。歪曲的字母、噪点、干扰线,全是冲着OCR去的。
现在呢?这些东西基本已经被读穿了。
所以你现在看到验证码越来越像「点出所有红绿灯」「选出自行车」,那其实是被逼的——静态的字符,机器已经不太当回事了。

最后扯两句我自己的感受
有人问我,现在大模型都能直接看图说话了,OCR是不是快过时了。
我觉得不会,但它的位置确实在变。
那种「理解一整张复杂版面,顺便把意思也读出来」的活儿,确实在被大模型一点点接走。但另一种活它接不了:一秒处理八千张单据,只要字段,不要解释,还要便宜。
这活儿还得是OCR。
就像计算器没被电脑淘汰一样——它不酷,但你天天用。
哦对,那天报销我最后还是自己敲的。因为我发现那哥们儿拍完之后,还是花了两分钟挨个核对金额。他说上个月有一次,小数点被认错了,小数点后面那个「0」丢了一位,多报了一千多,被财务打电话约谈。
所以啊,机器认字再快,最后那一眼还得你自己看。
别偷懒。
那堆破发票,怎么变成Excel里一行行的
很多人以为OCR就是「拍照识字」四个字。其实它中间拆得很细。 你可以把它想象成一个人趴在纸上找字。先用眼睛扫一遍,看哪里有字;接着凑近了,一个一个认;认完还得靠脑子判断——刚才那串数字里,哪个是金额,哪个是发票号,哪个是校验码。 这三步,对应到技术里,就是三个完全不同的问题。 第一步是「找」。图像进来,先做点预处理:灰度、去噪、拉正。你拍歪了,它会先估算一个倾斜角,把整张图转回来。这一步做不好,后面全白搭。然后才是检测:把有文字的矩形框一个个框出来。注意,这一步它根本不知道框里是什么,只知道「这块地方像素变化密集,大概率有字」。 第二步是「认」。把每个框里的图,翻译成字符。这一步最吃训练数据。印刷体好办,因为印刷体的字形是标准化的,同一台打印机打出来的「税」字,一万张里长得都一模一样。 第三步是「懂」。这才是真正拉开差距的地方。四十个字符认出来,还得知道怎么排、怎么归类。金额通常带小数点和¥,日期有固定的格式,税率一般就那几个值。靠这些规则,它把一串散字拼成一条结构化的记录。它真正怕的,跟你想的不太一样
大家默认「字丑」是OCR的死穴。嗯,是对的,但不是最重要的那个。 更要命的是「没上下文」。 举个特别典型的例子。数字零和大写字母O,小写字母l和数字1,这两个组合你单独拿出来看,人的肉眼也经常分不清。我打印过一份东西,账号里一串「1l1l1l」,我自己看了三遍才敢确认。 但把「¥1O0.00」放在一起,你立刻就知道了——那必然是零,不可能是字母O。 所以现代OCR后面基本都挂着一个语言模型或者词典,专门干纠错。它做的事,跟你在微信里打错一个字,输入法自动帮你改掉,是同一个思路。只不过它纠的是「被认错的字」,而不是「被按错的键」。 那手写体为什么难? 因为每个人的笔画都不一样。你写「张」,我写「张」,起笔、连笔、收笔,全是个人习惯。印刷体是有统一标准的,手写体没有。训练数据里,印刷体的样本可以堆到天文数字,手写体就那么点,还得覆盖各种人、各种笔、各种歪歪扭扭。 还有几类东西,OCR见了也头疼: 表格的线。线和字挨得太近,切框的时候容易把线算进去,也容易把字切两半。 红章。一个红章盖在金额上,颜色和字不一样,灰度化之后糊成一团,字就没了。 褶皱和反光。纸皱了,光打在塑料膜上,那一块的图基本等于废了。
市面上那些「什么都能认」的说法,我劝你别全信
这句话可能得罪人,但我还是想说。 你经常能看到「识别准确率99%以上」这种宣传。数字本身可能是真的,问题是它测的是什么。白底黑字、工工整整的印刷体,正着拍、光线均匀,那确实能到99%甚至更高。 但你把场景换成:晚上开闪光灯,隔着玻璃拍的,还歪着十五度,纸上有咖啡渍——掉到七八十,一点都不奇怪。 这两个数字都是真的,只是它们说的不是同一件事。 再说一个我踩过的坑:PDF转Word。 很多人以为这是同一个功能,其实里面分了两条完全不同的路。 第一条,电子版PDF。它文件里本来就有文字层,你要转,直接抽出来就行,又快又准,排版也保得住。这压根没OCR什么事。 第二条,扫描件PDF。它就是一张一张的图片,跟照片没区别。这时候才轮到OCR上场,而排版——那些分栏、缩进、页眉页脚——是靠「猜」出来的。所以经常出现字都对了,但顺序排得乱七八糟。段落被拼成一坨,或者一段话被拦腰截断。这不一定是技术烂,这是它本来就在猜。 还有些功能,名字听着像OCR,其实不是。比如「识别身份证」。那是有固定模板的,知道身份证长什么样,各字段大概在什么位置,属于定向提取。你把一张超市小票丢进去,它一样抓瞎。你随手拍的那张图,后来去哪了

最后扯两句我自己的感受
