简介:本文从视觉感知差异与特征空间对抗两个角度,拆解一种降低图片文字被OCR识别的技术思路。你将了解如何利用人眼轮廓补全机制设计彩色光栅,使文字对机器模型更不友好,同时保持人类可读性,并获得一套基于通用图像处理库的实现方法。
在很多业务场景中,我们希望图片中的文字对人类可见,但对自动化OCR系统尽量“不友好”。这类需求常见于验证码、版权水印、敏感信息脱敏展示、防批量爬取等场景。
传统做法通常是增加干扰线、扭曲字符、添加噪点或降低对比度。但这些方法存在一个明显问题:它们往往同时降低人眼的可读性。干扰越强,OCR识别率确实会下降,但用户体验也随之变差。
更关键的是,现代OCR系统通常包含预处理、文本检测、特征提取、序列识别等多个阶段。简单的像素级噪声在经过缩放、滤波和归一化之后,很可能会被大幅削弱。因此,我们需要从更深层的视觉表示入手,寻找一种“人眼容易、机器困难”的差异化设计。
近年来的研究表明,人类视觉系统与深度视觉模型在特征提取方式上存在显著差异。人类善于利用上下文和知觉组织来补全不完整轮廓,而深度模型更依赖局部纹理、边缘响应和统计特征。如果能构造出一种图像,使人类依赖高层知觉组织才能识别文字,而模型依赖的低层特征被破坏或误导,就能在不牺牲人类可读性的前提下降低OCR识别能力。
一个值得借鉴的思路来自视觉心理学中的“虚幻轮廓”现象。人眼能够从一些并不连续、甚至并不存在的物理边缘中感知出完整形状。这种能力与格式塔心理学中的连续性原则、闭合原则密切相关。
把这一思想应用到文字隐藏上,做法可以概括为:
这样一来,文字区域和背景区域在颜色统计上非常接近,甚至整体颜色分布几乎一致。对于只关注局部纹理或统计特征的模型来说,文字与背景的区分度被大幅削弱。
但对于人类观察者来说,相位错位会在文字轮廓附近形成一种微妙的“条纹对齐断裂”。人眼能够将这些断裂组织成连续的轮廓线,从而感知到文字形状。这种感知并不完全依赖文字的物理边缘,而是依赖更高层的视觉组织机制。
那么,为什么这种方式对OCR模型更困难?原因主要有三点:
第一,OCR模型通常会对输入图片进行缩放。缩放操作本质上是一个低通滤波过程,会模糊或消除高频条纹中的相位细节。当相位信息被削弱后,文字轮廓对模型而言变得更加模糊。
第二,卷积神经网络的前几层主要提取边缘、纹理、颜色对比等局部特征。彩色光栅本身具有强周期性纹理,这会与文字轮廓信号发生竞争,使模型难以从噪声中分离出有效形状信息。
第三,当模型使用归一化操作时,文字和背景相近的颜色统计会进一步降低特征区分度。模型无法像人类那样借助高层知觉组织来补全不存在的物理边缘。
仅靠光栅相位设计,对传统图像处理类OCR可能效果较好,但对基于深度学习的多模态模型或大型视觉语言模型,效果可能仍然有限。原因是这些模型经过大规模训练后,具有极强的特征提取能力,能够从非常微弱的信号中恢复出语义信息。
为了进一步增强保护效果,可以在光栅图像之上叠加对抗扰动。对抗扰动的目标不是破坏像素,而是改变深度模型提取到的高层语义特征。
具体可以分为两类场景:
白盒场景:如果能够访问目标模型的结构与参数,可以直接计算损失函数关于输入图像的梯度,然后沿着梯度上升方向调整扰动,使模型产生错误输出。优化目标可以是降低正确文本的生成概率,也可以是提高某个指定错误文本的生成概率。
黑盒场景:如果无法访问目标模型,可以采用代理模型策略。例如使用若干公开可用的视觉语言模型作为代理,在代理模型上优化扰动,使图像特征偏离正确文本特征、靠近干扰文本特征。由于不同深度模型在特征空间上具有一定的一致性,这种扰动有机会迁移到未知目标模型上。
需要注意的是,对抗扰动的强度需要控制在一定范围内。过强的扰动会产生明显的视觉伪影,破坏人类可读性,也可能引起平台的异常检测。通常可以采用L∞范数约束或感知损失约束,在保护效果与视觉质量之间取得平衡。
下面给出一套不依赖特定平台能力的实现路线。该路线主要使用通用的图像处理与数值计算库即可完成。
首先将原始图片转换为灰度图,采用大津法进行自适应阈值分割,得到前景文字区域。由于文字可能位于复杂背景上,可以先用形态学操作去除细小噪点,再通过连通域分析筛选出主要文字区域。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, mask = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
为了避免文字边缘过于规整,可以生成一个低频随机位移场,对文字轮廓进行轻微扰动。这种扰动模拟了传统验证码中的字符扭曲,但幅度要更小,以免影响人类识别。
dx = low_freq_noise(height, width, scale=3.0) * amplitudedy = low_freq_noise(height, width, scale=3.0) * amplitudewarped_mask = remap(mask, dx, dy)
为每个颜色通道生成具有不同方向或频率的正弦光栅。在文字掩码区域内部,将光栅相位反转180度,使文字内部光栅与背景光栅在边界处形成错位。
phase = 2 * np.pi * (x * fx + y * fy)grating = 0.5 + 0.5 * np.sin(phase)grating_text = 0.5 + 0.5 * np.sin(phase + np.pi)combined = np.where(warped_mask > 0, grating_text, grating)
将不同方向或频率的光栅分别赋给不同颜色通道。例如,R通道使用水平方向高频光栅,G通道使用垂直方向中频光栅,B通道使用斜向低频光栅。再对每个通道叠加微小的局部条纹扰动,最后合并为彩色图像。
这样做的好处是:不同通道包含互相独立的周期性信号,对模型的特征提取形成多路干扰;同时人类视觉系统仍然能够通过跨通道的轮廓组织来识别文字。
如果需要进一步提升对深度模型的防护能力,可以在光栅融合图像上叠加轻微对抗扰动。扰动的生成可以采用基于梯度的迭代方法,并将每次迭代的扰动限制在较小范围内。
delta = torch.zeros_like(img, requires_grad=True)for _ in range(steps):loss = -target_text_loss(model(img + delta), target_text)loss.backward()delta.data = (delta + alpha * delta.grad.sign()).clamp(-eps, eps)delta.grad.zero_()
任何图像保护方案都面临一个核心矛盾:保护效果与用户体验之间的权衡。评估时应当同时关注以下指标:
在参数选择上,光栅的空间频率非常关键。频率过高,缩放后容易被滤除,同时也可能降低人类识别舒适度;频率过低,则文字与背景的纹理差异变小,模型反而可能更容易利用低频轮廓信息。通常需要根据目标图片的分辨率和文字大小进行多轮实验。
形变幅度同样需要控制。过大的形变会使人类难以辨认,过小则容易被基于弹性变换校正的预处理步骤还原。一个可参考的原则是:形变应该足以破坏文字的连续笔画结构,但不至于改变文字的拓扑形状。
对抗扰动的强度则建议从较小值开始逐步增加。可以设定一个可接受的最大像素偏移,例如每个通道不超过8/255,然后在该约束下搜索最优扰动方向。
这类技术在身份验证、内容保护、风控对抗等领域具有潜在价值。例如,在需要展示给真人用户但不想被批量采集的文本信息展示中,可以对图片施加光栅化处理。又例如,在验证码系统中,可以将传统干扰线替换为更隐蔽的相位错位光栅,降低对用户的视觉干扰。
工程实现时有几个需要注意的点:
第一,不同显示设备对颜色和条纹的渲染存在差异。在设计阶段应尽量选择中等频率、中等对比度的光栅参数,避免在低质量屏幕上出现摩尔纹或闪烁感。
第二,图片在传输过程中经常被压缩。有损压缩可能会破坏相位细节,导致人类可读性下降,但同时也可能进一步降低OCR识别率。需要根据实际链路进行测试。
第三,如果图片会被缩略图系统自动缩放,应当确认目标尺寸下的实际效果。必要时可以生成多尺度版本,或者根据最终展示尺寸反向设计光栅频率。
第四,对于无障碍访问场景,应提供可选的替代文本或人工验证通道。任何视觉干扰方案都应考虑对视力障碍用户的影响。
最后,需要明确的是,这类技术手段可以增加自动化采集的难度,但并不能提供绝对安全保证。随着模型能力的提升,任何静态图像处理方案都可能被针对性地破解。因此更合理的定位是将其作为整体风控体系中的一层防护,而不是唯一防线。
将视觉心理学原理与对抗样本方法结合,为“人机可读性差异”问题提供了一种新的解决思路。其核心价值在于:不再依赖粗暴的噪声干扰,而是从人类与模型在特征表示层面的根本差异出发,设计更优雅、更不易被感知的防护方案。