简介:本文从攻防对抗视角解析一种对抗自动OCR识别的图片文字混淆思路:利用大字号与小字号文字的空间嵌套,诱导OCR检测模型提前判定区域已识别,从而漏检关键内容,同时不影响人眼阅读。文章给出参数设计、实现步骤与代码示例,并分析其适用边界与防御建议。
OCR(光学字符识别)技术已经从传统的版面分析加字符分类流水线,演进为基于深度学习的端到端检测识别框架。现代OCR系统通常包含两个核心阶段:文本检测(定位图中文字区域)与文本识别(将区域内容转为字符序列)。检测阶段负责给出文字框,识别阶段负责解码框内内容,二者串联完成整图转写。
这一流水线的高效性带来了一个副作用:图片中的文字一旦被自动识别,就可能被用于内容审查、数据抓取、信息提取等下游流程。在某些正当场景下,内容生产者希望图片中的文字只对人可见、不对机器可读,例如防止截图被批量采集、防止验证信息被自动化脚本提取、防止带水印的样张被直接转写。这就引出了一个技术问题:如何设计图片,使自动OCR流水线漏检或误判,而人眼阅读不受影响。
本文讨论的核心思路并非”让文字变得模糊到无法识别”,而是反过来利用OCR流水线自身的判定逻辑,用可被识别的文字去干扰对目标文字的检测。这是一种针对检测阶段的对抗性设计,属于广义”隐写术”(steganography)与对抗样本(adversarial example)交叉领域的一种朴素实践。
多数文本检测模型在输出文字框时,会对图面进行区域扫描,并倾向于避免对同一区域重复输出高度重叠的框。换言之,当一个大文本框已经覆盖了某片区域,检测器在后续处理中会认为该区域”已被检测过”,从而降低对区域内部更小文字的响应。这一行为在正常版面中是合理的——它抑制了重复框。但如果我们刻意构造”大字包小字”的版面,就能让大字的检测结果”掩盖”小字的存在。
根据目标文字与掩护文字的相对大小,可分为两种模式:
选择哪种模式,取决于目标OCR流水线的偏好:若其对小字检测精确,则采用小字藏大字;若其全局检测能力强、倾向于先抓大区域,则采用大字藏小字。实际使用中需要通过试错确定,因为不同OCR系统的预处理、分辨率归一化、检测阈值各不相同。
人眼阅读依赖语义与注意力机制,能够主动聚焦于目标字号层级,忽略作为掩护的另一层文字。而自动OCR是被动扫描,缺乏”意图”判断,只能依赖检测器的置信度与重叠抑制策略。二者的差异正是该方法的立足点。需要强调:该方法只防自动识别,不防人工解读,也不防”人工介入后再识别”的流程。
嵌套效果由四个参数量决定:大字字号、小字字号、行间距、字间距。经验上:
以下给出一组参考配置(具体需按实际OCR系统微调):
配置A(大字藏小字):掩护字号 = 400 px,目标字号 = 12 px行间距 = 1 px,字间距 = 1 px配置B(大字藏小字,更紧凑):掩护字号 = 200 px,目标字号 = 12 px行间距 = 1 px,字间距 = 1 px配置C(小字藏大字):掩护字号 = 12 px,目标字号 = 300 px行间距 = 1 px,字间距 = 1 px
实现上需要注意绘制顺序。若采用”大字逐字填充”的方式,应先把目标小字按固定网格排布,再将掩护大字逐字覆盖到网格之上,使每个大字恰好落在小字间隙附近,从而在视觉上形成”大字为主体、小字为纹理”的效果。相比”全局由上至下、由左至右”的简单排布,逐字填充能降低人眼分辨小字的难度,同时保持对检测器的干扰。
一个示意性的绘制流程(伪代码):
# 1. 创建画布canvas = create_canvas(width, height)# 2. 铺设目标层(小字),按网格排布for row in range(rows):for col in range(cols):draw_text(canvas, target_char, x=col*cell_w, y=row*cell_h,font_size=small_size)# 3. 覆盖掩护层(大字),逐字填充for each_big_char in cover_text:draw_text(canvas, big_char, x=next_x, y=next_y,font_size=large_size)advance_cursor()# 4. 导出为无损格式,避免压缩引入伪影save_lossless(canvas, "output.png")
图片在上传、传输过程中常被平台压缩。有损压缩(如JPEG)会模糊小字边缘,可能反而增强或削弱嵌套效果,需要实测。建议优先使用无损格式并在桌面端获取原图,避免移动端二次压缩改变字号有效尺寸。若必须在有损通道传输,应适当放大目标字号或提高对比度,保证人眼仍可读。
常见的”加高斯模糊”思路依赖人工判断:人先看出图中存在文字,再决定模糊哪一块,模型不会主动做这件事。若模型无条件对全图模糊,正常截图也会一起失效,得不偿失。相比之下,嵌套隐写的优势在于不改变人眼可读性,且不需要人工逐图干预;劣势在于它是对抗性的、依赖对方系统缺陷,稳定性不如”根本不把文字放进图片”这一根本方案。
若目标是彻底阻止自动转写,更稳妥的做法是从信息载体入手:
这些方案与嵌套隐写并不互斥:前者解决”愿不愿意被识别”,后者解决”识别后如何追责”,组合使用更符合工程实践。
从OCR系统设计者的角度,针对此类嵌套隐写的防御手段包括:
这些手段本质上是在提升检测器的”穿透力”,与对抗方法形成持续博弈。任何单方面的”技巧”都只是阶段性有效。
“以字藏字”是一种利用OCR检测阶段重叠抑制逻辑的朴素对抗思路:通过大字与小字的尺度嵌套,让检测器误以为区域已被覆盖,从而漏检目标文字,而人眼阅读不受影响。它的价值在于揭示了自动识别流水线的一个结构性弱点——检测器缺乏语义意图判断。工程实践中应清楚其边界:它依赖对方系统未做针对性训练,稳定性有限,不应作为唯一防护手段。真正可靠的方案仍是访问控制、载体变换与可追溯水印的组合。对该技术的讨论也应限于防御与测试目的,避免用于规避合法合规的内容审核流程。