首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
社交平台压缩视频中的深伪检测:从纹理到面部肌肉运动建模
📅 2026/10/22 8:58:00
✍️ 爱科研究院
👁 阅读 3,247
我手头有一段从社交平台上下载的视频画面里的人在说话嘴型和声音对得上表情也算自然。把它丢给一个在公开数据集上接近满分AUC 0.99 级别的深伪检测模型结果模型告诉我真实。但这视频其实是换脸伪造的。问题不在模型本身而在于这段视频已经经历了不止一轮有损压缩上传一次平台转码一次又被转发保存一遍。像素级的伪造痕迹早被压没了。社交网络场景下的深伪视频绝大多数是这种被压过数轮的状态这也是为什么很多检测方法一旦落地就失灵。我们课题组某高校在这方面的做法是绕开纹理改看面部肌肉运动——通过说话、微笑、挑眉时面部肌肉协同运动的自然规律来判定真伪。这套方法2023年发表在视频技术方向的期刊上核心思路和踩坑经验整理出来分享给同行。1. 转码链路才是深伪检测真正的战场压缩如何让纹理类模型集体失效1.1 一条视频在社交平台上到底经历了什么很多人做检测实验时只考虑原始视频和轻度压缩视频的差异但真实社交网络里的视频远没有这么干净。一条视频从拍摄端到最终播放端通常要经过好几道有损工序设备端编码手机内部的 H.264/H.265 编码、平台上传后的服务端转码为了适配不同分辨率与码率档位、CDN 分发时的再次封装、用户端播放器解码最后还可能被人录屏或二次转发再来一轮压缩。每一轮压缩都不是温和的。常见社交平台转码配置大致是分辨率从 1080p 降到 720p 或 480p视频码率压到 400~1500kbps 区间使用 4:2:0 色度抽样开启去块滤波。用 FFmpeg 的术语来说等价于 CRF 24~30 甚至更狠的码率约束。这还不是最糟的——如果一条视频被转发存储多次每次都会被重新编码一次细节信息逐级衰减。1.2 纹理类的伪造签名恰恰是压缩最先抹掉的东西早期深伪检测效果最好的信号基本都集中在像素级纹理异常上GAN 生成器常见的棋盘格伪影、重复上采样痕迹、频域上周期性峰值、换脸区域边缘的混叠过渡。这些痕迹在原始视频上确实明显但问题在于它们大多是高频信息而视频压缩的本质就是用 DCT 系数量化把高频细节丢掉。CRF 一旦拉高这些指纹被大幅削弱甚至彻底消失。更麻烦的是换脸边界区域的混叠在压缩模糊之后连人眼都很难分辨。我做过一个直观实验把同一段换脸视频分别保存为原始档、中度压缩档和重度压缩档肉眼观察重度压缩档的边界几乎找不到任何不自然的过渡带。纹理类检测模型在这个版本上直接失灵属于必然结果。1.3 与其说是检测失效不如说是域偏移没被解决从模型训练的视角看问题更精确的描述是训练集和测试集不在同一个压缩分布里。大多数公开换脸检测基准数据集都提供原始档和压缩档但很多模型只在原始档或轻度压缩档上训练测试时遇到重度压缩档AUC 明显下跌。在常见基准上不少模型的 AUC 能从 0.99 级别掉到 0.7~0.8甚至更差。这还只是单一压缩档位的偏移真实平台有无数种码率、分辨率、编码器组合域偏移只会更严重。更深层的问题是模型很容易把压缩特征当成伪造特征来学而不是真正学到内容是否真实。一旦平台换了编码器、改了封装格式模型表现就可能崩塌。所以我们要找的检测信号必须满足一个前提在压缩之后依然稳定存在。运动信息恰好符合这个要求——它空间尺度大、时间上连续、以低频能量为主正是压缩最后才会破坏的部分。2. 看纹理不如看肌肉面部肌肉运动成为检测信号的三个依据2.1 生物力学约束人脸肌肉不是各动各的真实人脸并不是一张贴图皮肤、肌肉和骨骼通过筋膜连成一张完整的弹性组织。笑的时候不只是嘴角上提脸颊会跟着鼓起眼轮匝肌区域会产生轻微收缩甚至下巴的线条也会变化说话的时候嘴唇启闭、下颌开合、脸颊和颈部的肌肉都在配合挑眉时额头、眼睑、甚至鼻根区域的皮肤都会联动。心理学领域很早就用 FACS 动作单元AUFacial Action Coding System来定量描述这些运动。比如 AU12 是口角上提微笑的核心动作AU6 是脸颊提升AU5 是上眼睑提升。一个自然的微笑通常是 AU6 和 AU12 在时间上几乎同步出现惊讶表情则是 AU1、AU2、AU5 的协同组合。这些协同关系是生理结构的直接结果长期稳定而且人几乎无法刻意控制到分区域精确配合的程度——这正是检测伪造可以利用的锚点。2.2 伪造管线在肌肉层面的系统性缺陷当前主流的换脸和表情驱动方法在肌肉运动这个层面普遍存在机制性缺陷。第一类换脸方法本质上是把一个人的身份特征替换进目标视频面部区域由生成器重建。它的运动驱动源还是原视频目标人的低维表情参数生成器只负责重新绘制纹理并不理解肌肉如何收缩。结果就是嘴在动但脸颊和眼周的联动跟不上表情峰值时刻不同区域的动作出现几帧的相位错位。第二类是发表情驱动的重演方法通常用稀疏关键点或混合变形系数来驱动目标人脸。这类方法的控制信号是低维的几何位置并不是肌肉收缩强度所以做出来的表情往往形似而神不足嘴角上提的方向对但颧骨区域的肌肉鼓起幅度不够或者眼周区域完全不参与。人脸在宏观上看是一个自然的笑容但在运动场上看是几块互不相关的区域各自运动。2.3 压缩对运动信号相对友好为什么运动信号能在压缩后活下来本质原因是频段差异。视频压缩的量化过程主要削掉高频能量而肌肉运动表现在光流和关键点轨迹上是空间上连续、时间上平滑、位移幅度相对较大的低频信号。一段视频被压得很糊像素级的笔触痕迹消失了但说话的节奏笑的时候嘴角上提和脸颊鼓起的先后关系这些宏观运动模式还在。用一个类比来说一张照片被反复涂抹之后证明它被编辑过的笔触细节可能完全消失但一段体操视频即便被压糊动作的节奏、幅度和协调性依然能看出来。伪造视频里的体操动作肌肉协同运动本身就是不协调的压缩会让纹理证据丢失但不会把不协调的运动压成协调的。所以我们决定把检测信号从空间纹理迁移到时间运动上。3. 方法主干一条可复现的运动信号检测流水线3.1 人脸检测、跟踪与对齐为什么不能逐帧独立处理整个方法的第一步是拿到稳定的人脸区域。很多现成做法是逐帧做人脸检测但这在运动建模场景下有个隐藏问题单帧检测结果存在抖动人脸框的位置和大小每一帧都可能小幅变化这种抖动会被后续的运动特征放大变成虚假的运动信号。我们的做法是先做检测再用跟踪的方式把时间邻域内的人脸框平滑起来确保 ROI 是时间连续且稳定的。对齐也是关键。输入模型的不是原始视频帧而是经过仿射变换对齐到标准模板比如按双眼位置固定、统一缩放到 256×256的人脸裁剪序列。对齐的意义在于把头部姿态和相机运动的成分尽量去除让模型把注意力集中在面部肌肉自身的运动上而不是头部晃动带来的大位移。另外要设置一个质量门控如果一条视频里存在大量检测置信度很低的帧我们选择直接丢弃这一帧或根据前后帧进行插值而不是强行送入网络制造噪声。3.2 运动表征的三种取法光流、关键点轨迹、AU强度序列运动信号的具体表示方式我们对比过三条路线。第一种是稠密光流即用深度光流估计模型计算相邻帧之间的像素级位移场并以人脸 ROI 做掩码得到人脸区域运动场。这种表征信息最丰富能捕捉皮肤表面细微的形变但计算量大而且在小尺寸、低码率的视频上光流估计本身容易产生噪声。第二种是稀疏关键点轨迹。用 68 点或 106 点的人脸关键点模型提取每帧的关键点位置然后构成轨迹序列。关键点位置本身就是稀疏的但人脸运动的核心信息嘴、眼、眉、下颌、脸颊区域往往都集中在这些点上。它计算轻、对压缩的鲁棒性也比光流好是我们最终选择的主干表征。第三种是 AU 强度序列即用预训练的 AU 检测模型把每帧转换成一个动作单元强度向量然后在时间轴上建模。这种方式语义清楚但受限于 AU 检测器在低分辨率下的精度误差会传导到后续分类。我们最终的方案是以关键点轨迹为主干、以人脸区域光流为辅助分支两者在特征层融合AU 序列作为消融对照和辅助监督形成了不错的互补效果。3.3 时序建模让模型学会肌肉协同拿到运动表征之后核心问题是怎么让模型学会肌肉协同这种时序规律我们采用的方法是 Transformer 序列建模。具体来说把每一个关键点在每一帧的位置看作一个 token一个 T 帧片段会形成一个长度为 T×N 的 token 序列。每个 token 的输入特征是 (x, y, 置信度)再叠加两类位置编码一类表示时间位置这是第几帧一类表示空间位置这是第几个关键点属于哪个面部区域。自注意力机制可以同时在时间和空间两个维度上建模相关性。这个设计有一个直接的合理性伪造视频中各动各的的肌肉区域在自注意力特征空间里会把原本应该在的协同关系破坏掉真实视频里口角、脸颊、眼周区域在时间和空间上都高度关联注意力权重会呈现明显的结构化模式。Transformer 学到的是这种模式差异而不是某个固定的伪影特征因此跨压缩档位的泛化性明显好于纯 CNN 纹理分类器。另一种可选项是把多帧光流堆叠成张量送入 3D CNN我们测试过效果接近但参数和计算量都更大工程上不划算。3.4 分类头与视频级判定时序编码器输出的特征向量接一个简单的 MLP 分类头做二分类。我们还在时序维度上加了注意力池化让模型自动聚焦在最有判别力的小片段上——因为一段视频里可能只有几帧的表情峰值时刻最能暴露肌肉运动异常。训练目标以二分类交叉熵为主另外加了一个帧序预测的辅助任务让模型在预测真伪的同时也必须理解运动发生的顺序这对提升时序建模的稳定性和小样本泛化有明显帮助。视频级判定不是直接对全片做一次预测而是采用滑窗抽取若干个短片段例如每个片段 16~32 帧对每个片段输出一个分数再做平均或按置信度加权的聚合。这样既能适配任意长度的视频也天然具备处理部分遮挡、局部模糊的容错能力。4. 让模型学会和压缩共存增广、一致性约束与两阶段训练4.1 用 FFmpeg 还原社交平台的压缩行为要让模型在真实社交网络场景下可用仅靠公开数据集原有的压缩档位是不够的。我们做的第一件事是把压缩模拟器直接写进训练流程。这里的关键不是做单一固定参数压缩而是让压缩参数随机化覆盖足够宽的分布。# 模拟一轮平台转码随机 CRF、随机分辨率、随机帧率 ffmpeg -i input.mp4 \ -vf scaleiw*0.5:ih*0.5,fps25 \ -c:v libx264 -crf 27 -preset medium \ -pix_fmt yuv420p -an output.mp4实际训练时我们用脚本控制参数CRF 在 22~30 之间随机缩放系数在 0.5~1.0 之间随机帧率从 15/24/25/30 里随机选。更重要的是多轮压缩——同一视频连续压缩两到三次中间穿插一次分辨率变化或重新封装模拟真实社交平台里的多次转发场景。这里有个前提真实视频和伪造视频都要做同样的压缩增广不能只压伪造视频否则模型会学到模糊伪造这种错误捷径。4.2 原始流与压缩流的特征一致性约束数据增广是在输入侧让模型见过更多压缩形态但还有一个更直接的手段对同一个视频片段同时准备原始版本和重度压缩版本让模型从两个版本中提取到的运动特征尽量一致。这就是特征一致性约束。实现上我们用的是对比式损失把原始流和压缩流分别送入共享权重的运动编码器计算两个特征之间的 L2 距离作为约束项。为了保证编码器不偷懒比如把所有输入都映射到同一个点我们让其中一条支路做梯度停止stop-gradient相当于用一条支路的特征作为压缩不变目标另一条支路去逼近它。这个操作看起来简单但消融实验里它对重度压缩档位下的 AUC 提升非常明显我们理解为它强迫模型主动丢弃容易被压缩破坏的纹理信息只保留稳定的运动语义。4.3 两阶段训练先学真实肌肉运动再学检测伪造深伪检测面对的一个长期问题是伪造样本量有限尤其是特定压缩域下的伪造样本更少。我们的应对是把训练拆成两阶段。第一阶段是自监督预训练从互联网上收集大量真实说话人视频只要求是真实人脸不需要任何标注在关键点轨迹上做遮蔽重建任务——随机遮蔽一部分关键点的位置让模型预测它们或者做未来帧运动预测让模型根据过去若干帧的运动推断下一帧的运动趋势。这个阶段让 Transformer 学到了真实人脸肌肉运动应该是怎样的这个先验。第二阶段是在预训练模型基础上用真实/伪造标签做监督微调。好处显而易见模型不需要从零开始从有限样本里硬学运动规律而是基于一个已经内化了肌肉协同先验的表示只需要学会区分正常协同和异常协同大大降低了数据需求。我们实验里即便伪造训练数据只有几千条两阶段训练的效果也明显好于从随机初始化直接训练。4.4 训练细节片段长度、帧率归一化与数据划分还有一个容易被忽略的工程细节是帧率问题。社交平台上的视频帧率五花八门运动的速度表达会随帧率变化25fps 下相邻帧的关键点位移显然比 15fps 下的位移小。如果不对帧率做归一化模型会把位移大小当成判别信号而不同帧率带来的位移变化会产生严重干扰。我们的做法是统一把所有输入片段重采样到 25fps同时在特征层面让时间位置编码携带真实的帧时间间隔信息让模型可以区分配置差异而不是被其误导。训练时采样固定长度片段如 32 帧同一视频的多个片段不能一个进训练集一个进验证集必须按视频为单位整体划分避免信息泄漏。这一点在老数据集上尤其致命很多公开基准如果不按身份划分模型会学到见过这个人而把 AUC 刷得虚高换到新身份的视频立刻崩掉。5. 评测设计、消融实验和几个容易翻车的细节5.1 评测协议光看同域 AUC没有意义经历过几次实验高分、实测翻车之后我们对评测协议的认知发生了根本变化。社交网络场景至少要评测三个层次的协议缺一不可。评测协议训练数据测试数据考察目的同域同压缩档原始档 / 轻度压缩同一数据集的同档位基础能力防止模型完全学废同域跨压缩档原始档 / 轻度压缩同一数据集的重度压缩压缩鲁棒性社交场景核心指标跨数据集 / 跨平台数据集A含压缩增广数据集B 真实平台采集视频泛化能力最终落地参考我们后来把所有实验都强制加了一道压缩档不匹配的测试训练只用原始档和轻度压缩档测试必须包含重度压缩档。每次模型改动先看这一列的对比数字很多看起来不错的改进就是这样被筛掉的。实践证明这比在训练集同分布测试上刷高 AUC 有用得多。5.2 指标选择AUC 之外你还需要什么学术报告通常给 AUC 和 EER这两个指标在类别均衡的测试集上没问题但真实社交平台场景下真实视频远远多于伪造视频AUC 高不代表误报率可接受。部署视角下我们额外关注两个指标高召回点的误报率例如 TPR 95% 时的 FPR也就是把 95% 的伪造视频抓出来时真实视频被误杀的比例以及每万条真实视频的误报条数。后者的变化经常能暴露模型是否把某类压缩特征当成了伪造特征。5.3 消融实验数值背后的趋势比绝对值重要消融实验设计的原则是每一刀都要切在核心假设上。我们内部用一组示意对照来说明趋势数值基于实践观测不同实现细节会有差异重点看量级和相对变化方案原始档 AUC重度压缩档 AUC跨数据集表现纹理分类基线0.9820.713明显下降纹理基线 压缩增广0.9660.824中运动分支关键点轨迹0.9740.892较稳运动分支 一致性约束0.9710.937较稳运动分支 一致性约束 自监督预训练0.9780.954稳定这组对照说明三件事第一压缩增广能救纹理模型但救不完全因为模型的归纳偏置仍然偏高频第二运动分支天然更抗压缩即使不做一致性约束重度压缩档表现也显著好于纹理基线第三一致性约束和自监督预训练带来的提升在跨数据集上最明显说明它们提升的是真正的语义理解而不是对特定数据分布的记忆。5.4 容易翻车的细节帧率、对齐失败和过度增广实际落地过程中有几个反复踩过的坑。第一个是前面提到的帧率归一化不处理就等着跨平台测试掉点。第二个是人脸对齐失败重度压缩后的低分辨率视频里人脸检测和关键点定位的置信度都会下降尤其是侧脸、遮挡、戴眼镜的样本。我们的处理是对检测置信度低的帧采用前后帧插值并且限定一个最小人脸尺寸太小的脸不做精细运动分析直接返回无法判断而不是给一个错误的高置信度预测。第三个坑是增广过头的反向效果。我们曾经把 CRF 拉高到 33 以上结果是视频糊成一团模型学到了模糊区域真实视频这种捷径——因为伪造视频的增广版本已经被压得分不清纹理而真实视频的原始纹理相对清晰。后来我们把真实视频和伪造视频完全使用同一套增广管线并对增广强度做上限控制才避免了这个偏差。6. 从论文到落地推理开销、误报边界和后续思考6.1 推理效率关键点轨迹为主、光流为辅的两级方案论文可以不计较推理速度但部署不可能不考虑。稠密光流分支虽然能提供丰富信息但推理开销很高。我们在部署版本里把方案调整为两级先用关键点轨迹 轻量时序模型做第一轮判断速度可以做到接近实时只对分数落在中置信区间比如 0.3~0.7的片段才触发包含光流辅助分支的完整模型做二次确认。这个设计在实际流量下可以省掉八成以上的重计算同时不牺牲最高难度的样本判准。模型量化和 TensorRT 加速后单条视频的处理速度完全能满足平台侧的异步检测管线需要。6.2 长视频和短视频的处理差异社交平台上的视频长度差异很大几秒的短视频和几十分钟的直播录屏都会出现。我们的滑窗策略要求每个片段至少 16 帧短于一个窗口的视频做重复填充或直接跳过运动分析。长视频则用滑动步长 16 帧的窗口扫一遍把所有片段分数做时间加权聚合——时间靠后的片段权重略高因为伪造视频越长越容易出现肌肉运动崩坏的片段而真实视频通常全程稳定。聚合后的分数再和有效人脸帧比例做一次校正如果视频里人脸出现的时间太短模型会给出 low-confidence 标记提示人工复审。6.3 真实平台内容带来的误报压力真实社交平台的视频内容远比数据集复杂。美颜滤镜会改变面部结构比例AR 贴纸会遮挡关键点夸张表情、镜头畸变、逆光拍摄都会干扰肌肉运动建模。我们最初在平台采集数据上做测试时误报率不低后来做了一件关键的事持续采集平台真实用户的公开视频作为负样本池连同轻微增广版本一起加入训练。同时对输出分数做阈值校准不是简单取 0.5而是在一个模拟平台分布的小型验证集上调优优先满足误报率低于万分之一的业务要求。这一步在论文里几乎不会被提及但在真实系统里比模型结构还重要。6.4 方法的边界与进化方向也必须承认单纯的面部肌肉运动信号并不是万能的。当视频分辨率低到关键点检测不可靠、人脸大部分时间被遮挡、或者视频本身就是静态大头贴时运动信号会流失殆尽。另外一个更难处理的场景是整脸生成类伪造——如果整个脸都是生成器直接合成的肌肉运动完全由生成模型模拟运动模式的异常可能不明显。我们的经验是这类问题单靠运动分支解决不了需要与其他信号协同音频与嘴唇同步性、身份一致性、头部姿态等。后续团队已经在做多模态融合和流式增量检测把运动分支作为其中的一个骨干模块而不是唯一的判据。最后分享一点个人体会。在这个项目上最大的教训是不要拿着干净数据集上刷出来的高 AUC 去推断真实社交网络的鲁棒性。报告里的数字只有在评测协议足够苛刻时才有意义而苛刻的标准就是压缩档位不匹配和跨数据集泛化这两项。另一个实用技巧是把 FFmpeg 压缩参数随机化的脚本写进训练流程后各类平台的实测误报率比固定 CRF 压缩低不少。如果你也在做类似方向我建议把压缩模拟器当成头等大事来搞——它比模型结构的收益来得更快、更稳。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/22 8:58:00
前端视觉感知增强:端侧实时识别的工程落地方程式
2026/10/22 8:52:59
SpringBoot无人机销售系统毕业设计:从分析到答辩全攻略
2026/10/22 8:52:59
订餐系统源码实战:Spring Boot+Vue3+小程序全栈拆解指南
2026/10/22 13:52:05
ARM64+openEuler+iSula构建Kubernetes集群的实践指南
2026/10/22 13:52:05
Go服务容器化实战:多阶段构建与Docker Compose编排指南
2026/10/22 13:52:05
OJ题库刷题避坑指南:从输入输出到判题机制全解析
2026/10/22 13:52:05
Unity贝塞尔曲线虚线连线特效:LineRenderer与UV流动动画实现
2026/10/22 13:52:05
单机斗地主Android源码全解析:从Gradle导入、牌型算法到AI二次开发
2026/10/22 13:47:02
考勤登记管理系统三件套:原型、数据库、源码的完整落地路径
2026/10/22 0:01:24
电商智能运营体系从0到1:架构设计、落地步骤与避坑指南
2026/10/22 0:01:24
压缩空气储能与热网热惯性联合优化调度:热电联产系统建模与求解
2026/10/22 0:01:24
若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定
2026/10/21 19:05:16
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/21 14:47:26
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/21 19:05:04
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/22 5:06:15
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/22 2:07:18
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/21 19:01:08
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)