作者在不更换 OCR 模型的情况下,按形状与背景筛除不适合自动处理的检测框,24 张照片的候选框从 125 个降至 76 个,人工确认的主体误检从 10 个降至零。部分平铺水印检测框也被过滤,而原有合成测试指标未体现这些变化。
我们的自动水印检测器在 24 张真实用户照片上返回了 125 个文本框,而且全部默认选中。其中 10 个落在婴儿的脸、电影剧照、岩石、毛巾等位置——那些地方根本没有文字。现在被我们过滤掉的另外 39 个框里确实有文字,但它们所在的背景,浏览器内运行的图像修复模型无法在不产生幻觉的情况下重建。因此,我们修改了规则:自动检测现在只报告模型真正擅长处理的内容——保留 76 个框,消除了落在主体上的误报,平铺水印不受影响——其余交给用户处理。
这组结果不需要新模型、更大的模型,也不需要服务器。我们只需要决定:哪些检测结果值得自动采取行动。
我们的文本检测器采用 PP-OCRv5 的 DB head,也就是第 6 篇介绍过的那个 4.7 MB 模型。它是一个形状检测器,回答的是“哪里可能有文字”,而不是“这是不是水印”。只要某种结构看起来像笔画——对比度高、大致呈周期性排列、线条细——就可能触发检测。
自然照片里到处都是这样的结构:眉毛、眼睛和嘴唇,手指和指关节,甜点内部的碎屑纹理,织物褶皱和头发,窗棂、阳台栏杆、人群。它们都不是文字,而形状检测器并没有真正理解文字外观的能力。
棘手的是,这些误报的置信度并不低。落在婴儿脸上和电影剧照上的框,平均检测概率达到 0.81–0.94,完全处于同一组照片中真实水印的分数范围内,也就是 0.74–0.995。我们已有的所有置信度筛选条件,包括平均分数 ≥ 0.6、最小面积、填充率和面积上限,对此都无能为力,因为检测器并没有犹豫。它是在信心十足地报告一张脸。
这里有一个普遍适用的教训:“有多大把握”和“该不该采取行动”是两个不同的问题。没有哪个置信度阈值能把“真实水印”和“确实像文字的纹理”区分开,因为后者的得分同样很高。
检测决定了去除效果的上限,但它只占问题的一半。我们的图像修复默认使用 MI-GAN,也提供 LaMa 作为用户主动启用的高质量档位。两者都以 512² 图块运行在用户自己的 GPU 上,也可以通过 WASM 在 CPU 上运行。这种架构根据周围的上下文重建缺失区域。在均匀背景上,它能匹配背景的统计特征,修复结果几乎看不出来。在复杂背景上,它生成的纹理虽然在统计上合理,空间结构却是错的。
这两种情况我们都测过。在合成测试集的一个城市纹理案例中,保留淡淡的水印不处理,与无水印原图相比,MAE 为 3.11;用修复模型重绘整个矩形区域,MAE 则达到 24.79,比什么都不做还差八倍。在真实用户照片中,同样的问题表现为:沙地上凭空出现汽车形状的幻觉,云层中横着一道像地平线的涂抹带,原本的山脊线变成一团岩石状的色块。
因此,这两种失败会叠加。复杂背景上的误报框是最糟糕的组合:模型被要求凭空编造纹理,而且编造的位置恰好覆盖了用户照片中的真实主体。落在纯色墙面上的误报框,最多只是难看。
检测器误报多,通常的解决办法是换一个更好的检测器。但这条路对我们并不可行。这里有必要把限制说清楚,因为正是这些限制,决定了本文讨论的是产品规则,而不是模型改进。
没有服务端兜底。 产品的承诺是:你的照片永远不会离开当前标签页。我们不能把困难案例交给更大的模型,再取回结果;那意味着上传,而这正是我们坚决不做的事。
没有弹性扩容。 托管在服务器上的检测器遇到糟糕案例时,可以重新训练、扩容,或者换成更大的模型。用户浏览器里的本地模型,则只能是我们交付的那一套:一个 4.7 MB 的 OCR 模型、一个 11 MB 的 YOLO 模型,以及一个需要用户主动启用的 102.8 MiB fp16 LaMa 档位。要让检测器有实质性的改善,就意味着新权重、新的文件托管,以及每位用户都要再下载一次。
设备就是资源预算。 手机和低配笔记本运行的是同一套 512² 图块流水线。模型的感受野由架构决定,不会随着请求改变。
我们没有用于区分“水印与场景文字”的训练集。 要分清一段文字是叠加在图片上的,还是印在产品标签上的,需要语义理解,以及我们并不具备的监督训练数据。而要从用户照片中收集这些数据,就必须请用户上传图片。
在这些限制下,剩下唯一能调节的,就是决定对哪些检测结果自动采取行动。如果模型分不清叠加文字和人脸,我们至少可以分清简单背景和复杂背景,也可以分清一行文字和一团块状结构。
我们上线的规则刻意保持保守:自动检测只报告局部简单背景上明显的文字。其余情况由用户处理,而用户的操作路径并没有比以前更差。用户画出一个框后,系统会在选区内运行同一个受区域约束的检测器,再做形状细化。因此,想去除复杂背景上水印的用户,依然可以完成操作,而且 mask 会贴合实际笔画。
这是一次理念上的调整,我们想把它说清楚。此前,检测流水线遵循的是第 12 篇提出的规则:“漏检可以补救,误报无法挽回。”如果我们漏掉一个淡水印,用户涂一下,结果仍然可以很好;如果我们把照片内容吞掉了,信任可没有撤销键。这次修改把规则进一步收紧为:自动模式首先追求零误报;漏掉的交给用户。
这道筛选在已有的框级筛选条件,也就是分数、面积和填充率之后运行,在组装形状之前执行。它只作用于图片工具的自动检测路径——质量测试、视频流水线和手动细化路径均不受影响。
条件 1:框的形状必须像一行文字。 文本框必须呈长条形:宽高比 ≥ 1.5,即横向文字;或者 ≤ 0.4,即纵向文字。小框,也就是短边 < 40 px 的框,不受这一条件限制,因为平铺水印中的单个字符本来就可能又小又接近正方形。面积较大、接近正方形的框,是 OCR 误检主体时的典型形状。这个条件过滤掉了婴儿脸上的框(111×85)、电影剧照上的框(66×54、133×107、197×109)、一盘食物上的框(46×100),以及 cosplay 人像上的框(277×344)。
条件 2:框周围的背景必须简单。 我们在每个框周围取一个环带,pad = 短边的 35%,并限制在 8–64 px 之间,然后计算两个统计量:亮度标准差和平均绝对梯度。只有环带的 std ≤ 35 且 gradient ≤ 14,才接受这个框。
两个细节让这项测量真正有效,而不是摆设。首先,只统计环带中的像素——框内的像素包含水印本身的笔画,如果把它们算进去,每个水印看起来都会像是位于复杂背景上。其次,只在环带像素之间计算梯度;笔画边缘不代表背景复杂度。
参数校准来自这组 24 张照片。真实水印位于纯色墙面、水面或天空时,环带测得的 std 为 7–30,gradient 为 3–10。误报位于人脸、手臂、食物或人群上时,测得的 std 为 32–89,gradient 为 4–27。阈值就设在这些测量结果之间的分界位置。
豁免条件:重复本身就是证据。 如果一组包含四个或更多文本框,且尺寸相近,宽度和高度的差异都在 ±30% 以内,就将其视为平铺水印,豁免上述两个条件。重复本身就是强有力的证据,说明你看到的更可能是叠加层,而不是画面内容。而且,平铺水印的每个实例都很小,单个实例只会留下一个局部小缺口,修复模型确实有能力填好,即使它位于山坡上也一样。我们的两个平铺案例分别保留了 38 个框中的 36 个,以及 22 个框中的 19 个。被过滤掉的是低置信度的边缘碎片,以及其中一个案例里位于山脊上的单个大型居中标题。
这里补充一点方法上的说明,因为我们之前在这件事上吃过亏。早期一轮实验曾得出“环带复杂度没有区分能力”的结论,但那次研究的是另一个问题:这个区域应该使用矩形 mask,还是字形 mask?分类目标很重要:同一个测量指标,在选择 mask 策略时可能完全分不出差别,在决定是否自动选中检测结果时,却能很好地区分。我们已经把这一区别写进调参笔记,避免把两个结果混为一谈。
我们逐一查看输出叠加图,确认消除了以下误报:家庭照片中婴儿的脸和一双腿、电影剧照上的三个框、山景照片中的一处岩石、两张自拍中的毛巾和枕头、cosplay 人像上一个人脸形状的框,以及一盘食物。
我们有意交给用户处理的,是复杂背景上的水印:日落山脊上的大型“Luma AI”标题、横跨冰箱的房产经纪人电话号码、云层上的“LIONSGATE”、大片云层上的手写标题、沿着手部排列的纹身师姓名、横跨模特头发的品牌字标;还有画面中属于说明文字而非叠加水印的内容,例如表情包配文、商店招牌、社交应用的用户名栏。这些检测结果确实是文字,但我们选择不自动擦除,因为在这样的背景上,修复模型的输出本身会成为瑕疵,谈不上干净地去除。想处理这些内容的用户,只需画一个框,就能得到同样的字形级 mask。
流水线的其余部分没有变化。合成测试集包含 13 个案例,平均 recall 为 89.2%、precision 为 65.3%、区域 PSNR 为 24.8 dB,结果在位级别上完全一致,因为测试路径没有启用这道筛选。(这次修改之前,就已经有两项测试门槛未通过:一个案例的区域 PSNR 为 12.3 dB,淡色平铺水印案例的 recall 为 47.9%。这些都是既有问题,与本次修改无关。)手动细化路径保持不变,而这道筛选只是检测器调用中的一个选项,因此可以针对不同功能界面分别开启或关闭。
我们确实为视频水印去除工具启用了它,因为视频中的误报比静态图片更糟糕:mask 会应用于整个片段,因此一块凭空生成的修复区域,会一帧接一帧地反复出现。字幕去除工具则有意保留完整的自动检测能力——字幕本来就是用户要求删除的内容,它可能出现在人脸上,也可能出现在街景上,按背景筛选会让工具失去意义。
这里介绍的检测器运行在免费的浏览器内水印去除工具中,同时使用第 6 篇介绍的字形级 mask,以及第 12 篇中的 mask 约束修复。没有任何内容会被上传:检测、mask 构建和图像修复都在标签页内完成。如果你还需要流水线的另一半——不上传照片,就把它放大 4×——那项功能也运行在同一套本地模型之上。
本文是 ClearPix 工程系列的第 15 篇,介绍我们如何在 clearpix.org 构建免费、保护隐私、完全在浏览器内运行的媒体工具。
如需进一步采取措施,你可以考虑屏蔽此人和/或举报滥用行为。