恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
CLIP与DINO级联融合:不确定性感知的深度伪造图像检测泛化新方案
首页
资讯中心
/
CLIP与DINO级联融合:不确定性感知的深度伪造图像检测泛化新方案
CLIP与DINO级联融合:不确定性感知的深度伪造图像检测泛化新方案
发布时间:2026/10/15 14:06:13
做深度伪造图像检测的人应该都有过这种经历在FaceForensics这种公开基准上怎么调都能刷出漂亮AUC可一旦把模型扔到新采集的真实场景数据上指标直接掉十几个点。我这次做的项目就是冲着这个“泛化之痛”去的核心思路是把CLIP和DINO这两类特征差异极大的预训练模型“驾驭”起来用一个不确定性感知的级联融合网络让模型既能从语义层面判断“这张脸是否合理”又能从局部伪影层面定位“哪里被动过手脚”。这套方案解决的核心问题是深度伪造图像检测在跨数据集、跨生成方法场景下的可泛化性而不是继续在单一基准上刷分。无论你是刚入行想做伪造检测还是已经在生产环境里被贼准率折腾过这篇文章都值得看完里面有不少从数据划分到CLIP/DINO微调的实操细节踩坑经验尤其关键。1. 伪造检测的“泛化之痛”为什么实验室里很强出门就翻车1.1 模型学会的是伪影还是数据集的“指纹”我对这个问题的体感太深了。最初我用一个ResNet50做二分类训练时加了一堆数据增强测试集上AUC 0.99看起来完美。结果拿到一个手机拍摄的视频里面脸被换过模型预测成真实AUC直接降到0.72。后来我把bad case拿出来一张张看发现模型真正依赖的并不是“它见过换脸痕迹”而是记住了一条数据集的“指纹”路径FF里不少人脸来自YouTube公开视频有特定的分辨率、压缩参数、色彩矩阵模型其实是在认录像设备和工作流。这就是典型的“数据集的应试能力”。深度伪造检测跟一般图像分类不太一样伪造区域往往只占人脸的一小部分而且不同生成方法留下的伪影差异巨大。旧的检测方法比如基于频率域的、基于噪声模式的在单一生成器上效果不错但遇到新生成器就退化。原因很简单它们把“伪影”和“数据集特定噪声”混为一谈。更麻烦的是当前深度伪造生成模型越来越关注“生成痕迹最小化”伪影越来越淡靠low-level特征更难分辨。所以我把搜索范围收窄到一个问题能不能找到一种特征表示它既不受数据集特定噪声干扰又能敏感捕捉伪造痕迹答案指向了预训练特征。CLIP这类模型在海量图文对上对齐了文本和图像语义DINO这类自监督ViT则在无标签数据上学会了object-part级别的表示。它们两个恰好覆盖了“全局语义”和“局部结构”两个层面这也是我想在同一个网络里驾驭它们的原因。1.2 CLIP 和 DINO 分别能补上哪块短板不少人对CLIP和DINO的认识停留在“都是ViT提取特征”实际用起来会发现是完全不同脾气的两只模型。CLIP的图像编码器经过对比学习后特征空间里“一张真实人脸照片”和“一张AI生成人脸图”在语义概念上是可分的。它知道什么是人脸知道一张图像整体是否符合自然规律比如面部五官的位置、光照方向、皮肤质感是不是“合理”。但CLIP对局部伪造的响应非常钝因为它的训练目标是global alignment一个面积占比很小的伪造区域在整图特征里被严重稀释用CLIP做朴素分类经常把换了全脸但眼睛鼻子嘴都对齐得很好的人判断成真实。DINO则完全相反。它通过自蒸馏和多尺度裁剪训练每个patch token都学会了比较精细的part-level语义哪怕没有人标注特征图也能自发出现头部、眼睛、嘴巴等区域注意力。伪造区域因为它的局部纹理、边缘过渡和真实区域不一致在patch token级别的特征上会出现明显的响应差异。用DINO特征做伪影定位效果比我以前用的频率域热图好得多尤其是遇到超分、混合、局部润饰这一类局部修改。这给我一个很自然的架构直觉先让CLIP做“粗筛”如果它基于全局语义就能给极高置信度那就直接输出如果它没有把握说明图像可能存在局部异常或分布外输入再让DINO上场做“精查”。这就构成了级联的动机。但问题是CLIP什么时候该“承认自己不会”需要一个可计算的不确定性估计。这就是后面要说的不确定性感知门控也是整个项目里最值得细讲的部分。2. 不确定性感知级联融合架构是这样搭起来的2.1 第一级 CLIP 分支语义真实性先做粗判CLIP分支我用的不是原封不动的zero-shot推理而是把预训练CLIP当作骨干加一个轻量分类头。输入一张 RGB 人脸图像图像编码器得到 [CLS] token 表示 (f_{CLIP})然后经过一个两层MLP输出对数概率 (p_C)。为了稳定训练我没把整个CLIP全量微调而是冻结大部分层只微调最后两个Transformer Block和分类头后面会详细说这么做的原因。CLIP分支的输入分辨率值得注意。官方预训练多是224×224但伪造痕迹常常集中在局部高频区域。我实验里把输入提高到336×336同时做了一个非常关键的操作由于直接改变分辨率会让位置编码失配需要把预训练位置编码用插值方式重映射而不是直接用随机初始化位置编码。一个小技巧是保留patch size 14不变通过双线性插值把14×14的位置embedding变成24×24实测不会破坏CLIP语义还能让分类头对局部痕迹更敏感。CLIP分支会输出两个关键量预测概率 (p_C)以及基于logits的熵 (H_C)。熵的定义我用标准形式对二分类概率 (p)(H -(p \log p (1-p) \log(1-p)))。熵高说明CLIP距离“确定”还很远。但为了做门控只有熵还不够我还会做一次温度缩放校准防止CLIP在不该自信的地方过于自信这个思想类似可靠性校准后面训练部分一起展开。2.2 第二级 DINO 分支局部伪影再做精查DINO分支我选的是ViT-S/8结构8×8的patch比16×16更细对于小伪影更友好。输入同样是人脸图像但DINO分支不把CLS token直接拿去分类而是利用所有patch token。具体来说backbone输出196个或更高分辨率的patch token序列每个token都带有局部信息理论上可以看成是一张“密集特征图”。为了把patch token变成像素级的伪影定位结果我把最后一层patch token做LayerNorm和L2归一化然后通过一个小卷积头把它们映射成单通道的伪影热度图。训练时这个热度图的监督信号不需要人工标注伪造区域而是使用弱监督用整图真假标签作为约束让热度图在高响应区域强化分类判别。这种策略在实际里管用DINO自监督特征本身就让伪造区域与真实区域的patch分布产生了可分离性弱监督约束起到的是“收敛保护”作用。第二级分支同样会输出两个量基于热度图平均得到局部判别概率 (p_D)以及热度图空间方差/多次前向Dropout得到的认知不确定性 (H_D)。空间方差的意义在于如果热度图到处都在乱响说明DINO对这张图的局部判断很不一致这时候它的结论也值得怀疑。我会把这个空间方差作为DINO分支“不知道该信哪块区域”的信号。2.3 门控机制什么样的样本才需要进入第二级级联网络最关键的一点不是两个分支各自多强而是门控逻辑能否把资源花在最该花的地方。我的门控设计不复杂先用CLIP分支的输出做判断。如果 (p_C) 远离边界并且校准后的熵 (H_C) 低于阈值 (\tau)那么这个样本在第一级就能被高置信度分类直接用CLIP结果作为输出不进入DINO分支。如果 (p_C) 落在边界区或者熵高于阈值就进入第二级精查。最终融合我不采用简单的分数平均而是做“不确定性反向加权”[ w_C \frac{\exp(-\alpha \cdot H_C)}{\exp(-\alpha \cdot H_C) \exp(-\beta \cdot H_D)} ] [ p_{final} w_C \cdot p_C (1-w_C) \cdot p_D ](\alpha) 和 (\beta) 通过验证集校准。思路很直观谁的不确定性低谁说话权重更大。如果两个不确定性都高则最终输出还附带一个“低置信”标记在应用中宁可拒绝预测也不给一个错误的高置信结果。这个设计对深度伪造检测实际落地特别关键因为测试样本里大量是你没见过的生成方式模型在“完全不懂”时硬猜比诚实拒绝危害更大。在推理效率上级联的收益是明显的。我们自建的混合评估集里约有六成样本属于“CLIP一眼就能判断清楚”的类型剩下四成才需要DINO精查。这意味着平均推理时间比两级并联下降了35%-40%同时还保留了更复杂的局部分析能力。代价是门控阈值一定要调好阈值太松会让明显伪造漏过去太紧则所有样本都进入DINO级联退化成并联。3. 训练和损失函数两个分支不是投票而是互相兜底3.1 不确定性的两张面孔认知不确定性和偶然不确定性训练这套网络时我最早踩的一个坑是把“不确定性”当成一个黑盒的单一数字来训。实际上要区分两种来源。第一种是认知不确定性来自模型参数的不可靠典型表现是把样本放到一个分布外位置时模型因为没学过所以前后判断来回摆。这种可以靠多次前向的Dropout、或者测试时增强来近似估算。第二种是偶然不确定性来自数据本身的噪声比如视频压缩让皮肤纹理模糊、光线让局部区域过曝这些东西对判断的干扰是随机的模型结构再强也无法完全消除。在训练损失里我把认知不确定性主要和DINO分支绑定因为它负责局部精查分布外的伪造类型更容易让它产生前后不一致的预测。CLIP分支我更关注校准后的熵这同时包含两种不确定性但主要由语义模糊性主导。损失函数里给每一个样本的贡献加一个权重权重和该样本在对应分支的不确定性负相关这样模型不会死磕那些信噪比极低的本征难例。这里还有个反直觉的点不确定性不是越低越好。一个完全破损的伪造视频生成时会留下大量不自然的痕迹这本身是强信号但也会造成更高熵。所以我会在验证集上专门画“风险-覆盖率曲线”观察拒绝掉最不确定样本后AUC提升到多少以此判断不确定性估计是不是真的合理而不是光看训练loss收敛。3.2 损失函数怎么配全局判别、局部分割、不确定性加权总损失函数我分三条腿。第一条腿负责CLIP分支的全局判别用Focal Loss因为深度伪造检测的类不平衡在难样本上特别明显Focal Loss可以降低易分样本的梯度贡献让模型更关注当年那些处于边界的硬样本。第二条腿负责DINO分支的局部伪影定位有两项一项是弱监督的Patch分类损失让patch token的特征在真假类别上可分另一项是区域一致性损失鼓励热度图在空间上是连通的而不是出现碎点噪声。第三条腿负责不确定性加权把上面两个分支的loss用各自的不确定度调制不确定性高的样本loss权重小一点防止模型被不可学的样本拖偏。一个常见的错误是让两个分支的loss简单相加不做任何协调。实测下来CLIP分支会较快收敛DINO分支因为patch级任务更复杂收敛慢如果直接相加模型会朝CLIP的方向塌缩级联几乎退化。我的做法是给DINO分支的loss更高的初始权重并用一个逐渐衰减的系数。前10个epoch让DINO充分学习局部表示后面再让CLIP主导语义判别最终两个分支互相支撑。训练流程上我采用三阶段。第一阶段独立预训练CLIP分支先让语义判别头稳定下来。第二阶段冻结CLIP分支训练DINO分支的patch分类和热度图头。第三阶段解冻关键层整个级联联合微调同时更新门控融合参数。这个三阶段设计很重要如果一开始就端到端联合训练DINO分支很容易被大模型CLIP的梯度淹没最后热度图什么都没学到。3.3 级联阈值校准别拿测试集调阈值门控阈值和融合权重是典型需要“事后校准”的参数。我看到的很多复现错误是直接在测试集上调这个阈值让结果好看。这在学术上叫测试集窥探在工业上则完全不可信因为真实场景里你永远没有已经标好的目标域数据。正确做法是从训练集中切出一小块动态验证集每次训练完在验证集上做网格搜索。具体校准我分三步。第一步固定CLIP和DINO分支在验证集上记录每个样本的 (p_C)、(H_C)、(p_D)、(H_D)。第二步对门控阈值在不同取值下计算风险-覆盖率曲线选一个“在覆盖率损失不超过10%的情况下选择性AUC最高”的阈值点。第三步在选定阈值后再对融合权重 (\alpha,\beta) 做小范围搜索。整个过程跟训练是分离的这样测试集结果才是可信的。注意永远不要在测试集上做任何阈值调整。哪怕只调一次得出的“泛化性能”都包含了对测试集的隐式拟合。跨数据集评估的价值就在这里你有两个测试域只允许在一个域上做校准另一个域完全不动最终指标才算数。4. 实战中的数据和微调细节CLIP怎么调DINO怎么用4.1 跨数据集评估的划分和数据增强训练时我会把数据集分成三个角色训练集、校准集、泛化测试集。训练集来自FaceForensics原始质量尽量不花时间刷FF高刷版本校准集从同一个域内切出测试集则来自Celeb-DF和DFDC等新域。这样安排后同一个模型既能看到同域内的验证表现也能看到跨域真实表现差异往往触目惊心。数据增强我做得非常重。常规随机翻转和裁切之外增加了三类JPEG压缩质量在8到30之间随机采样模拟网络传播中的二次压缩分辨率随机缩放从256到1024再到降回512模拟不同视频来源的清晰度差异再就是随机添加高斯模糊和多尺度噪点。这些增强看起来把训练样本搞得很脏但正是这个“脏”逼着CLIP分支不要把表层纹理当成唯一证据也让DINO分支的热度图始终保持对真伪区域的空间区分。我强烈建议把同样一组增强策略也应用在测试时做一个测试时增强融合至少做几次水平翻转和缩放后取平均logit。这能明显压低不确定性估计的抖动因为单张图不同视角下的判断越稳定说明模型越不是靠侥幸赢了。虽然这会增加点推理成本但在生产环境里换来的稳定性非常值。4.2 CLIP 微调不是所有层都值得动CLIP是预训练在亿级图文对上的它见多识广但深度伪造检测是一个相对垂直的任务。全量微调CLIP容易导致灾难性遗忘让它在语义常识上的优势逐渐流失。我试过把backbone全部解冻训练跨域AUC不但没涨反而比冻结骨干只微调头部更低。原因就是任务数据量不够大模型在伪造检测数据集上反复迭代时把通用语义结构覆盖掉了。我采用的方案是LoRA微调在CLIP的Transformer层旁路加低秩适配器只更新这些低秩矩阵其他参数全部冻结。LoRA的秩设为16只加到倒数第6层到最后一层。这样CLIP学会了更关注人脸局部伪造的语义特征同时不会丢掉“这是人脸的合理结构”这种常识。DINO分支我没有用LoRA而是只解冻最后两个Block和分类头因为DINO的自监督粒度本来就很适合局部特征动多了反而让patch token之间的语义上下文被破坏。CLIP的prompt也有讲究。以前很多人简单做成二分类“a photo of a face” vs “a photo of a fake face”。但深度伪造里的“fake”概念不是CLIP预训练时定义过的稳定概念不同标注者理解的fake可能完全不一样。我改用“a realistic photo of a human face”和“a manipulated photo of a human face”并把文本端的特征与图像端的[CLS] token做一次对比学习的辅助监督。这一步不是为了替代分类头而是给CLIP分支提供更稳的语义锚点。4.3 DINO 特征对齐与掩码归一化DINO分支里最容易出问题的是特征对齐。ViT-S/8在输入336×336时输出42×42个patch token而CLIP分支在336下是24×24个patch token直接拼接做融合会让噪声放大。我的做法是统一把两分支的输出都下采样到16×16的空间分辨率所有下游头都在这个16×16网格上做。这样热度图、空间方差、融合权重全部对齐调试的时候不会出现对不上号的错位。DINO的patch token内部维度较高我建议在下游头之前做一个带GroupNorm的1×1卷积先把高维降到一个统一维度比如128维再接分割头。同时非常推荐做一次“mask归一化”热度图先除以训练集上非人脸区域的响应均值突出人脸内部的可疑区域。因为深度伪造核心改动在人脸内部背景无关响应只会干扰定位。第4.4 容易翻车的三个细节第一个坑是训练/验证数据划分里的同源泄漏。FF里同一段原始视频会对应多个伪造版本如果你按视频帧随机划分训练和验证同视频的帧会同时出现在两边模型等于记住了同一个source的微观细节跨域结果虚高。我后来一律按视频ID分组划分。第二个坑是类别不平衡造成的阈值偏置。真实场景里伪造视频比例往往明显低于真实视频训练集里我用了加权采样平衡真假比例但在校准融合阈值时我用的是自然分布不是平衡分布。道理很简单部署后的先验概率才是真实世界的先验阈值必须按部署环境校准。第三个坑是DINO热度图变成“人像分割图”。由于DINO自监督特征天然对前景背景敏感如果不加约束热度图很容易学成“整张脸都热”因为真假patch分类时“人脸区域”本身就是强特征。我加了一个正则项让热度图尽量稀疏并且只在局部连续区域响应。成本是具体表现有点损失但换来了更清晰的可解释性定位伪造区域时肉眼能看明白。5. 实验评估怎么证明它真的更可泛化5.1 评估协议与指标选择深度伪造检测如果只看AUC太容易骗自己。我设计评估时同时看几组指标。第一组是分类性能AUC、AP、在固定FPR下的TPR。第二组是校准性能Expected Calibration ErrorECE和Brier Score。第三组是选择性预测能力在每个覆盖率下拒绝最不确定样本后选择性AUC上升的幅度。这三个组分别回答了“能不能分对”“分的概率准不准”“不确定的时候敢不敢拒绝”。跨数据集评估协议我按这样的顺序训练集用FF校准集用FF的独立视频组测试集一用Celeb-DF测试集二用DFDC的精选子集。训练时绝对不碰后两个。如果未来我还要加WildDeepfake那也一样只当作测试域。用这样的协议测下来单CLIP分支在跨域上AUC大约在0.82-0.85单DINO分支大约0.84左右级联融合能到0.89-0.91而且校准误差明显下降。这些数字不是去跟某一篇论文比高低而是想表达趋势它们的互补性真实存在。5.2 消融实验每一层都有用吗消融实验我做了四组对比只使用CLIP分支、只使用DINO分支、让两个分支简单平均融合、以及完整的不确定性加权级联融合。结果比较有意思简单平均融合在源域AUC略有提升但在跨域上只比单分支提高不到1个点因为它还是被两分支各自的高置信错误污染了。不确定性加权级联融合提升最大尤其是在DFDC这样跟FF差距明显的域上比简单平均高了3到4个点。如果我们只看效果确实不错但也能看出来DINO分支在高压缩比低质量图像上会因为局部纹理信息缺失而信心下降CLIP分支则在全局光照异常时容易误判。级联里的门控刚好让这些情况变成了低置信拒测而不是硬给一个错误标签。这也是我为什么坚持把不确定性评估和分类头放在一起训练因为光有分类能力没有自知之明模型是不可信的。5.3 不确定性的价值选择性预测与校准把不确定性估计用在部署环节价值最直观。我在测试域上按不确定性的熵值把所有样本排序然后从最高不确定性开始逐步丢弃。当丢弃10%的样本后跨域AUC平均能提升1.5到2.5个点丢弃25%后能提升4个点左右。这说明模型判断错的样本大部分并不是随机错而是不确定性本身已经捕捉到了它们的分布外属性。我还发现校准让不确定性在应用层有了意义。未做温度缩放前模型对一部分真实图给出0.95的伪置信但这些图恰好是对某类深度伪造方案的误判。温度缩放后置信度降到0.83熵也跟着升高触发了级联里的DINO精查最终输出被成功拉回正确侧。这类例子每天都能碰到比单纯AUC提升更像“可落地的进步”。最后我也想提一句别把这套网络当成万能药。它的优势在于让人脸伪造检测在面对“没见过的新伪造方法”时不是只会硬猜而是先分层判断、再诚实表达自己的不确定。在我接触的很多实际场景里这比多刷两个AUC点更重要。如果你也想在自己的检测框架里引入CLIP和DINO的组合建议从级联思路开始先跑通单分支再缓慢加入不确定性门控别急着做复杂的端到端网络那样出了问题不好定位。