OCR 规避实验室

把一句话做成图片,调到机器读不出、而你还能读得出。页面里跑的是真实的 Tesseract 引擎,每一轮都会给出识别结果,看你能找到几条「人机分离」的配方。

动手实验 图片不出浏览器 结论反直觉

实验台

先自己看一眼预览图,读得出就读得出,读不出就读不出。然后按两个按钮之一,跟机器对一次答案。想连续试就换预设,一轮一轮来。

机器看到的就是这张图 OCR 引擎待启动

图看不清就点它放大,再点一下收起

你还读得出吗?

战绩

四个格子里,只有第一格算真的找到了方法:人读得出、机器读不出。另外三格,要么参数根本没起作用,要么把图弄成了谁都读不出的样子。

每一轮落在哪 横轴是参数强度,纵轴是机器读出的相似度,蓝色虚线是 80% 判定阈值
人机分离 都能读 只有机器能读 都读不出

你找到的「人机分离」配方

但你刚才干的这件事,有 20 年历史了

你调出来的每一招,都是验证码用过的

波浪扭曲、干扰线、笔画切断、低对比度、切碎错位,这些手法 CAPTCHA 在 2005 年前后就全用过了。你刚才调出来的东西,等于手工做了一个二十年前的验证码。

而深度学习的 OCR,早就不看笔画了

传统 OCR 要先二值化、再切字、再逐字比对,你把笔画切碎它就崩。现在的识别模型把整行送进网络,靠上下文猜整句,字被切碎了它反而补得更准。

更麻烦的是,现在读图的不止 OCR

多模态大模型是直接看这张图的。它能靠语义把残缺的、扭曲的、错位的字补回来,比人还稳。你把人眼卡在临界点上,它照样读得出来。

唯一真能骗过模型的,是「对抗样本」

在像素上叠一层人眼几乎看不见的扰动,让模型把「机密」读成「公开」。这招确实有效,但它是针对某个具体模型算出来的,换个引擎、升个版本就可能失效,现在多模态模型也扛住了不少。

还有更聪明的一类做法:让 OCR 读错内容

知乎这个问题下面有个答案就很有意思:在大字里藏小字。OCR 认出大字,就认为这块区域已经处理完,不会往下细看,而小字才是真正要藏的东西。另一个答案用 Gamma 曲线配黑白棋盘格做仿色,人眼看到的亮度和模型降采样后拿到的数值对不上,字在人眼里还在,在模型眼里已经没了。

所以别在像素上较劲

把秘密做成图片这件事本身,才是问题所在。

  • 要发就发局部。把需要看的那一块截出来,别把整屏丢出去。
  • 用权限,别用像素。真要防机器,靠访问控制、水印追溯、加密通道,图像技巧挡不住。
  • 把「人还能读」当成一条底线。如果人眼也读不出了,这张图对谁都没用了。