资讯动态

文本生成视频评测指标:FVD、VBench与组合评测实战

发布时间:2026/9/30 9:26:10 来源:尧图企业网站定制
上周帮朋友的团队做了一次文本生成视频的横评八条提示词、五个模型、四十段视频铺在同一条时间轴上逐帧过。FVD 排出来的名次和我们几个人的肉眼判断差了两个位次排第一的那个模型从第五秒开始人物手指就在融化背景里的窗户还在缓慢飘移。那一刻我特别想把只看一个数字就下结论的评测表撕掉重写。先把语境对齐一下这里说的指标是文本生成视频的模型评测指标跟行情软件里那套公式源码没有半点关系虽然搜“指标”两个字的时候它们总是混在同一个结果页里。文本生成视频的评测说到底要回答三件事——画面像不像真的、内容和提示词对不对得上、动起来有没有崩。这三件事没有任何一个单独的数字能同时覆盖所以真正可用的做法是搭一套组合指标并且清楚地知道每个数字的失效边界在哪里。这篇文章面向的是需要自己跑评测的人要选型的算法工程师、要给模型迭代做回归验证的团队、以及被论文里那张对比表搞得一头雾水的研究生。我会从三类指标的底层逻辑讲起把 FVD 和 VBench 这类常用工具的坑逐个拆开再给出一套我自己在用的流水线骨架和排查顺序。不追求把公式推导到严谨但保证你看完之后能自己搭起来、能判断别人报的数可不可信。1. 三类指标各管一段混着看必然出事评测指标的分类方式有很多种但按“它在度量什么”来分是最实用的。文本生成视频这个任务同时背负着图像生成和视频生成两重属性图像那边只需要度量真实感和文本对齐视频这边多出来一整个维度——时间。所以三类指标的划分本质上就是按这三重属性来切的。1.1 分布距离类FVD、FID、KVD 到底在度量什么FVD 的全称是 Fréchet Video Decoder Distance它把一批生成视频和一批真实视频分别送进一个固定的三维卷积网络取网络输出的特征向量然后假设这两组特征各自服从一个多元高斯分布计算两个高斯分布之间的 Fréchet 距离。公式形式跟 FID 完全一样FVD ||μ_gen - μ_real||² Tr(Σ_gen Σ_real - 2 · (Σ_gen · Σ_real)^(1/2))前半项是均值之间的距离衡量“特征中心偏了多少”后半项是协方差之间的距离衡量“特征的离散结构差多少”。理解这一点特别重要FVD 是一个集合级别的统计量它不对应任何一段具体视频。你把一批视频里的某一段换成一段纯噪声只要整体分布没被拉偏FVD 可能只动一点点。这就是为什么 FVD 好的模型依然可能产出肉眼可见的崩坏片段。FID 是把同样的逻辑用在单帧图像上用 Inception 网络提特征逐帧算完再平均或者把所有帧的特征堆在一起算一次。KVD 是另一条路线用关键点检测器提特征对运动结构的刻画比 I3D 更直接但采用率远不如 FVD。这三者的共同点是都是距离越低越好0 表示两组特征分布完全重合负值只可能来自数值误差。1.2 语义对齐类CLIPScore 一族的打分逻辑CLIPScore 的原始定义是给图像描述任务设计的把图像和文本分别送进 CLIP 的两个编码器拿到同一嵌入空间里的两个向量算余弦相似度再乘 100 并截断到非负。用在视频上最常见的做法是逐帧算、再取平均。这个平均操作隐藏了一个很大的问题它对时间维度上的语义演进完全没有感知。“一只猫在跑”平均下来和“一只猫静止不动”可能分数一样因为每一帧都包含猫。更麻烦的是 CLIP 的文本编码器有 77 个 token 的硬截断超过部分直接丢掉。我见过有人写了一段两百词的复杂提示词前 77 个 token 描述的都是场景氛围真正的核心动作全在被截断的部分结果算出来的对齐分数还挺高——模型只是画出了那堆氛围词提到的东西。CLIPScore 真正擅长的是物体类别和粗略属性的匹配对计数、空间关系、动作方向、镜头运动几乎无感。“两个人在打球”和“一个人”在 CLIPScore 上的差距远小于你的直觉。所以看到对齐分数很高但视频明显不对的情况第一反应应该是换一个能看时序的对齐模型而不是怀疑代码写错了。1.3 时序一致性类光流、DINO、插帧三条技术路线第三类指标专门对付“动起来崩不崩”目前主流有三条技术路线思路完全不同。光流路线用 RAFT 之类的网络估计相邻帧之间的运动场然后把前一帧按运动场 warp 到下一帧的位置计算 warp 结果和真实下一帧的像素差。这个差叫 photometric warping error差越大说明运动越不连续。它的问题在于遮挡区域和出画区域天然会产生巨大误差而这些区域人眼根本不会觉得是瑕疵所以直接算平均会被这些无效区域带偏必须配合前后向一致性检查做掩膜。特征一致性路线用 DINO 或 CLIP 这类视觉编码器逐帧提特征算相邻帧或者首帧与其余帧之间的余弦相似度取平均。这个思路对光照渐变、相机缓慢平移的容忍度高得多因为它看的是语义特征而不是像素。VBench 里的主体一致性和背景一致性用的就是这条路线主体用 DINO背景用 CLIP。插帧路线用 AMT 这类帧插值网络在真实相邻帧之间合成一帧再和原本“隔一帧”的那帧对比。如果运动是连续平滑的插出来的帧应该和真实帧很接近。这条路线对运动平滑度最敏感VBench 的运动平滑度维度就基于这个思路。1.4 为什么我一直坚持三类指标同时报只报一类指标等于只做了一个方向的体检。我用一张表来说明它们的覆盖范围差异这也是我在每个项目里都会放进评测文档的第一张表指标类别代表指标能覆盖的问题明确覆盖不到的常见误用分布距离FVD、FID整体真实感、纹理质量具体样本崩坏、文本对齐拿单个数字给模型排名语义对齐CLIPScore、ViCLIP物体类别、粗略属性计数、空间关系、动作方向用长提示词却不检查 token 截断时序一致性光流误差、DINO 相似度、插帧误差闪烁、抖动、运动不连续真实感、语义正确性不区分动态与静态片段直接平均主观质量美学分、成像质量分单帧美感、清晰度时间维度的一切忽略分辨率下采样带来的失真多样性生成样本间 LPIPS模式坍缩单样本质量完全不报导致 FVD 被“刷”最后一行值得单独说。FVD 是一个“离真实分布有多近”的距离一个把所有提示词都生成同一段风景的模型只要那段风景足够真实FVD 可以很漂亮。报多样性指标是防住这种退化的唯一手段做法很简单随机抽若干对来自不同提示词的生成视频算它们之间的平均 LPIPS 或 DINO 特征距离值过低就是坍缩的信号。2. FVD 的五个坑从计算到读数FVD 是出现频率最高的那个数字也是被误用最多的那个。我在复现别人结果的过程中踩过的坑基本都集中在这个指标上。2.1 特征提取器和采样约定必须写进报告FVD 强依赖提取特征的那个网络。最经典的选择是 I3D在 Kinetics-400 上预训练也有人用 R(21)D、SlowFast、VideoMAE。换一个骨干网络FVD 的绝对值可能相差好几倍但排序未必变。这意味着“我的 FVD 是 320”这句话本身没有任何信息量除非说清楚是哪个骨干、哪一层的输出、多少帧、什么分辨率。采样约定同样要命。I3D 的输入是固定 16 帧这 16 帧怎么取有两种做法均匀采样在整段视频上等间隔取 16 帧和连续采样取一段连续的 16 帧。这两种做法算出来的特征分布完全不同。更隐蔽的是帧率同样取 16 帧从 24fps 的视频里取覆盖 0.67 秒从 8fps 的视频里取覆盖 2 秒运动幅度差异巨大特征分布自然不同。我现在的做法是在评测报告的最前面写死一段“预处理契约”解码方式、帧率、采样策略、分辨率、归一化参数、骨干网络及权重来源、批大小。缺任何一项这个数字就不进入横向对比表。2.2 样本量不够FVD 就是随机数Fréchet 距离里的协方差项需要估计一个 D×D 的协方差矩阵D 通常是 400 到 2048 维。样本量少的时候这个矩阵严重病态算出来的距离方差极大。经验上2048 维特征想稳定估计协方差样本量至少要到四位数即使降到 400 维样本量不到 500 的时候FVD 的随机波动也能吞掉模型之间的真实差异。我的标准做法是固定同一条真实参考集生成侧至少 2000 段然后用 bootstrap 重采样给出 95% 置信区间。如果两个模型的置信区间大面积重叠就不要在报告里写“A 优于 B”写“在本次评测的样本量下两者不可区分”才诚实。2.3 分辨率、帧率、色彩空间跨论文数字不可比的真正原因很多人拿自己算的 FVD 和论文里的数字直接比这是最常见的翻车点。除了前面说的骨干和采样还有三个物理层面的差异分辨率把 720p 下采样到 224×224 再做中心裁剪会丢掉大量高频细节。一个在高分辨率下有明显纹理瑕疵的模型经过下采样后瑕疵被抹平FVD 反而更好看。帧率原始生成结果如果是 24fps而参考集是 8fps两者运动统计完全不在一个尺度上。色彩空间和数值范围BGR 还是 RGB、0-255 还是 0-1、有没有做 ImageNet 归一化任何一个不一致都会让特征分布整体偏移。我吃过一次这个亏同一批视频预处理写成 BGR 之后 FVD 从 415 涨到 1220涨了三倍。后来把预处理单元测试补上每次跑评测先拿一段已知视频过一遍确认输出的张量形状和均值范围符合预期才继续往下跑。2.4 一段可以复现的 FVD 计算代码下面这套是我平常用的骨架拆成三个函数方便把每一步都单独做单元测试。注意这里的骨干只是示意替换成你们约定的 I3D 权重即可关键是流程本身。第一步均匀采样固定帧数这是所有后续统计的前提import numpy as np def uniform_sample(frames, num_frames16): frames: 长度为 T 的 HxWx3 uint8 列表 if len(frames) 0: raise ValueError(空视频) if len(frames) 1: return [frames[0]] * num_frames idx np.linspace(0, len(frames) - 1, num_frames).round().astype(int) return [frames[i] for i in idx]第二步批量提特征。批大小和显存强相关我一般在 224 分辨率、16 帧输入下用 8 或 16跑之前先拿一条样本测峰值显存import torch torch.no_grad() def extract_3d_features(clips, backbone, batch_size8, devicecuda): clips: FloatTensor (N, C, T, H, W)已完成与训练时一致的归一化 backbone.eval().to(device) feats [] for i in range(0, len(clips), batch_size): batch clips[i:i batch_size].to(device, non_blockingTrue) out backbone(batch) feats.append(out.detach().float().cpu().numpy().reshape(batch.size(0), -1)) return np.concatenate(feats, axis0)第三步算 Fréchet 距离并处理复数部分。这里的sqrtm返回复数的情况一定要处理否则会得到nanimport numpy as np from scipy.linalg import sqrtm def frechet_distance(feat_a, feat_b): mu_a, mu_b feat_a.mean(0), feat_b.mean(0) sigma_a np.cov(feat_a, rowvarFalse) sigma_b np.cov(feat_b, rowvarFalse) covmean, _ sqrtm(sigma_a sigma_b, dispFalse) if np.iscomplexobj(covmean): if not np.allclose(covmean.imag, 0, atol1e-3): print(警告协方差乘积的虚部偏大样本量可能不足) covmean covmean.real return float(((mu_a - mu_b) ** 2).sum() np.trace(sigma_a) np.trace(sigma_b) - 2.0 * np.trace(covmean))再加一个 bootstrap 置信区间两行代码就能让报告的可信度上一个台阶def bootstrap_ci(a, b, fn, n_boot200, seed0): rs np.random.RandomState(seed) vals [fn(a[rs.choice(len(a), len(a), True)], b[rs.choice(len(b), len(b), True)]) for _ in range(n_boot)] lo, hi np.percentile(vals, [2.5, 97.5]) return float(lo), float(hi)2.5 什么时候应该放弃 FVDFVD 不适合的场景比适合的还多。评测对象只有几十段视频的时候别算 FVD直接上人评只需要验证模型版本间的回归、看有没有变差的时候用一组固定的语义对齐和一致性指标做逐提示词的配对比较更灵敏想定位具体是哪个维度出了问题FVD 给不出任何方向。还有一个更根本的局限FVD 需要一个真实视频参考集而文本生成视频的真实参考集很难选。用哪一批真实视频作为“真实分布”直接决定了你测的是什么。用电影片段做参考模型会向电影质感靠拢用手机随手拍的短视频做参考画质标准又完全不同。这个选择必须在报告里写明否则数字依然不可解释。3. VBench 十六个维度怎么拆一张能落地的评测矩阵VBench 是目前采用度最高的开源视频生成评测套件近千条提示词、十六个维度。它不是单一指标而是一整套按能力切片的评测协议和配套数据集把它当成“一个分数”来用是对它最大的浪费。3.1 视频质量组一致性、闪烁、平滑度、动态程度这组维度关注的是“视频本身好不好”跟提示词内容相对独立。主体一致性用 DINO 特征算帧间相似度衡量画面里的主体在时间上是否保持同一个东西——人脸会不会在几帧之间换成另一个人猫的花纹会不会突然变。背景一致性用 CLIP 特征算同样的东西但对光照渐变和相机缓慢运动的容忍度更高因为它看的是语义层面的背景相似性。时间闪烁维度有一个容易被忽略的设计它必须用静态场景提示词来测。如果提示词本身要求大幅运动相邻帧本来就应该有巨大像素差这时候算出来的“闪烁”全是真实运动。所以这一维度的评测集是一批专门挑选的静态提示词视频内容理论上应该几乎不动任何帧间跳变都可以归因为瑕疵。运动平滑度走的是插帧路线用 AMT 合成中间帧再和真实帧对比同样在静态或准静态设定下才有意义。动态程度则用 RAFT 估计光流幅值刻画视频里到底有没有“动起来”这一维度反过来必须在有明显运动的提示词上测。3.2 条件一致性组颜色、场景、空间关系、动作、风格这组维度的共同点是都要先判断提示词里的某个条件有没有被满足所以它们的实现方式跟前面几个不一样很多维度依赖视觉语言模型做二选一或者多选题判断。物体类别和多物体维度需要判断提示词里列出的每个物体是否都出现在画面里。单物体判断还可以靠检测器多物体就必须用视觉语言模型问一句“画面中是否同时存在 A、B 和 C”。人类动作维度同理要看动作是否真的发生了而不是画面里恰好站着一个在做该动作的人。颜色、场景、外观风格属于比较好判的空间关系维度是目前公认最难的一档——“左边的杯子和右边的书”这种提示词绝大多数模型的表现都很勉强用视觉语言模型判断时也经常判错这一维度的分数在横向对比时要格外谨慎。这里有个经验条件一致性维度的提示词必须做“单因素”控制。也就是说一条提示词只考察一个条件不要出现“一只红色的猫在左边的沙发上跳”这种同时压了颜色、空间关系、动作三个条件的句子。多因素耦合的提示词会让分数归因变得不可能你只能知道“这条很差”但不知道是哪一环崩了。3.3 动态程度和运动平滑度是一对互相拉扯的指标这两个维度放在一起看才完整单独看任何一个都容易被优化游戏带偏。模型的运动幅度越大动态程度分数越高但帧间插值的难度也越大运动平滑度就越容易掉。反过来一个几乎不动的模型运动平滑度可以接近满分动态程度却接近零。所以我在报告里会把这两个数放在同一个二维平面上画散点把“理想区域”标出来再逐个把模型点上去。一个模型的点落在“低动态高平滑”区域说明它保守落在“高动态低平滑”区域说明它敢动但控制不住。这比看两个孤立的分数有用得多。3.4 自建评测集的提示词设计从 30 条到 300 条直接用公开评测集的问题在于它测的是“通用能力”而你的模型往往是为某个具体产品场景服务的。我会在公开集之外再建一套私有集规模从 30 条起步逐步扩到 300 条左右。设计原则有这几条按能力分桶每个桶至少 20 条桶之间不重叠。常见的桶包括单主体静态、单主体动作、多主体交互、复杂空间关系、镜头运动、文字渲染、物理合理性。每条提示词只压一个难点其余部分用最简单的表述避免耦合。提示词长度分布要真实如果线上用户平均写 15 个词评测集就不该全是 80 个词的长句。保留一批“傻瓜提示词”用来测基础能力有没有退化这部分往往是回归测试里最早报警的。私有集的维护成本主要在版本管理上。我会给每条提示词一个稳定 ID改动提示词就升版本号历史结果按版本号归档。否则某天发现分数集体下滑你根本说不清是模型变了还是提示词被谁改了一个词。3.5 跑 VBench 的工程细节官方仓库的调用形式大致是命令行指定维度和视频目录比如指定subject_consistency或temporal_flickering然后指向按提示词 ID 命名的视频文件夹。跑全量十六个维度的真实成本不低我一般在单卡上分段跑几个关键经验把解码和指标计算彻底解耦。先用 ffmpeg 把所有视频统一转成固定帧率的图像序列缓存到本地指标计算阶段只读图。这样做的好处是换指标重算时不用重新解码迭代速度快一个量级。显存不足优先降批大小而不是降分辨率。很多维度依赖固定的输入分辨率224 或 256改分辨率会直接改变分数含义而批大小只影响速度。每个维度单独落一份 JSON 结果包含逐提示词的明细分数、失败的提示词列表和跳过原因。断点续跑时按提示词 ID 去重比整段重跑省事得多。视频编码要统一。有的维度需要逐帧读取如果生成侧用了不同的编码参数压缩伪影会污染闪烁类的指标。我固定用接近无损的参数重新编码一遍再进评测。4. 大模型当裁判VLM 评测的可用性与翻车场景条件一致性维度里的很多判断没法用传统指标做视觉语言模型当裁判成了主流方案。它确实好用但把它当成一个稳定的打分器是危险的它有一批非常固定的行为偏差。4.1 打分提示词的结构与锚点设计一个能用的打分提示词至少包含四块内容任务定义你要判断什么、输入说明这些帧来自同一段视频按时间顺序排列、评分标准每一档的具体锚点描述、输出格式先给理由再给分数方便排查。锚点描述是关键。如果只写“1 到 5 分5 分最好”模型会严重向中间聚集大量结果卡在 3 分和 4 分分辨率极差。我会把锚点写具体例如 5 分要求“主体完整、动作清晰、无明显形变、背景稳定”3 分对应“主体可辨认但有明显形变或短暂丢失”1 分对应“主体不可辨认或严重扭曲”。锚点越具体分数的区间拉开得越明显。另一个细节是给模型的帧数和帧的排序。给 4 帧和给 16 帧结论经常不同把帧按时间顺序拼接和随机打乱判断稳定性也不一样。我的做法是固定给 8 帧、均匀采样、按时间从左到右水平拼接成一张图并在提示词里明确说明。4.2 位置偏差和分数聚集怎么修位置偏差指的是多个选项同时呈现时模型倾向给靠前的那个更高分。做图生视频 A/B 对比时这个效应非常明显。修法很简单把顺序随机化每个样本正反各问一次两次结果取平均。成本翻倍但结论的可靠性提升远超这百分之百的成本。分数聚集指的是模型反复给同一个分数。检测方法很直接把全部打分结果画成直方图如果某个分数占比超过 50%这个维度的分数基本没有区分度。补救手段有两个一是换更细的评分尺度比如 1 到 10并配合明确的锚点二是改成 pairwise 比较——问模型“这两段哪个更好”比问“这段打几分”稳定得多因为它把绝对尺度的判断变成了相对判断。还有一个不那么明显但很常见的偏差模型对画面里有清晰人脸的视频会系统性给高分即使提示词要求的是别的东西。如果你的评测集里有相当比例含人脸的提示词这个偏置会污染整个维度的均值按提示词分桶统计能把它暴露出来。4.3 拿一百条样本做一次人机对齐验证引入任何自动裁判之前我都会做一次小规模对齐验证成本很低但收益极高。流程是这样随机抽 100 条模型、提示词组合让 2 到 3 名标注者独立打 pairwise 的胜负然后用同一个提示词模板让视觉语言模型也打一遍最后算两者的 Spearman 相关系数或者简单的一致率。经验阈值一致率低于 65% 就不要用这个裁判做决策先回去改提示词和锚点70% 到 80% 之间可以用来做粗筛和回归监控但不能用来写“A 显著优于 B”85% 以上才考虑进入主报告。这个验证过程本身也要记录版本换了裁判模型或者改了提示词就得重新验一遍。4.4 Pairwise 比较与 Elo / Bradley-Terry只要评测目的是“给模型排序”pairwise 比较就是比绝对打分更可靠的形式。拿到输赢矩阵之后有两种处理方式。Elo 是做增量更新的适合持续迭代、不断有新模型加入的场景每场比较后按结果调整双方的分数K 系数控制单场影响的大小。优点是能直接给出一个实时排序缺点是结果依赖比较的顺序。Bradley-Terry 是离线拟合的把所有比较结果一起丢进去做极大似然估计得到每个模型的强度参数。它不依赖顺序能给出一致的排序缺点是新结果进来就得重算。我一般用 Elo 做日常监控用一个简单的逻辑回归把胜负作为因变量、模型作为哑变量、不加截距项做最终报告两者结论差异不大时说明排序是稳的差异大就说明比较次数不够或者样本存在系统性偏置。5. 视频落到 3D / 4D 表征之后指标怎么接模型输出的是一段视频但下游任务经常要把这段视频转成三维表征——重建场景、做新视角合成或者进一步做成随时间变化的四维表示。这时候评测对象就从“视频”变成了“重建结果”指标也得跟着换一套不能把 FVD 直接搬过来用。5.1 PSNR / SSIM / LPIPS 在时序任务里的适用与失效这三兄弟是重建任务的标准配置。PSNR 是逐像素的均方误差取对数对亮度偏移和整体模糊敏感但对结构变化迟钝。SSIM 从亮度、对比度、结构三个分量做局部比较更贴近人眼对结构失真的感知。LPIPS 用预训练网络的中间特征算距离和人眼判断的相关性通常最高。用在视频和动态重建上这三个指标都有一个共同的盲区它们都是逐帧配对计算的完全不含时间维度。一段高频抖动但每一帧都跟真值对得很齐的重建结果可以在三个指标上都拿到很高分而人一看就知道在闪。所以这三者必须搭配一个时序一致性指标一起报两者不是替代关系。LPIPS 还有一个坑是骨干网络的选择。AlexNet 版和 VGG 版给出的绝对值可以差一倍以上更别说现在还有基于 ViT 的版本。跨论文比较的时候一定要确认是不是同一个版本。5.2 没有真值多视角时怎么设伪参考文本生成视频的下游重建场景绝大多数时候没有真值多视角数据你手上只有那段生成出来的视频本身。这时候“新视角合成质量”就变成了一个没有真值的指标处理方式通常是拿输入视频的某些帧作为伪真值把剩下的帧留作验证视角。这个做法有几个必须写清楚的限制伪真值的质量上限受生成视频本身的画质决定一个本身就有压缩伪影的视频重建 PSNR 再高也不代表重建方法好验证视角和训练视角不能太近否则指标只反映了插值能力如果生成视频里根本没有足够的视差信息重建出来的几何本质上是在外推任何数字都缺乏意义。我现在的做法是在报告里同时给出伪参考指标和一组纯几何的合理性检查比如估算深度图和重建深度的趋势一致性、以及重建出的点云在不同视角下有没有出现噪点团块。5.3 4D 一致性的评测目前还没有共识把动态场景做成随时间变化的四维表示之后评测就变成了双重考核单帧的三维重建质量加上帧与帧之间的几何和外观连续性。目前业界没有统一标准常见的拼法是考核目标常用指标需要注意的地方单帧重建质量PSNR、SSIM、LPIPS逐帧统计后取均值同时报标准差时序外观连续相邻帧特征余弦相似度用 DINO 或 CLIP 提特征均可但要固定版本几何连续性相邻帧深度图的差值统计需要固定的深度估计模型不同模型结果不可比动态区域的合理性光流幅值与几何位移的一致性只对有运动的区域有效静态片段会稀释结果这张表里没有一项是“标准指标”它们都是工程上拼出来的近似。在这个阶段跨方法对比的可靠性远不如自己跟自己比——也就是固定这套组合指标观察方法迭代过程中每个维度是在变好还是变差。6. 我现在的评测流水线长什么样把前面所有东西串起来落到工程上其实就是一个固定结构的目录加一堆脚本。分享这套骨架的原因是评测出问题的概率里至少一半来自流水线本身不规范而不是指标选错了。6.1 预处理契约与随机种子我在每次评测开始前写一份 YAML 配置把前面提到的所有约定固化下来解码器、目标帧率、采样帧数、采样策略、分辨率、裁剪方式、归一化参数、每个指标用的骨干网络及权重来源、批大小、随机种子。这份配置会跟结果一起归档没有它就说不清一个数字是什么意思。随机种子要固定三处模型推理的种子、提示词顺序、采样帧索引的计算np.linspace在浮点上的舍入是确定的但如果中途用了随机采样就必须固定种子。另外把torch.backends.cudnn.benchmark关掉、开启确定性算法能显著减少重复跑同一批数据时的数值抖动。6.2 目录结构和脚本骨架我的目录长这样核心思路是每一层都可以单独重跑不用从头开始eval_run/ config.yaml # 预处理契约 prompts/ # 提示词带稳定 ID raw/{model}/{prompt_id}_{seed}.mp4 frames/{model}/{prompt_id}/0000.png ... # 解码缓存 feats/{model}/{metric}.npy # 特征缓存 results/{metric}.json # 逐提示词明细 report/ # 汇总表格与图表对应的脚本分成四段每段只做一件事decode.py把视频转成统一帧率的图像序列extract.py按指标需要提特征并缓存compute.py读缓存算指标只依赖特征不依赖原始视频report.py汇总并生成对照表。这样做的最大好处是当你想加一个新指标时只要新指标能复用已有特征就不用重新解码迭代一次可能只要几分钟。6.3 报告怎么读从数字到结论汇总表我固定按这个顺序排整体指标在前分桶指标在后。整体指标只给三个数——分布距离、语义对齐、时序一致性每个都带置信区间。分桶指标按能力桶逐个列出用一张热力图看哪个桶最弱。读表的时候有两个模式要养成习惯。第一看置信区间重叠重叠就别下结论。第二看分桶之间的方差如果一个模型在“单主体静态”桶上分数极高、在“多主体交互”桶上垫底这个模型的能力画像非常清晰比看总平均分有用得多。另外一定要把多样性指标放在报告首页哪怕它只有一行。我见过太多次 FVD 变好、多样性指标腰斩的案例如果这份指标不在报告首页它大概率会被忽略。6.4 异常值排查顺序最后是排错顺序按这个顺序走能覆盖九成以上的异常先看原始视频肉眼过三五段确认生成侧没有整体崩掉。指标算得再准源头是坏的就没意义。检查解码缓存随机抽一帧和原始视频的对应时刻对比确认帧序没有错位、色彩空间没有反。这一步能抓到很多隐蔽的问题。核对样本量FVD 这类统计量在样本不足时先怀疑样本再怀疑模型。看方差和异常提示词把单个提示词的分数排序最高最低各看五条通常能一眼看出是提示词写得不合理还是模型真的崩了。最后才怀疑骨干网络和版本确认权重来源、是否加载成功有些实现加载失败会静默使用随机权重分数会非常离谱但不会报错。我个人的习惯是在流水线里加一个自检脚本每次跑评测前先拿一段固定视频过一遍所有指标把结果和历史值对比偏差超过阈值就报警。这个自检脚本大概只花二十分钟写但它帮我省掉的排查时间我粗算了一下至少有几十个小时。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑