借助 AI 从 0 到 1 搭建图像对比服务(六):防翻拍检测——怎么从“再拍一遍“的照片里揪出尾巴 借助 AI 从 0 到 1 搭建图像对比服务六防翻拍检测——怎么从再拍一遍的照片里揪出尾巴一、场景最脏的作弊手法——翻拍前三只眼睛装好了。CLIP 比内容、EXIF 查出生证、VLM 读图说话。但做着做着我意识到还漏了最脏的一种作弊——翻拍。什么叫翻拍就是拿手机对着另一块屏幕/另一张照片咔嚓再来一遍。这招有多脏它对前面三只眼睛是降维打击翻拍的照片内容一模一样CLIP 相似度爆表——它觉得完美匹配出生证也是全新的你自己手机拍的EXIF 照样成立——查不出毛病VLM 读图读出来的还是那些字、那些物体——它也看不出问题。三只眼睛全被绕过去了。因为从信息的角度看翻拍照本来就是一张新照片它只是内容跟原图长得像而已。那到底怎么防答案出乎我意料翻拍照再像它也是对着屏幕拍的屏幕会留下痕迹。二、防翻拍原理屏幕会露馅我问 AI 的第一句话是翻拍屏幕的照片和直接拍实物的照片像素层面到底有啥区别AI 告诉我肉眼看着像机器眼里全是破绽。屏幕是主动发光的还有一层玻璃还有固定的像素网格这几个物理特性会原样印到翻拍照里。具体有三个可检测的痕迹痕迹产生原因检测方法摩尔纹相机传感器网格 × 屏幕像素网格两种网眼叠加干涉频域分析FFT梯度分布异常二次采样 光学畸变边缘要么过锐要么过平滑高斯三角形特征屏幕反光玻璃面板反光出现亮斑/过曝区域高光面积检测当时看到这张表我第一反应是这玩意儿真的能写出来吗。结果 AI 轻描淡写这三个特征都有成熟的图像处理套路OpenCV 就能搞定。我这才意识到防翻拍这活儿靠的是传统计算机视觉不是深度学习——不用训练模型写算法就行。这正好是 AI 最擅长的领域之一。三、特征一摩尔纹——频率里的指纹摩尔纹是什么我让 AI 讲人话它给了个绝妙的比喻隔着两层纱窗看东西两层网眼一叠就会出现一圈圈奇怪的花纹——这就是摩尔纹。翻拍屏幕时手机传感器的感光网格和屏幕的像素网格就是两层纱窗。叠在一起照片里就会出现一种肉眼几乎看不见、但机器在频域里看得清清楚楚的干涉花纹。关键来了怎么检测AI 给的方法是把图片送到频域里去照妖。这里涉及一个概念傅里叶变换FFT。直接让AI 继续讲人话一张普通图片你可以理解成很多种疏密不同的条纹叠在一起。傅里叶变换就是把这些条纹拆开告诉你每种条纹有多少。普通照片的条纹分布很自然而摩尔纹是一种非常有规律的干涉条纹它在频域里会聚成异常的高频亮点。所以检测逻辑就一句话把图转到频域看高频能量占比高不高。占比高 有摩尔纹 大概率翻拍。写的时候 AI 还做了几个工程化的小动作我都记下来了先把图缩小到 256×256 再算——FFT 计算量大缩图能加速还顺便压掉低频背景干扰加了个汉宁窗——这是防止频谱泄漏的数学技巧大意是别让图片边缘的突变污染了频域结果相当于给信号戴个套把中心低频区域挖掉屏蔽半径 30 像素——因为低频是图片的大轮廓摩尔纹在高频留着低频只会稀释特征。最终输出一个 0~1 的摩尔纹得分。权重 0.6——因为它是最硬的翻拍证据只要它是真的翻拍基本实锤。四、特征二高斯三角形特征——梯度分布两极分化摩尔纹检测需要频域知识我当时已经觉得够硬核了。结果第二个特征更抽象名字都怪高斯三角形特征Gradient Triangle。我直接问了句大实话“这又是啥听名字像数学竞赛题。”AI 的解释我消化完是这样的一张真实照片它的边缘过渡是自然的——有锐利的边也有柔和的过渡梯度分布很均匀。而翻拍照片经历了屏幕显示 → 相机再采样两次折腾边缘会两极分化要么过度锐利锯齿感要么过度平滑糊成一片。那怎么量化两极分化AI 用了统计学里的一个指标变异系数CV。变异系数 CV 梯度幅值的标准差 ÷ 梯度幅值的平均值这个值反映的是数据波动程度。真实照片的 CV 通常落在一个稳定区间经验值 0.8~1.5 左右翻拍照因为梯度两极分化CV 要么异常偏高噪点/摩尔纹把梯度搅乱了要么异常偏低糊成一片。于是检测逻辑变成算这张图的 CV看它偏离正常中心值 1.2多远。偏离越多得分越高。实现上是一套很经典的组合拳先高斯模糊5×5去噪再用 Sobel 算子算横向/纵向梯度合成梯度幅值最后算 CV 偏离度映射到 0~1。说实话这个特征的原理我到现在也只是听懂了个大概但我不需要完全会推导我只需要能验收——拿真照片和翻拍照各跑一遍看它的分数是不是真的能把两类分开。结果证明这招有效。权重0.2。五、特征三屏幕反光——玻璃的破绽第三个特征最接地气屏幕是玻璃的会反光。拍照时环境光或闪光灯打到屏幕上会在照片里留下亮斑、光带甚至局部过曝。直接拍实物没这个问题——纸张、金属、墙壁都不会整片反光。检测方法也最直观AI 只用了三步把图片转到HSV 色彩空间取亮度通道V设个亮度阈值240把极亮区域抠出来再用形态学闭运算把零碎亮斑连成片、去掉噪点算高光面积占比落在 1%~30% 之间判定为屏幕反光。这里有个很细的决策我印象很深为什么不是高光占比越高越可疑占比大于 50% 的情况很可能不是反光而是你拍的就是天空、白墙这种本来就很亮的场景——那是正常亮不是反光。所以 AI 设定了一个区间1%~30%只有落在区间内才算反光嫌疑。权重0.2。六、综合判定怎么才算翻拍实锤三个特征各有得分但单个特征说了不算。比如摩尔纹得分高可能是图片纹理本身复杂反光得分高可能是正好逆光拍了个不锈钢设备。AI 定的判定逻辑是人证物证式的三个特征各自打分0~1每个特征超过自己的阈值摩尔纹 0.6、高斯 0.5、反光 0.5就算触发一条原因加权合成综合分摩尔纹×0.6 高斯×0.2 反光×0.2至少触发 2 条原因或者综合分 0.6才判定为翻拍。这个≥2 条或总分超标的设计我特别喜欢它防住了误伤单看一条特征可能是巧合但两个独立特征同时异常基本就是实锤了——就像破案一个人证可能是看错两个人证互相印证可信度就上去了。同时我还告诉AI这个模块只负责出具证据不负责宣判。它返回的是各特征得分 触发原因至于要不要把这个巡检记录判为作弊那是业务侧的事。跟整个服务的融合引擎只打分不判罚的思路一脉相承。七、小结AI 在传统 CV上的价值第四只眼睛装完了。这章跟前面几章最大的不同前三只靠模型CLIP/VLM这一只纯靠算法OpenCV——FFT、Sobel、HSV、变异系数全是经典计算机视觉。我最大的感受是AI可以把我的想法实现出来。FFT、变异系数、频域、汉宁窗……这些词只是听说过而且之前好多都是商业付费才可以用的。但 AI 把它们组合并实现出来我一行代码没写却每步都能验收——拿真照、翻拍照跑一遍看分数分不分开。它会主动处理过度拟合的坑比如反光检测特意排除占比 50%的亮场景避免了把白墙当天花板误判。这种边界思考是能用和好用的区别。至此四只眼睛全部装齐CLIP—— 比内容像不像EXIF—— 查照片出生证VLM—— 读图说话抠文字和物体防翻拍—— 抓对着屏幕再拍一遍的作弊。眼睛有了可它们各说各话CLIP 说 0.9EXIF 说全中VLM 说字对不上防翻拍说像翻拍。怎么把四张嘴合成一个数这就要请出那个把它们捏在一起的裁判了。下一篇进最关键的一章——融合引擎四只眼睛的报告怎么合成一个总评分。