1. 别被指标两个字带偏文本生成视频评测到底在量什么指标这个词在不同圈子里指向完全不同的东西。搞通信的人聊的是多路径效应、误码率搞系统的人盯的是内存占用和延迟做量化的人张口就是各种公式源码。而文本生成视频这个方向上说的指标指的是一套用来判断一段由文字描述生成的视频到底好不好的量化体系。它要回答的问题很朴素画面像不像真的、前后帧连不连贯、生成的内容跟提示词对不对得上。我做生成模型评测这块断断续续有几年了最深的感受是文生视频的指标比图像生成的指标难搞一个数量级。图像只要看一帧视频要看几十上百帧还要看帧与帧之间有没有抽风。一个模型把每一帧都渲染得极其精美但人一走动脸就开始融化这种结果在单帧指标上可能拿高分在实际观感上却完全不能看。所以整理这套指标的时候我从一开始就把它们分成三大类来对待画质类、时序类、语义对齐类。这篇内容适合谁看如果你正在做文生视频模型的训练迭代需要一套能说服自己的评估方案如果你是做模型横向对比、要写评测报告或者你只是想知道论文表格里那些 FVD、CLIP Score、Dynamic Degree 到底是怎么算出来的、有没有水分——那这篇整理应该能帮你省下不少翻代码的时间。我会把每个指标的来源、计算链路、数值量级、失效场景都摊开讲并且给出一套可以直接复现的流水线思路。1.1 一个视频好不好得拆成三个问题来问评测设计最容易犯的错是想要一个总分。但视频这个模态天然是多维的硬压成一个数一定会丟信息。我的习惯是先把评价拆成三个正交的问题。第一个问题是单帧质量随便截一帧出来它作为一张图片是否清晰、纹理是否合理、有没有明显的结构崩坏。第二个问题是时序一致性把连续帧排起来看运动是否平滑、有没有闪烁、物体的身份是否保持一致。第三个问题是语义对齐视频里出现的物体、动作、场景、风格跟输入的那句提示词是否匹配。这三个问题的重要性在不同场景下排序完全不同。做影视预演、广告素材的团队语义对齐的权重会拉到很高因为生成得好看但不是我想要的毫无意义做数据增广、做世界模型预训练的团队反而更看重时序一致性和画质稳定性语义可以适当放宽。所以我在整理指标表的时候从来不写综合得分这种单一数字而是分组罗列让下游用的人自己加权。1.2 参考指标和无参考指标先搞清楚手里有没有标准答案还有一个必须先分清的维度这段生成的视频有没有对应的标准答案。有真值视频可对比的叫参考型指标典型代表是 PSNR、SSIM、LPIPS以及视频版的 FVD。它们计算的前提是我有一段应该生成的正确视频。这类指标数值稳定、方差小但只适用于有配对数据的场景比如视频超分、视频插帧、视频修复或者用真实视频做条件重建的验证任务。没有真值的叫无参考型指标。文生视频绝大多数情况属于这一类——你给一句一只橘猫在雨天的窗台上舔爪子上哪找标准答案去所以只能靠 CLIP 这类跨模态模型算语义距离靠预训练的美学模型算画质分靠光流算运动合理性。这里有个特别常见的坑把有参考和无参考的指标混在一张表里比较。我见过不止一次有人拿自己算的 FVD用了真值视频做参考去对比别人论文里的 CLIP Score然后得出我的模型更好的结论。这两者连量纲都不一样比较毫无意义。1.3 报指标之前必须先声明三件事不管你最后选了哪几个指标在报告结果的时候有三件事必须写清楚否则这个数就是废的。分辨率。FVD 这类基于特征提取器的指标对输入分辨率极度敏感。256×256 上算出来的 400跟 512×512 上算出来的 400完全是两码事。因为特征提取网络通常是 I3D在不同分辨率下激活的分布不一样。采样帧数。FVD 的标准做法是取固定长度的片段常见是 16 帧。如果你取 8 帧运动信息不足指标会偏乐观取 32 帧长程不一致会被放大指标会偏悲观。同一个模型换个采样长度数值能差出两位数的百分比。采样策略。是从一个长视频里随机滑窗取若干片段还是只取开头是取均匀间隔还是连续片段随机滑窗、取平均、报标准差这套流程要在所有被比较的模型上完全一致否则结论不可信。注意跨数据集、跨分辨率、跨采样长度的 FVD 数值不具备可比性。论文里那些我们的 FVD 比基线低 30%的说法只有在评测协议完全对齐的前提下才成立。2. 画质类指标每一帧先得立得住画质类指标解决的是这帧看起来像不像一张正常的图。听起来简单但实际用起来不同的指标对不同类型的退化敏感度差别极大。下面按使用频率从高到低捋一遍。2.1 FVD被引用最多也被误用最多的一个FVD 全称 Fréchet Video Distance思路是从 FIDFréchet Inception Distance直接搬过来的用一个在视频数据上预训练的特征提取网络把真实视频片段和生成视频片段都编码成特征向量假设两组特征都服从多元高斯分布然后计算两个高斯分布之间的 Fréchet 距离。公式长这样FVD ||μ_r - μ_g||² Tr(Σ_r Σ_g - 2·(Σ_r·Σ_g)^(1/2))其中 μ 是特征均值Σ 是特征协方差下标 r 和 g 分别代表真实和生成。直观理解第一项衡量两组特征的中心离得有多远第二项衡量分布的形状差多少。数值越低越好。实际操作中特征提取器一般用 I3D在 Kinetics-400 上预训练过。整个计算链路是这样的从真实视频集和生成视频集里各采样 N 个固定长度的片段通常 N 取 2048 以上片段长度 16 帧。把片段 resize 到统一分辨率常见是 224×224 或 256×256。逐个片段过 I3D取最后一层池化后的特征得到 1024 维或 400 维向量。用整批特征估计均值向量和协方差矩阵。代入上面的公式。坑在哪里我踩过的至少有这几个。第一协方差矩阵的估计需要足够的样本量N 小于 1000 的时候估计极不稳定算出来的数跳动能有 ±10%。第二I3D 权重的版本差异会影响结果不同仓库里那份 checkpoint 未必是同一份我自己复现时就遇到过换成 StyleGAN-V 的实现后整体数值平移了近 80 的情况。第三生成视频的数量往往远少于真实视频如果真实集取 2048 个片段而生成集只有 200 个这种不匹配会引入偏差稳妥做法是两边取相同的数量。量级参考在 UCF-101 这个经典基准上早期模型能到 1500 以上做得好的能压到 300 到 500 区间。但请记住这只是数量级感知不要拿这个数字去跨数据集套。2.2 PSNR、SSIM、LPIPS 的分工与失效场景这三个是图像领域的老朋友搬到视频上最直接的做法是逐帧计算然后取平均。但它们各自的脾气很不一样。PSNR就是峰值信噪比本质是逐像素的均方误差取对数。计算简单、可解释但它跟人的主观感受相关性很差。原因在于 PSNR 假设所有像素误差同等重要而人眼对低频结构误差和高频纹理误差的敏感度完全不同。一个轻微的高斯模糊会让 PSNR 掉得很厉害但人眼几乎无感。SSIM引入了亮度、对比度、结构三个分量比 PSNR 贴近人眼一些。计算时用滑动窗口对每个局部块算一次再平均。它的问题是对运动模糊和几何形变极其敏感视频生成里主体稍微动一下、边缘稍微飘一点SSIM 就会明显下降但观感上未必变差。所以 SSIM 更适合评估结构保持类任务比如压缩、超分不太适合评估生成模型的创造性输出。LPIPS用预训练网络的多层特征算距离是目前的感知相似度主流。它对纹理和语义层面的差异敏感对像素级的位移更宽容。在视频任务里LPIPS 一般按帧算完取均值有的工作还会额外报告首帧 LPIPS和末帧 LPIPS因为很多模型存在质量随时间衰减的问题——开头清晰越到后面越糊。我自己的经验配比是做有参考的视频重建类任务PSNR 和 SSIM 用来报告客观保真度LPIPS 用来报告感知质量三个一起给做纯生成任务PSNR、SSIM 基本可以不看因为不存在逐像素对应的真值。提示如果你的工作是动态三维表示比如时序化的高斯泼溅在生成任务上的应用画质指标里通常会保留新视角合成的 PSNR 和 SSIM但这时它们衡量的是重建保真度不是生成质量。这两个概念别混。2.3 美学与成像质量从 LAION-Aesthetic 到 MUSIQ、DOVER纯技术性的画质分搞不定好不好看这个问题。一张图可以 PSNR 很高但构图一塌糊涂也可以 PSNR 很低但看起来很有质感。所以无参考画质评价是必需的一环。LAION-Aesthetic是最常见的做法用一个在 LAION 美学标注数据上训过的小模型对每帧打一个 1 到 10 分的美学分然后跨帧平均。它的优点是简单快速缺点是学到的其实是网络图片的流行审美偏亮、偏饱和、偏高对比对暗调、低饱和的艺术风格不友好。MUSIQ走的是另一条路它不 resize 到固定分辨率而是直接吃原始尺寸的图用多尺度 patch 的机制评估对分辨率和长宽比更鲁棒。CLIP-IQA则是用 CLIP 的特征做无参考质量评估泛化性相对好一些。DOVER是我比较推荐的一个它把视频质量解耦成美学和技术两个分支分别打分最后再融合。技术分支关注的是模糊、噪声、压缩伪影这类问题美学分支关注构图、色彩、光影。分开看的好处是当模型出现很美但很糊或者很清晰但很丑这种情况时你能直接定位问题出在哪。VBench 里把这套东西拆成了两个维度Aesthetic Quality和Imaging Quality分别用不同的预训练模型打分。这个拆法我认同因为这两个维度经常是此消彼长的关系——过度的锐化能提升成像质量分但美学分往往会掉。3. 时序一致性视频和图像评测的最大分水岭如果只让我保留一类指标我会毫不犹豫选时序一致性。因为在文生视频的失败案例里画质差和语义偏都能忍唯一让人无法接受的就是动起来像鬼片。3.1 光流扭曲误差一个被反复重造的老方法核心思路很简单如果相邻两帧描述的是同一个刚体在运动那么用光流把第 t 帧搬运到第 t1 帧的位置结果应该跟真实的第 t1 帧很接近。差得越多说明运动越不可信。完整计算链路是这样的import torch import torch.nn.functional as F def warping_error(frame_t, frame_t1, flow_t_to_t1): frame_t, frame_t1: (1, 3, H, W) 归一化到 [0,1] flow_t_to_t1: (1, 2, H, W) 光流通道顺序 (dx, dy) B, C, H, W frame_t.shape # 生成采样网格 grid_y, grid_x torch.meshgrid( torch.arange(H, dtypetorch.float32), torch.arange(W, dtypetorch.float32), indexingij ) grid torch.stack((grid_x, grid_y), dim0).unsqueeze(0).to(frame_t.device) # (1,2,H,W) sample_grid grid flow_t_to_t1 # 归一化到 [-1,1] sample_grid[:, 0, :, :] sample_grid[:, 0, :, :] / (W - 1) * 2 - 1 sample_grid[:, 1, :, :] sample_grid[:, 1, :, :] / (H - 1) * 2 - 1 sample_grid sample_grid.permute(0, 2, 3, 1) # (1,H,W,2) # 双线性采样把 t 帧搬到 t1 的位置 warped F.grid_sample(frame_t, sample_grid, modebilinear, padding_modeborder) # 只在光流有效区域内统计边界外无意义 err (warped - frame_t1).abs().mean(dim1, keepdimTrue) return err def flow_warping_error(clip, raft_model): clip: (T,3,H,W) total, count 0.0, 0 for i in range(clip.shape[0] - 1): f0 clip[i:i1] f1 clip[i1:i2] flow raft_model(f0, f1) # RAFT 前向光流 err warping_error(f0, f1, flow) total err.mean().item() count 1 return total / max(count, 1)几个必须注意的实现细节。光流的前向和后向要一致用前向光流把第 t 帧 warp 到 t1就跟 t1 比用后向就反过来别混。边界区域要排除或者用有效掩码因为 warp 到画面外的像素采样是没有意义的如果不处理边缘一圈会造成巨大的误差贡献。颜色空间和取值范围要统一光流模型一般吃 [0,1] 区间的 RGB如果你传的是 [-1,1] 的归一化张量光流会算错误差也就没意义了。除了这种像素级的 warp error还有特征级的版本把 warp 前后的帧各自过一遍 VGG 或者 CLIP比较特征距离。特征级版本对轻微的颜色漂移更宽容对结构崩坏更敏感实际用下来我觉得它跟主观感受的相关性更高一些。3.2 闪烁与帧间跳变flickering 的几种量化口径闪烁的本质是本该连续的信号出现了高频抖动。量化方式我见过三类。第一类是全局亮度 / 色度抖动。计算每帧的平均亮度和平均饱和度得到两条时间序列然后算这条序列的一阶差分的标准差。数值越大闪烁越明显。这个简单粗暴但很有效尤其在检测那些色彩周期性地忽明忽暗的失败案例时几乎是一抓一个准。第二类是帧间差分统计。对每对相邻帧算绝对差得到一个差异图取均值。但直接取均值会被运动本身干扰——运动剧烈的视频差异天然就大不代表闪烁。所以常用做法是做个归一化或者只看静止区域用光流幅值做掩码的差分。第三类是块级一致性。VBench 里的 Temporal Flickering 维度用的就是这个思路把帧分成若干 patch用特征提取器算相邻帧对应 patch 的特征距离再统计这些距离超过阈值的比例。它比全局统计更细粒度能定位到具体是画面的哪一块在闪。我的实操建议是别只用一个口径。全局亮度法抓整体的明暗闪烁patch 特征法抓局部的纹理跳变两个一起看基本能覆盖绝大多数问题。如果一个模型在全局指标上正常、patch 指标上很差那多半是局部的高频纹理在抖动比如树叶、毛发、水面这类难以建模的区域。3.3 运动强度与动态程度别把静止不动评成满分这是个特别讽刺的事情一个模型如果选择什么也不动它在几乎所有时序一致性指标上都会拿到满分因为静止画面前后帧完全一致。但它显然不是一个好的视频生成模型。所以必须配一个运动强度指标来对冲。常见做法是用光流幅值算相邻帧的光流取幅值的平均值或者中位数得到整段视频的平均运动量。有的实现会额外算一个动态程度的二值指标——设定一个阈值统计有多少比例的画面区域的光流幅值超过了这个阈值得到一个 0 到 1 之间的分数。VBench 里的 Dynamic Degree 就是类似逻辑用 RAFT 算光流然后根据光流幅值和阈值判断这个视频算不算有动态。这个分数低不代表不好因为有些提示词本身就是静态场景但如果一个模型在所有提示词上的动态程度都显著偏低那就要警惕它是不是在用摆烂的方式来刷一致性分数。我自己做对比实验时习惯把时序一致性和运动强度画成一张散点图横轴运动强度纵轴一致性。理想的模型应该落向右上方——动得多还保持得稳。那些落在左上角的动得少所以稳和落在右下角的动得多但崩了一眼就能区分开。注意光流模型本身在遮挡区域和大幅度位移下会失效算出来的运动量会系统性偏低。所以运动强度指标最好跟 2D 光流之外的东西交叉验证比如主体检测框的位移轨迹。4. 文本-视频对齐语义层面的量化前面两类指标回答的是画得好不好这一类回答的是画得对不对。这是文生视频特有的、也是最难量化的一类。4.1 CLIP Score 及其视频变体最基础的做法是把 CLIP 拿过来用。CLIP 训练时是对齐图像和文本的所以在视频上标准做法是import clip import torch device cuda model, preprocess clip.load(ViT-B/32, devicedevice) model.eval() torch.no_grad() def clip_score(frames, prompt, batch16): frames: list of PIL.Imageprompt: str text clip.tokenize([prompt]).to(device) text_feat model.encode_text(text) text_feat text_feat / text_feat.norm(dim-1, keepdimTrue) scores [] for i in range(0, len(frames), batch): chunk frames[i:ibatch] imgs torch.stack([preprocess(f) for f in chunk]).to(device) img_feat model.encode_image(imgs) img_feat img_feat / img_feat.norm(dim-1, keepdimTrue) sim (img_feat text_feat.T).squeeze(-1) # 余弦相似度 scores.extend(sim.cpu().tolist()) return sum(scores) / len(scores)几个坑。第一取平均还是取最大。逐帧算完相似度之后取平均反映的是整体上像不像取最大值反映的是最好的一帧有多像。这两个口径差异很大一个模型可能只有一帧很贴合提示词其余全是噪声取最大值会给出虚高的分数。我一般两个都报并额外报一个相似度的标准差标准差大说明语义对齐很不稳定。第二CLIP 的编码器版本。ViT-B/32、ViT-B/16、ViT-L/14 给出的分数完全不在一个量级上B/32 一般在 0.25 到 0.32 区间L/14 会整体偏高。跨论文比较时必须确认用的是哪个版本。第三CLIP 的固有缺陷。CLIP 对数量左右关系动作方向这类需要组合推理的概念判别能力很弱。一句两个人在画面左边一只狗在右边只要画面里有人有狗CLIP 分就很高哪怕方位全反了。所以现在有工作专门训视频版的 CLIP比如在视频-文本对上继续训练对动作和时序关系的描述能力更强。4.2 拆维度打分VBench、EvalCrafter 的评测哲学单靠一个 CLIP 分远远不够所以近两年出现了一批多维评测框架思路都是把对齐这个大概念拆成一组可以被独立检验的小问题。VBench 的做法是把评测拆成十几个维度覆盖主体一致性、背景一致性、时序闪烁、运动平滑度、动态程度、美学质量、成像质量以及一组语义维度物体类别、多物体、人体动作、颜色、空间关系、场景、外观风格、时序风格、整体一致性。每个维度都有专门的提示词集合和对应的打分方法。它的好处是你要定位问题非常直观——某个模型在多物体维度上特别差你就知道它在处理两个以上主体时有困难。EvalCrafter 的思路类似但更强调内容质量和运动质量的分离用了一组自动化指标加人工打分做校准。这类框架的价值不只是分数本身更是提示词集合的设计。一个设计良好的评测提示词集应该覆盖不同难度梯度从单主体静态场景到多主体交互到复杂的动作链到需要理解空间关系的场景。我在自己搭评测集的时候基本是照着这个梯度来配比大概 3:3:2:2 的比例。如果你手上的资源有限做不了全套框架我的最低配建议是这五个维度主体一致性、多物体数量正确性、动作匹配度、色彩准确度、空间关系。这五个基本能覆盖语义层面的主要失败模式。4.3 大模型裁判和人工评测什么时候必须上人用多模态大模型当裁判是这两年很流行的做法把抽帧后的视频和提示词一起喂给模型让它回答视频是否准确呈现了提示词描述的内容或者直接打 1 到 5 分。它的优势是可以处理 CLIP 搞不定的组合推理问题能理解左边第二个正在打开这类关系。劣势有三个位置偏置模型倾向于偏好排在前面或后面的选项、长度偏置答案长的选项更容易得高分、自洽性差同样的输入换一次采样结论可能就变了。缓解办法是成对比较加上位置交换——把 A 和 B 的顺序换一遍各问一次两次结果不一致的样本直接丢掉或者记为平局。同时温度调到很低甚至贪心解码减少随机性。那什么时候必须上人工我的判断标准是当你要发布一个结论性的对比结果或者你的方法在自动指标上只领先了一点点的时候。自动指标的方差摆在那领先 2% 很可能完全在噪声范围内。这时候要么扩大评测样本量做显著性检验要么做小规模但严格的人工评测。人工评测推荐用成对偏好比较A/B test而不是绝对打分。因为人对绝对分数的标尺不一致同一个人上午打 4 分下午可能打 3 分但这两个哪个好的判断要稳定得多。收集足够多的成对比较后可以算 Elo 分或者用 Bradley-Terry 模型拟合出全局排名。同一条对比建议至少收集 3 个不同评测者的意见减小个体偏差。5. 搭一套能复现的评测流水线指标算得对不对一半取决于你选了什么指标另一半取决于你的流水线搭得规不规范。上面讲的坑很多其实可以通过工程手段规避。5.1 采样、分辨率与特征缓存的工程细节采样策略要固定成配置文件。因为随机性会导致复现困难。我的做法是把每个评测提示词对应的随机种子写死然后从生成的视频里截取固定区间比如从第 0 帧开始取 16 帧而不是随机滑窗。这样任何人拿到同一个模型 checkpoint跑出来的数是完全一样的。如果视频长度不够 16 帧要么在生成时就保证长度要么做时间维度的插值补齐但要在报告里说明。我见过有人用重复最后一帧的方式补齐这会让时序一致性指标虚高属于不能接受的操作。分辨率对齐要显式配置。所有基于预训练特征网络的指标都要在配置里写清楚 resize 的目标尺寸和插值方式。是双线性还是双三次是直接 resize 还是保持长宽比后中心裁剪这些都会影响结果。我的习惯是统一用保持长宽比 resize 到短边为目标值再中心裁剪。特征缓存能省大量时间。FVD 这类指标真实视频集的特征是固定的完全可以算一次存下来之后每次评测只算生成集的特征。这个优化在真实集有几千个片段的时候能把单次评测时间从几小时压到几十分钟。5.2 指标汇总与显著性检验别用小数点后四位骗自己跑完所有指标之后最容易犯的错是把结果整理成一张精确到小数点后四位的表格然后因为第三位小数的差异下结论。实际情况是FVD 在不同随机种子下的标准差可能就有几十CLIP Score 的批次间差异可能在 0.005 量级。所以我强烈建议每个指标都跑至少 3 个不同的采样种子报均值和标准差。只有两组结果的差值超过两倍标准差才值得说有提升。如果要做严格的显著性检验在样本量足够的情况下用配对 t 检验或者 Wilcoxon 符号秩检验样本量小的时候可以用 bootstrap 重采样估计置信区间。这些在 scipy 里都是几行代码的事但能让你的结论可信度上一个台阶。另外跨维度之间的结果要交叉看。如果画质分提升了很多但一致性分掉了很多那多半是模型在生成更锐利的细节时牺牲了帧间稳定性这是很典型的 trade-off值得在报告里点出来而不是只看总分的涨跌。6. 踩坑实录与问题速查下面这些是我在实际评测里反复遇到、并且花了不少时间才定位的问题整理成速查表方便你排查。6.1 常见问题速查表现象可能原因排查方法处理方式FVD 数值异常高但肉眼看视频正常生成集样本量远小于真实集协方差估计失真检查两边采样片段数量是否相等对齐为相同数量且都大于 1000CLIP Score 波动超过 0.02抽帧策略随机或不同模型生成的视频长度不一致固定抽帧区间和帧数禁用随机滑窗写死随机种子固定采样协议时序一致性满分但视频看起来是静止的模型走了不动的捷径同时看运动强度指标把动态程度纳入必报指标设下限阈值Warping error 在画面边缘特别高光流 warp 到图像外边界采样无意义可视化误差热力图看是否集中在边缘用有效掩码排除边界或改用 padding 后裁剪大模型裁判打分不稳定采样温度过高或存在位置偏置同一输入跑三次看方差交换 A/B 顺序再跑贪心解码成对比较时交换位置取一致结果两个模型的指标差距很小难分优劣差异在噪声范围内换 3 个种子重跑看标准差扩大样本量做显著性检验或补人工评测LPIPS 逐帧算完取平均后区分度差末帧质量衰减被平均掉了分别统计前 1/3 和后 1/3 帧的均值额外报告首末帧差异反映质量衰减趋势分辨率变化后所有指标都不可比特征提取器对尺度敏感确认所有对比模型使用同一 resize 配置统一分辨率写进配置文件禁止逐模型调整6.2 几条用血换来的经验第一评测集要小而精不要大而全。我一开始想着覆盖面越全越好搞了上千条提示词结果每条都要跑一遍生成加一遍评测迭代一次要一整天最后根本没人愿意跑。后来砍到 200 条左右按难度分层配比覆盖主要失败模式迭代速度直接快了一个数量级反而更有用。评测集是用来发现问题的不是用来刷榜的。第二可视化比数字重要。每次跑完评测我都会挑出每个指标上表现最差和最各 5 个样本把视频拼成对比图看一遍。很多时候数字上看不出问题但一看视频就明白比如所有失败案例都是同一种材质比如反光表面、同一种动作比如快速转身。这种模式化的失败光看指标均值永远发现不了。第三指标的稳定性比绝对数值重要。一个指标如果换个种子就跳 20%那它作为迭代信号的参考价值就很有限因为你分不清是模型变好了还是运气好。我在选指标时会先做一件事用同一个模型 checkpoint 跑三遍看每个指标的方差。方差大的指标要么加采样量把它压下去要么直接换掉。这个过程大概会淘汰掉三分之一的候选指标。第四留一份黄金样本做回归测试。选定一批固定提示词加固定种子每次模型更新后跑一遍看有没有指标出现异常的大幅波动。这套回归集救过我两次一次是发现某个训练改动导致特定长度提示词全部生成失败整体指标看不出来另一次是发现某个数据清洗脚本误删了包含特定物体的样本导致那一类的对齐分断崖式下跌但平均分只掉了 1%。第五别只跟自己比。自己跟自己比只能确认有没有变好确认不了好了多少。所以我每年都会维护一份第三方模型的结果基线用完全相同的评测协议跑一遍虽然不能直接发出去但至少知道自己的位置在哪不至于在内部指标上自嗨。第六评测代码和数据都要版本化。指标实现的细微改动比如换了个光流模型、改了个 resize 参数会让历史结果全部失效。我现在把所有评测相关的代码、配置、提示词集、种子都放在一个仓库里打 tag每次报告结果时注明用的是哪个 tag。这个习惯看起来麻烦但在需要回溯三个月前某个数字是怎么算出来的时候你会感谢自己。关于扩展方向如果你做的不只是 2D 视频生成还涉及连续的视角合成或者动态三维场景生成那这套指标需要在画质部分补上多视角一致性检验——用同一时刻不同视角的渲染结果两两算 SSIM 和 LPIPS看几何是否在视角切换时保持一致。这一块目前还没有特别统一的公开协议各家报的数差异比较大做对比实验时要格外小心协议对齐的问题。我个人在实际操作中的体会是文生视频的指标整理到最后考验的不是你会不会调库而是你能不能建立起一套数字和观感相互印证的判断力。当某个指标显示提升而你看着视频觉得变差了不要急着信指标多半是那个指标跟你要优化的目标之间出现了偏差这时候该做的是换指标而不是说服自己。