资讯动态

视频指代分割(RVOS)从零实践:语言描述与视频时空的跨模态融合

发布时间:2026/10/17 12:47:36 来源:尧图企业网站定制
先开门见山说清楚这个任务是什么。Referring Video Object Segmentation后面统一叫 RVOS的意思是给出一段视频再给出一句自然语言描述比如“左侧那个穿黄色外套、正在过马路的人”模型要做的是把这句话所指的物体在这段视频的每一帧里都分割出来输出逐帧的像素级掩码。这不是单纯的目标检测也不是跟踪因为目标不是靠第一帧框出来的而是靠一句话“认”出来的。我刚接触的时候也一头雾水语言描述往往很模糊视频里又经常有成群结队的相似目标目标还可能中途被遮挡、出画甚至重新出现怎么才能让模型既听懂话、又看稳视频后来我把整条链路拆成数据、模型、训练、评估四块发现并没有想象中那么玄。这篇文章就把我从零搭一套 RVOS 管线时踩过的坑、用过的策略、最后沉淀下来的代码骨架原原本本写出来。适合谁看呢已经做过图像分割或目标检测、想切入“视频 语言”这个交叉方向的工程师和研究者最合适刚入门、但想避开语言过拟合这类隐蔽坑的初学者也可以按文章思路走。文章不会贴几百行的完整实现但会把每条关键路径上的选择以及背后的理由说清楚按文中的思路你大概能用一到两周在单机上跑出能用的 baseline。1. 先有任务再有模型RVOS 到底在解决什么问题1.1 任务边界RVOS 和周边任务的区别很多新手犯的第一个错误是拿静态图像指代分割的模型直接逐帧推理视频。静态场景下一张图上目标就摆在那里模型只需要做一次语言到像素的对齐但视频一旦动起来目标会形变、运动、被遮挡、从画面另一侧重新出现模型必须维护“这个目标在时间维度上始终是同一个”的信念。单帧模型逐帧跑出来的结果最常见的问题就是掩码抖动、身份跳变比如人在走路时前几帧还是一整套衣服后几帧就忽然换到旁边另一个相似路人身上。再说说与传统视频目标分割的区别。传统 VOS 通常在第一帧给了目标掩码或边界框模型从这一刻开始做跟踪本质上是一个“视觉锁定后跟住”的任务。RVOS 没有这个第一帧监督模型必须利用语言描述自己去画面里寻找目标再完成时序绑定。所以 RVOS 是一个“指代解析 时序跟踪 像素分割”的复合任务难度是把“目标被给定”变成了“目标被语言定义”。还有一个容易混淆的任务叫视频时序定位输入也是一句文本输出的是目标出现的起止时间段。它不会给出像素级掩码只回答“什么时候”。RVOS 则要同时回答“什么时候、在哪里、是哪个”时间与空间的粒度都更细模型输出的是整段视频每一帧上的掩码序列。1.2 难点拆解语言、视觉、时序三条线互相纠缠先说语言难点。指代表达天然充满歧义。“那个人”要靠上下文才能消歧“左边穿红衣服的”要求模型具备空间方位推理“正在滑滑板的少年”需要细粒度的动作识别“深蓝花纹的猫”考验的是属性和类别特征的组合。语言编码器输出的是一段全局语义可目标往往只占画面很小的一块视觉特征很容易被大背景淹没。视觉难点也不小。视频中同类目标经常成对或成群出现仅靠外观模型一定会“脸盲”。比如“戴帽子的女生的左边那个人”模型不仅要识别帽子还要理解相对位置关系。这种空间语义想从单帧上稳定地学到其实很难更别说目标在跑动过程中与其他对象发生交互和遮挡。时序难点最隐蔽。目标出画再入画、光照突变、快速运动导致的运动模糊都对“跨帧记忆”提出了要求。模型必须建立帧与帧之间的对应关系但训练用的视频窗口通常只有几帧到十几帧长程依赖要靠注意力或循环机制来维持。这里有个反直觉的坑如果时序模块设计得过强模型反而会偷懒只学会“第一帧选一个亮眼目标后面跟着它走”完全没有用语言去做判别。这种问题在训练日志里看不出来换一句描述立刻原形毕露。1.3 为什么值得从零做一遍坦白讲从零搭 RVOS 并不是因为网上没有开源权重而是因为现成的权重往往按别人的基准训练直接搬到自己的视频数据上效果往往很一般。真正决定项目成败的是数据接口、预处理、损失函数和评估方式这些看起来不起眼的环节。从零搭一遍等于强制你把这些环节全部摸一遍。另一个好处是定制自由。实际业务里很少只有英文长句更多是中文表达式、多目标多句子、或者“把某个人去掉”这种指令式输入。只有自己掌握了整条管线才能在数据层面做调整而不是被现成框架卡死。还有一层原因从零搭一遍会逼你彻底理解掩码数据的格式到底是 RLE 编码还是 PNG 掩码、目标实例 ID 怎么对应描述句、帧索引怎么对应视频时间轴。这些细节搞不清楚后面训练一跑就炸。2. 数据与基准没有一套好题集模型就是盲人摸象先说一个真相这个任务八成以上的故障出在数据段而不是模型段。模型结构写得再花哨喂进去的数据不对齐结果基本都是白训。2.1 常用数据形态和标注结构做 RVOS 常用的数据大致有三类形态。第一类是长视频指代基准。每条视频包含一段连续的片段标注给出每个目标实例的掩码序列通常按每帧或每隔几帧标一次同一个目标实例会附带多条不同写法的描述句。这种数据的特点是个体密度高经常有同类别目标同时出现在画面里非常适合训练模型的“语言消歧”能力也就是让模型学会区分“是这个不是旁边那个一样的”。第二类是短动作视频数据集。视频长度很短动作类别多描述句普遍偏向动作语义比如“正在浇花的人”“跳跃的狗”。用这类数据训练出来的模型对动词更敏感但对长句依赖和多目标关系理解相对偏弱适合做补充训练集。第三类是由静态指代分割数据集派生的伪视频数据。用静态图像加已知掩码通过随机仿射变换、弹性形变、时序循环造出一段伪视频。伪目标没有真实运动坏处是运动模式不自然好处是能零成本扩充预训练样本属于“不要白不要”。看一份标注数据的时候我建议先盯这几个字段视频标识、描述句、目标实例标识、帧索引列表、掩码数据。掩码数据可能是 RLE 字符串也可能是独立掩码文件。训练前最好写一个小脚本把所有样本可视化一遍确认掩码和视频帧对齐。见过最离谱的问题是帧索引基数和视频抽帧器不一致模型学了几天全靠误打误撞的“瞎猜”能力在撑分数。2.2 预处理、抽帧与增强先说分辨率。训练初期建议用 360p 起步也就是短边 360 像素左右显存充足再上 480p。720p 留给最终推理和可视化。RVOS 是显存饕餮多帧输入会让计算量直接乘上帧数一开始就把分辨率拉满往往只能训练极小的 batchcatastrophic forgetting 接踵而至。帧采样是另一个关键决定。我常用的设置是每秒 2 到 4 帧训练窗口长度取 6 到 8 帧。跨度的大小要好好权衡目标运动快时跨度大一点能增强模型对位移的感知但如果跨度超过目标连续出现时长会让窗口里出现大量没有目标的空帧。一个朴素但有效的原则保证采样窗口内目标至少在七成帧上存在低于这个比例loss 会被空掩码稀释。再说增强。空间增强里有一个必须小心的点水平翻转。翻转图像会让本来在左边的目标跑到了右边如果不同步改写表达式里的“左/右”模型就会学到错误的空间语义。正确做法是翻转图像的同时把表达式中的方位词做反向替换比如“左边的人”改成“右边的人”。颜色增强要用得克制稍微扰动一下亮度、饱和度可以防过拟合但下手太狠会让“红色帽子”这种颜色描述失真。时间增强可以做随机丢弃一两帧来模拟短暂遮挡比例控制在 20% 以内太高会让时序模块退化。文字处理方面正式训练前要按预训练语言模型的分词器切分最大长度一般取 20 到 32 个 token超长截断。截断时优先保留句尾因为指代句的限定性修饰词往往在后半段。2.3 训练/验证划分训练集和验证集一定要按视频维度切分严禁把同一条视频的帧和表达式打散后混进两个集合。否则模型会走捷径直接记住这条视频的整体外观验证分数虚高得一塌糊涂。我在第一次做实验时就踩过这个坑验证集 mAP 漂亮得惊人部署到新视频上直接腰斩。验证集不需要太大抽取十分之一左右的表达式数量就够但要保证每个目标实例至少被一条表达式覆盖否则有些属性和动作类别永远不会被测试到。还需要注意一类特殊样本目标只在视频最后一两秒出现的样本。这类样本如果用随机窗口采训练帧大概率全是背景对 loss 贡献极小却会让模型学会“不看文本直接预测背景”。我建议在预训练阶段过滤掉目标出现帧密度低于 20% 的样本等主体结构收敛后再以低学习率按一定比例把它们加回来。3. 架构拆解从一行文字到每一帧的掩码3.1 范式选择两阶段还是单阶段RVOS 的主流做法可以粗分成两派。两阶段路线先做一个与语言无关的通用检测或分割得到一组候选掩码或候选轨迹然后再建立候选和语言描述之间的匹配。它的优点是模块划分清晰视觉候选不依赖语言就能召回方便单独调试缺点是候选质量决定了整个系统的上限而且当语言描述是抽象动作比如“正在投篮的那个人”时通用检测器很难把动作语义投射到候选上。单阶段路线则采用当前检测领域流行的基于查询的范式。模型准备一组可学习的查询向量每个查询在解码过程中与视频特征和文本特征反复交互最终直接输出目标的分类得分和掩码。它是端到端的语言可以直接调制查询向量梯度一路畅通缺点是收敛慢训练对匹配策略格外敏感刚开始的 loss 曲线可能像一条死线。我的建议是第一次做 RVOS 就直奔单阶段。你要维护的模块只有特征编码、融合、解码、损失四个部分整条链路简洁出错概率低。两阶段要做检测、跟踪、匹配三个子系统的协同任何一个环节卡住整体效果都会崩塌。等单阶段 baseline 稳定了再回头扩展也不迟。下表是我当时选择时的对比。维度两阶段单阶段查询式调试难度分模块调试容易端到端调试需看整体语言介入深度只在匹配阶段介入全程介入特征级调制候选质量依赖严重依赖检测器不依赖外部检测器收敛速度较快慢需要 warmup扩展性加模块灵活加查询数量即可多头3.2 文本与视频编码文本编码器的选择很直接直接用开源的预训练语言模型 encoder取倒数第二层输出作为每个 token 的特征同时把全局特征单独保留一份。这里有一个关键决策文本编码器不要完全冻结但学习率要压到视频主干的十分之一左右。完全冻结时文本表示是通用领域的对空间关系、动作描述这类专有语义刻画不够细腻完全放开微调又容易让模型过拟合训练集里固定的表达模板导致换一种写法就不认识。视频编码器不必一上来就上重型 3D 模型。逐帧用图像骨干抽取空间特征再接一个轻量时序模块就够用。轻量时序模块可以是一个沿时间维度的 1D 卷积或者一个小型 Transformer encoder。为什么不需要重型时序模块因为 RVOS 要输出的是每一帧上的掩码真正需要的不是帧与帧之间全量的时序注意力而是让同一空间位置的特征在时间上流通减弱抖动和闪烁。轻量模块正是用来做这个的。位置编码是特别容易漏掉的环节。空间方位描述强烈依赖二维空间位置所以逐帧特征加二维位置编码是必须的同时时间维度上也该加一个可学习的时间位置编码。我见过不少人漏掉时间位置编码结果模型完全分不清帧序一遇到运动物体就出错。3.3 跨模态融合与解码融合方式直接决定模型能不能“听懂话”。最粗暴的做法是把文本 token 和视觉 token 拼在一起送进网络但这种简单拼接的融合深度不够。更稳的写法是交叉注意力把文本 token 作为 Key 和 Value视频特征作为 Query做一层多头交叉注意力让每个空间位置的视觉特征都能主动去读描述里的相关词。与此同时把文本的全局特征加到每个查询向量的初始化上给查询一个“这部分描述对应一个目标”的先验。解码器部分默认设置一组查询向量。数量怎么定要大于视频里可能出现的目标数的一倍以上否则拥挤场景下模型会被迫把两个目标合并成一个。常见取值如 20显存宽裕可以继续上调但查询太多会让空查询之间的竞争加剧训练变慢。每层解码器里查询向量与融合后的视频特征做交叉注意力逐步收敛到具体的空间区域上。最后掩码分支需要一个像素解码器把多尺度特征融合并上采样回原图分辨率。一个很容易踩的坑是查询向量只在某一个 stage 和文本交互了一次后面全靠视觉特征自己玩。这会让语言信息在深层解码中衰减。我的习惯是在每层解码器都注入文本 pool 特征让语言条件贯穿全程。4. 核心代码路径手把手搭起最小可训练管线下面是我最后沉淀下来的一套最小管线伪代码去掉了工程装饰只保留逻辑主线。照着它搭大概率能在两周内跑出 baseline。4.1 数据流水线数据接口的核心就是每个样本最终要同时给出视频帧、描述句、逐帧掩码、以及“哪些帧里有目标”的有效性标记。下面这段代码基本覆盖了核心逻辑。# 数据接口每个样本 一组帧 一句描述 一组掩码 def __getitem__(self, idx): video_id, expr, target_id self.items[idx] frames self.load_frames( video_id, num_frames6, stride2, # 每隔2帧抽1帧 size(360, 640) ) masks self.load_masks(video_id, target_id, frame_idx) if self.aug_on: frames, masks spatial_aug(frames, masks) # 同步翻转/裁剪 frames color_aug(frames) expr flip_expression(expr) if self.hflip else expr return { frames: frames, # [6, 3, 360, 640] text: expr, masks: masks.long(), # [6, 360, 640] 0/1 valid: masks.sum((1, 2)) 0 # 哪些帧有目标 }一个容易忽略但很重要的点是“valid”字段。窗口里如果存在目标缺失帧掩码是全零图如果把它和其他有目标的帧一起算平均损失模型会被带偏。我倾向的做法是掩码损失在缺失帧上权重降为零分类头的匹配阶段也只考虑有目标的帧。文本部分我习惯复用预训练语言模型的分词器统一做小写化处理。中文表达式则直接按中文字符级或对应模型的分词器处理不要硬用英文分词器。4.2 模型主体模型主体的核心结构可以这样看class RVOSModel(nn.Module): def __init__(self): self.text_enc PretrainedTextEncoder() self.video_enc VideoEncoder() # 逐帧骨干 时间卷积 self.cross_attn CrossAttention(dimD) self.decoder TransformerDecoder( num_layers3, num_queries20 ) self.pixel_dec PixelDecoder() self.query_embed nn.Parameter(torch.randn(20, D)) def forward(self, frames, text_ids): # 1. 编码 vt self.text_enc(text_ids) # [L, D] vv self.video_enc(frames) # [T, H, W] - 重排为 [T*H*W, C] # 2. 跨模态融合 fused self.cross_attn(vv, vt, vt) # 视觉 token 读文本 # 3. 查询交互 q self.query_embed.expand(B, -1, -1) q q self.text_pool(vt).unsqueeze(1) # 注入全局文本条件 hs self.decoder(q, fused) # [B, 20, D] logits_cls self.class_head(hs) # [B, 20, 1] mask_logits self.pixel_dec(hs, fused) # [B, 20, T, H, W] return logits_cls, mask_logits这里有一个值得反复强调的设计细节查询向量的初始化要加上文本全局特征。如果不加查询向量等于一堆随机向量初始状态和语言完全无关模型要费很大力气才能在后续解码器里建立关联训练速度肉眼可见地慢。视频特征展开成T*H*W个 token 后和文本做交叉注意力时计算量会很大。这个环节我建议用窗口注意力或者对视觉 token 做降采样比如先池化到原来的四分之一分辨率再做交叉注意力否则 360p 的六帧输入就能把显存吃穿。4.3 损失函数与训练循环掩码损失的组合我一般用二值交叉熵加 Dice 损失再加一个分类损失。Dice 损失对掩码稀疏很友好特别是目标只占画面很小区域时单纯用 BCE 会让小目标淹没在大片背景里。# 匹配匈牙利算法把 20 个查询分配到真实目标通常1个或空 indices hungarian_match(logits_cls, mask_logits, gt_masks) loss ( 1.0 * bce_loss(mask_logits, gt_masks, indices) 1.0 * dice_loss(mask_logits, gt_masks, indices) 0.2 * cls_loss(logits_cls, indices) )训练循环里建议老老实实做几件事混合精度训练、梯度裁剪、学习率预热。学习率设置上视频骨干用较小学习率Transformer 解码器用较大的学习率文本编码器的学习率压到十分之一。我常用的基线上三者分别是 1e-5、1e-4、1e-5配合 5% 的 step 做 warmup。batch size 方面360p、六帧输入单卡 batch 通常只能到 2 左右这时候可以用梯度累积攒够 8 步等效 batch 16 再更新。不要硬撑大 batch显存换来的不一定是效果。5. 训练实录最常踩的五个坑和排查方法这部分是我最想写给后来人的。模型结构再合理这几个训练期的坑也会让你怀疑人生。5.1 显存爆炸多帧输入是显存杀手。360p 的 6 帧输入做一次 forward显存消耗大约是单帧输入的 4 到 5 倍因为中间特征图都得按帧存着。如果你一开始就上 16 帧显存大概率直接爆掉。我的排查顺序是先降分辨率到 360p再减帧数到 4 帧还不行就开梯度检查点。检查点技术会让训练慢一些但显存占用能降三分之一以上。再进一步可以考虑把交叉注意力换成局部窗口版本用空间局部性换显存这在视频任务里非常值得。5.2 文本被“无视”这个坑最隐蔽。训练 loss 正常下降验证分数也还行但你只要把描述句里的“左边”改成“右边”模型输出的掩码一模一样。这说明模型根本没有读懂文本它只是在靠视觉外观或位置先验在猜答案。原因通常是两条融合太弱或者文本微调过度导致过拟合到了训练集的固定表达。排查方法是做一个 probe 测试集把方向词、颜色词、动作词分别替换成对立版本看掩码变不变。对策是加入负样本表达式比如同一段视频里配一条错误的描述句让模型学会“没有对应目标时不能硬出掩码”同时降低文本学习率给文本特征足够的梯度通路。5.3 时序塌缩时序塌缩指的是模型把每一帧的掩码都输出成同一个静态图目标明明从左跑到右掩码还钉在原位。这是因为模型学会了一个捷径只依赖某一帧的高置信度特征其他帧随便糊弄。降低随机丢帧的概率会有帮助比如从 0.2 降到 0.1更大的思路是加一个时序一致性损失显式惩罚相邻帧掩码之间的差异。这个损失不用太重0.1 的权重就够重在让模型知道掩码不能毫无道理地跳变。5.4 掩码稀疏与正负样本失衡目标在画面里通常很小正像素占比可能不到 5%。纯 BCE 会崩模型会倾向于全预测背景。Dice 损失对正负样本不敏感所以我在第四节里把 Dice 损失的权重和 BCE 设成 1:1。如果窗口里含有目标缺失帧还要专门做正帧权重提升我常用的方法是丢失帧上掩码损失直接置零不让它参与反向传播。5.5 指标高但主观观察差这个坑出现在评估阶段。如果评估只算每帧 IoU忽略“过度分割”规则模型可能把一个覆盖了两个目标的掩码算成一对一的正确预测分数自然虚高。解决办法是采用带过度分割拒绝的评估规则也就是预测掩码如果同时覆盖了多个真实目标实例这一个预测就只能算假阳性。这个规则我在下一节会展开讲。先给一个速查表帮大家快速定位。现象可能原因优先排查方案显存不足输入规模过大/融合模块过重降分辨率、降帧数、梯度检查点改描述没反应文本融合弱/反馈不足加负样本、降文本学习率、加文本条件多帧掩码不动时序模块偷懒/丢帧过重减随机丢帧概率、加时序一致性损失小目标丢失掩码稀疏提高Dice权重、掩码缺失帧置零分数高但效果差评估规则太宽松启用过度分割拒绝规则6. 怎么评价做得好不好指标、匹配规则和错误分析6.1 评估指标怎么算RVOS 最常用的指标是逐帧 IoU 的平均值也就是 J。但对视频任务来说逐帧 J 有两个先天问题一是目标缺失帧算 0 还是跳过会让分数差异巨大二是它不惩罚预测掩码跨目标的情况。更严格的做法是在预测掩码和真实掩码之间做匹配时加一条过度分割拒绝规则。具体来说一个预测掩码要被判定为正确必须同时满足两个条件与某个真实目标掩码的 IoU 超过阈值比如 0.5 或 0.7而且这个预测掩码不能覆盖超过一个真实目标实例。如果预测掩码把两个目标都包进去了即使它和其中一个的 IoU 很高也只能算假阳性。然后按目标检测里经典的 AP 思路把所有预测按置信度排序画出 precision-recall 曲线计算平均精度。这就是 P0.5、P0.7 这类指标的含义。我强烈建议在你的验证脚本里同时输出两个分数一个是放宽的逐帧 IoU一个是带过度分割拒绝的 P0.5。两者差距如果很大说明模型正在偷懒用了大范围掩码包住多个目标。6.2 错误分析找模型真正的短板指标只是总分真正能指导迭代的是错误分析。我习惯把验证集预测结果按置信度排序人工抽看 20 个样本然后给错误分四类语言理解错误、空间消歧错误、时序跟踪错误、边缘分割错误。做完一轮你会惊讶地发现大部分错误往往不是出在像素边缘而是出在空间消歧和时序绑定上。边缘分割不好看反而说明模型已经找准了目标只是精细度不够。这时候调整损失权重比换网络结构更有效。相反如果大量错误是“左边右边搞反”“换一个同类目标就丢失”说明语言和视觉的交互模块才是瓶颈应该回头改融合方式而不是继续加特征分辨率。为了让错误分析更客观我还会准备一个 probe 测试集专门用模板生成四种表达式纯属性描述、纯空间关系、纯动作描述、复杂组合。分别统计模型在四类描述上的准确率。这个方法能快速暴露模型的“偏科”问题比如空间关系差但动作识别好。6.3 语言一致性测试这是很多人不会做但非常值得做的测试。为同一条视频、同一个目标写多条等价描述比如“左边穿黑裤子的男生”和“站在滑板旁边的男生”看模型给出的掩码是否稳定。如果描述变一变掩码就飘说明模型对语言的理解还停留在背诵阶段。更进一步还可以做否定测试把目标描述改成视频里不存在的东西比如“穿粉色大衣的老人”理想输出应该是没有掩码或置信度极低。如果模型仍然硬给一个掩码说明它没有建立“语言与视觉的对应”这种能力这对很多实际应用来说是很危险的信号。7. 几条能直接用的工程经验7.1 预训练策略视频指代数据的规模通常不大直接从头训练很容易过拟合。最稳妥的做法是先拿静态图像指代分割数据预训练视觉与文本对齐能力再用视频数据微调。视频和图像之间其实有大量共享能力比如目标识别、空间方位、属性识别微调阶段模型只需要补足“时序绑定”这一个新的能力维度难度会小很多。微调时要把视频骨干的前几层冻结住只训练时间卷积层和解码器相关参数。等稳定后再解冻骨干的低学习率微调。这个顺序能很大程度避免视频数据把骨干的通用视觉表征带偏。7.2 推理加速实际业务里如果要对长视频做 RVOS全模型逐帧推理是不现实的。我常用的折中方案是每隔 5 帧启动一次 RVOS得到关键帧上的目标掩码然后让轻量跟踪模块在关键帧之间传播掩码。语言的“定位能力”只在低频目标检测时使用高频跟踪交给纯视觉模块这样整个系统既稳又快。推理阶段还可以把帧批量打成 chunk用同一个文本条件处理一批帧减少语言编码的重复计算。半精度推理在多数显卡上都能稳定使用显存和速度双赢。7.3 扩展玩法RVOS 做出来之后玩法其实很多。最常见的是视频编辑场景用户说一句“把后排穿蓝衣服的人去掉”模型输出掩码后交给修补算法处理再比如体育分析里用一句“左侧的防守队员”锁定特定运动员后续再接入姿态估计或轨迹分析。同样的架构稍微改一下就能支持多个表达式同时输入增加查询数量每个表达式绑定一个子查询组让它们共享视频特征但各自条件不同。这样模型从单目标指代扩展成了多目标、多指令的任务项目价值会明显上一个台阶。我还用它做过半自动标注工具先用语言锁定目标再由人工确认或微调掩码而不是从头一笔一笔画。标注效率能提升不少也让团队更有动力去积累新的视频指代数据。最后说句实在话。做 RVOS 难的不是背出某个模型结构而是建立起对“语言和视觉到底怎么互相约束”的直觉。我在实际项目里吃过最大的亏不是网络不够深而是没有尽早做语言一致性测试白白浪费了好几周训练时间。如果你只从这篇文章带走一件事我希望是每训一个版本先拿几条手动改过的描述去测同一个视频看看模型是真听懂了还是在表演听懂。这是我个人认为回报率最高、也最容易被忽略的一步。

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

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

免费获取报价 →
↑