1. 项目概述从静态到动态的视觉注意力战场如果你关注过计算机视觉领域尤其是图像处理相关的顶级会议那么对NTIRE这个名字一定不陌生。NTIRE全称是New Trends in Image Restoration and Enhancement是CVPR计算机视觉与模式识别国际会议旗下的一个旗舰级研讨会每年都会举办一系列极具挑战性的竞赛吸引全球顶尖的工业界和学术界团队同台竞技。而“视频显著性预测”这个赛道可以说是NTIRE近年来最“卷”也最引人注目的方向之一。它要解决的核心问题简单来说就是让机器像人一样在看一段视频时能自动、准确地预测出“人眼会看向哪里”。这听起来似乎和传统的图像显著性检测很像但难度系数完全不是一个量级。静态图片里显著性区域相对稳定比如一张风景照里突然出现一个人那这个人大概率就是视觉焦点。但视频是动态的、连续的包含了时间维度的信息。人的注意力会受到物体运动、场景切换、剧情发展、甚至背景音乐的强烈影响。比如在一个对话场景中说话者的嘴部、手势和表情会交替成为焦点在一个体育赛事视频中球的轨迹和关键运动员的动作会牢牢抓住观众的视线。因此视频显著性预测Video Saliency Prediction, VSP不仅要分析每一帧的空间特征更要深刻理解帧与帧之间的时序关联和语义演变。我之所以对这个挑战赛如此关注是因为它远不止一个学术竞赛。其成果直接关系到一系列真实且庞大的应用场景。在流媒体平台准确的显著性预测可以用于智能视频压缩对非显著区域进行更高程度的压缩以节省带宽、自适应码率分配以及生成更具吸引力的视频缩略图。在广告行业它可以分析广告片中哪些元素最能吸引观众从而优化创意。在自动驾驶和机器人领域理解人类的视觉注意力机制有助于设计更符合人类认知的交互系统。甚至在我们日常使用的视频会议软件中基于显著性的虚拟背景和发言人跟踪也离不开相关技术的支持。可以说谁能在这个赛道上取得突破谁就在下一代智能视频处理技术中占据了先机。2. 挑战赛核心任务与数据集深度剖析2.1 任务定义与评价指标不仅仅是“看哪里”NTIRE视频显著性预测挑战赛的任务通常非常明确给定一段未经处理的视频序列要求参赛模型为每一帧输出一个与输入分辨率相同的显著性概率图Saliency Map。在这个概率图中每个像素的值在0到1之间代表了该像素吸引人类视觉注意力的可能性值越高表示该位置越可能是人眼注视点。那么如何评判一个模型的好坏呢这就引出了评价指标。竞赛中常用的指标有几个理解它们对于设计模型至关重要NSS (Normalized Scanpath Saliency)标准化扫描路径显著性。它计算的是在真实人眼注视点位置上模型预测的显著性值的标准化分数。简单理解它衡量的是模型预测的“峰值”是否与真实注视点对齐。NSS值越高越好大于0表示预测优于随机猜测。CC (Pearson‘s Correlation Coefficient)皮尔逊相关系数。它衡量的是预测的显著性图与真实的人眼注视密度图将离散的注视点进行高斯平滑后得到的连续分布之间的线性相关程度。CC值在-1到1之间越接近1表示相关性越强预测图与真实分布越相似。SIM (Similarity)相似度。计算的是预测显著性图与真实注视密度图之间的直方图交集。你可以把它理解为两个概率分布的重叠面积。SIM值也在0到1之间值越大表示两者越相似。AUC (Area Under ROC Curve)这里通常指AUC-Judd或AUC-Borji。它将显著性预测视为一个二分类问题注视点 vs 非注视点通过计算ROC曲线下的面积来评估模型性能。AUC值越接近1越好。一个稳健的模型应该在所有指标上都表现良好因为不同指标反映了预测的不同侧面。例如一个模型可能擅长捕捉注视点的精确位置高NSS但预测的显著性区域形状可能与真实分布相差较大低SIM。在竞赛中组织方往往会采用多个指标的综合排名或加权得分来最终决定优胜者。2.2 数据集模型训练的基石与挑战来源“巧妇难为无米之炊”数据集的质量和规模直接决定了模型性能的上限。NTIRE挑战赛通常会指定或提供几个权威的视频显著性数据集例如DHF1K (Dynamic Human Fixation 1K)包含1000个高质量视频片段涵盖多种类别运动、社交、风景等并提供了大量受试者的眼动数据。它是目前规模最大、使用最广泛的视频显著性数据集之一。Hollywood-2源自电影片段包含12个动作类别其眼动数据是在自由观看条件下收集的更贴近自然观看状态。UCF Sports专注于体育动作视频动作剧烈背景复杂对模型的动态捕捉能力要求极高。LEDOV (Learning to Predict Eye Fixations in Videos)也是一个大型数据集注重视频内容的多样性。这些数据集共同构成了模型训练和验证的基石。然而它们也带来了巨大挑战数据标注成本极高采集高质量的眼动数据需要专业的设备和大量的受试者过程耗时费力导致数据集规模难以像图像分类数据集如ImageNet那样庞大。标注噪声与主观性不同人的观看习惯存在差异即使对同一段视频注视点分布也会有波动。如何从带有噪声的标注中学习到稳定、通用的注意力模式是一大难点。场景与内容的局限性尽管现有数据集已涵盖较多类别但与互联网上浩如烟海的视频内容相比其多样性仍然不足。模型在未知类别视频上的泛化能力面临考验。注意在实际备赛时除了官方提供的数据集合理、合规地利用其他公开数据集进行预训练或数据增强是提升模型性能的常见策略。但必须严格遵守数据使用许可并注意不同数据集之间标注格式和收集条件的差异需要进行仔细的预处理和归一化。3. 主流技术路线与模型架构演进视频显著性预测模型的发展清晰地反映了深度学习特别是视觉Transformer和时空建模技术的演进轨迹。我们可以将其大致分为几个阶段3.1 基于CNN与光流的早期融合方法在深度学习兴起之初主流方法是利用卷积神经网络CNN提取每一帧的空间特征然后使用光流Optical Flow来显式地建模帧间的运动信息。光流描述了像素在连续帧之间的运动矢量。典型的流程是使用一个CNN主干网络如VGG、ResNet提取每帧的特征图。使用一个光流估计网络如FlowNet计算相邻帧之间的光流场。将当前帧的CNN特征与从前一帧“扭曲”warp过来的特征利用光流进行融合再输入到一个预测头网络中生成显著性图。这种方法直观有效光流提供了明确的运动线索。但其缺点也很明显计算光流本身就是一个耗时的过程并且光流估计的误差会直接传播到显著性预测中此外这种方法对长时序的建模能力有限通常只融合临近的几帧。3.2 基于3D CNN与ConvLSTM的时空统一建模为了更自然地统一处理时空信息研究者们开始采用3D CNN和ConvLSTM。3D CNN将卷积核从二维扩展到三维宽、高、时间直接在视频立方体上进行卷积从而同时捕获空间和短时序特征。C3D网络是其中的代表。但3D CNN参数量大计算成本高对长视频的处理仍有压力。ConvLSTM将传统的LSTM中的全连接层替换为卷积层使其能够处理具有空间结构的特征序列。模型可以逐帧处理视频用ConvLSTM单元来记忆和更新时空上下文信息。这种方法能处理更长的序列但训练起来相对复杂存在梯度消失或爆炸的风险。这个阶段的模型开始尝试端到端地学习时空特征避免了对光流等中间表示的依赖。3.3 Transformer的统治与多模态融合近年来Vision Transformer及其变体彻底改变了这一领域。Transformer的自注意力机制非常适合建模长距离依赖关系无论是空间上的还是时间上的。时空Transformer直接将视频序列视为一系列的时空“令牌”Tokens。通过空间注意力模块捕捉一帧内的全局关系再通过时间注意力模块捕捉不同帧之间对应位置或区域的关系。例如ViT被扩展为TimeSformer或ViViT通过分解的空间-时间注意力机制高效地处理视频。基于Swin Transformer的架构Swin Transformer因其层次化设计和移动窗口注意力在计算效率和性能上取得了很好的平衡。许多顶尖的竞赛方案都基于Swin Transformer进行改造构建时空分层的编码器。多模态融合人的注意力不仅仅受视觉影响。声音谁在说话、突然的响声、语义字幕、物体识别都至关重要。因此当前最先进的方法往往是多模态的。例如视觉-音频融合使用一个音频网络如VGGish提取音频特征与视觉特征在特定层进行融合相加、拼接或注意力机制。枪声、爆炸声、音乐高潮都能强烈引导注意力。视觉-语义融合利用现成的图像描述模型如CLIP或目标检测模型如DETR来获取视频帧的语义标签或嵌入将这些高级语义信息作为先验知识注入到显著性预测中。在NTIRE 2024等近期竞赛中获胜方案几乎都是基于强大的视觉Transformer主干如Swin-B, Swin-L并深度融合了音频和语义信息。模型结构通常是一个编码器-解码器架构编码器负责从原始视频和音频中提取多层次的多模态时空特征解码器则逐步上采样融合不同尺度的特征最终输出高分辨率的显著性图。4. 从零构建一个基础VSP模型的实战指南了解了技术脉络后我们动手搭建一个基础的视频显著性预测模型。这里我们将实现一个简化但完整的流程基于PyTorch框架。4.1 环境准备与数据预处理首先确保你的环境已安装PyTorch、Torchvision、OpenCV、NumPy等库。我们以DHF1K数据集为例。pip install torch torchvision opencv-python numpy pandas scikit-learn tqdm数据预处理是关键的第一步。DHF1K数据集通常提供视频帧文件夹和对应的注视点坐标文件。import os import cv2 import numpy as np import pandas as pd from pathlib import Path def preprocess_dhf1k_sample(video_frames_dir, fixation_csv_path, output_size(224, 224)): 预处理一个视频样本读取帧调整大小读取注视点并生成密度图。 Args: video_frames_dir: 存放视频帧图片的目录 fixation_csv_path: 包含注视点坐标的CSV文件路径 output_size: 输出图像和密度图的大小 (H, W) Returns: frames: 处理后的视频帧序列形状 (T, H, W, 3) density_map: 生成的注视密度图形状 (H, W) # 1. 读取并排序帧文件 frame_files sorted([f for f in os.listdir(video_frames_dir) if f.endswith(.jpg)]) frames [] for fname in frame_files: img_path os.path.join(video_frames_dir, fname) img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转为RGB img cv2.resize(img, (output_size[1], output_size[0])) # 调整大小 img img.astype(np.float32) / 255.0 # 归一化到[0,1] frames.append(img) frames np.stack(frames, axis0) # (T, H, W, 3) # 2. 读取注视点并生成密度图 df pd.read_csv(fixation_csv_path) # 假设CSV列名为frame_index, x, y # 注意原始注视点坐标是基于原始图像分辨率的需要缩放 original_height, original_width 1080, 1920 # DHF1K原始分辨率 scale_x output_size[1] / original_width scale_y output_size[0] / original_height density_map np.zeros((output_size[0], output_size[1]), dtypenp.float32) for _, row in df.iterrows(): x int(row[x] * scale_x) y int(row[y] * scale_y) # 确保坐标在图像范围内 if 0 x output_size[1] and 0 y output_size[0]: density_map[y, x] 1.0 # 使用高斯滤波将离散点转化为连续密度图 from scipy.ndimage import gaussian_filter if density_map.sum() 0: density_map gaussian_filter(density_map, sigma5) # sigma根据输出尺寸调整 density_map density_map / (density_map.sum() 1e-8) # 归一化为概率分布 return frames, density_map # 示例用法 # frames, density preprocess_dhf1k_sample(path/to/video/frames, path/to/fixations.csv)4.2 构建一个简单的CNN-LSTM模型我们构建一个结合CNN空间特征提取和LSTM时序建模的基线模型。import torch import torch.nn as nn import torch.nn.functional as F class SimpleVideoSaliencyModel(nn.Module): def __init__(self, frame_size224, lstm_hidden_size512): super().__init__() # 空间特征提取器 (使用一个轻量级CNN) self.spatial_cnn nn.Sequential( nn.Conv2d(3, 64, kernel_size7, stride2, padding3), # (N, 64, 112, 112) nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.MaxPool2d(kernel_size3, stride2, padding1), # (N, 64, 56, 56) nn.Conv2d(64, 128, kernel_size3, stride1, padding1), nn.BatchNorm2d(128), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # (N, 128, 28, 28) nn.Conv2d(128, 256, kernel_size3, stride1, padding1), nn.BatchNorm2d(256), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # (N, 256, 14, 14) ) # 计算CNN输出展平后的维度 with torch.no_grad(): dummy_input torch.randn(1, 3, frame_size, frame_size) dummy_output self.spatial_cnn(dummy_input) self.cnn_output_flatten_size dummy_output.view(1, -1).size(1) # 256*14*1450176 # 时序建模 (LSTM) self.lstm nn.LSTM(input_sizeself.cnn_output_flatten_size, hidden_sizelstm_hidden_size, num_layers2, batch_firstTrue, bidirectionalTrue) # 使用双向LSTM捕捉前后文 # 解码器 (将LSTM输出映射回显著性图) self.decoder nn.Sequential( nn.Linear(lstm_hidden_size * 2, 512), # 双向LSTMhidden_size*2 nn.ReLU(), nn.Linear(512, 256), nn.ReLU(), nn.Linear(256, frame_size // 16 * frame_size // 16), # 输出展平的特征 ) # 上采样到原图大小 self.final_conv nn.Sequential( nn.Conv2d(1, 32, kernel_size3, padding1), nn.ReLU(), nn.Upsample(scale_factor16, modebilinear, align_cornersFalse), nn.Conv2d(32, 1, kernel_size3, padding1), nn.Sigmoid() # 输出0-1之间的概率图 ) def forward(self, x): # x 形状: (batch_size, timesteps, channels, height, width) batch_size, timesteps, C, H, W x.shape # 1. 提取每一帧的空间特征 cnn_features [] for t in range(timesteps): frame x[:, t, :, :, :] feat self.spatial_cnn(frame) # (N, 256, 14, 14) feat_flat feat.view(batch_size, -1) # (N, 50176) cnn_features.append(feat_flat) # 堆叠时间步 cnn_features torch.stack(cnn_features, dim1) # (N, T, 50176) # 2. LSTM时序建模 lstm_out, _ self.lstm(cnn_features) # (N, T, lstm_hidden_size*2) # 3. 解码这里我们取最后一个时间步的输出作为当前帧的显著性预测简化处理 # 更复杂的做法是对每个时间步都进行解码 last_step_features lstm_out[:, -1, :] # (N, lstm_hidden_size*2) decoded self.decoder(last_step_features) # (N, (H/16)*(W/16)) # 4. 重塑并上采样 map_size H // 16 saliency_feat decoded.view(batch_size, 1, map_size, map_size) # (N, 1, 14, 14) saliency_map self.final_conv(saliency_feat) # (N, 1, H, W) return saliency_map # 实例化模型 model SimpleVideoSaliencyModel(frame_size224) print(f模型参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.2f} M)4.3 损失函数设计与模型训练对于显著性预测常用的损失函数是Kullback-Leibler Divergence (KLD)和CC Loss的组合。KLD衡量两个概率分布的差异CC Loss则直接最大化预测图与真值图的相关系数。class SaliencyLoss(nn.Module): def __init__(self, lambda_kld1.0, lambda_cc1.0): super().__init__() self.lambda_kld lambda_kld self.lambda_cc lambda_cc def kld_loss(self, pred, target): 计算KLD损失pred和target都是概率分布sum1 eps 1e-8 pred pred / (pred.sum(dim(2,3), keepdimTrue) eps) target target / (target.sum(dim(2,3), keepdimTrue) eps) kld target * torch.log(target / (pred eps) eps) return kld.sum(dim(2,3)).mean() def cc_loss(self, pred, target): 计算负的相关系数作为损失最大化相关系数等价于最小化此损失 eps 1e-8 pred_mean pred.mean(dim(2,3), keepdimTrue) target_mean target.mean(dim(2,3), keepdimTrue) pred_std torch.sqrt(((pred - pred_mean)**2).mean(dim(2,3), keepdimTrue) eps) target_std torch.sqrt(((target - target_mean)**2).mean(dim(2,3), keepdimTrue) eps) covariance ((pred - pred_mean) * (target - target_mean)).mean(dim(2,3)) cc covariance / (pred_std.squeeze() * target_std.squeeze() eps) return -cc.mean() # 返回负的CC均值 def forward(self, pred, target): l_kld self.kld_loss(pred, target) l_cc self.cc_loss(pred, target) total_loss self.lambda_kld * l_kld self.lambda_cc * l_cc return total_loss, {KLD: l_kld.item(), CC: -l_cc.item()} # 返回CC的负值即为正的相关系数 # 训练循环示例 def train_epoch(model, dataloader, optimizer, criterion, device): model.train() total_loss 0 for batch_idx, (video_clips, density_maps) in enumerate(dataloader): video_clips video_clips.to(device) # (N, T, C, H, W) density_maps density_maps.to(device).unsqueeze(1) # (N, 1, H, W) optimizer.zero_grad() pred_maps model(video_clips) # (N, 1, H, W) loss, loss_dict criterion(pred_maps, density_maps) loss.backward() optimizer.step() total_loss loss.item() if batch_idx % 10 0: print(fBatch [{batch_idx}/{len(dataloader)}], Loss: {loss.item():.4f}, CC: {loss_dict[CC]:.4f}) return total_loss / len(dataloader)实操心得在训练初期由于预测图可能非常平滑CC Loss的梯度会很小。一个实用的技巧是在训练的前几个epoch主要使用KLD Loss待模型初步收敛后再逐渐增加CC Loss的权重。这能稳定训练过程防止模型陷入平庸解即预测出完全均匀的图。5. 性能提升的关键技巧与高级策略要在一个高水平的竞赛中取得好成绩仅仅有一个基础模型是远远不够的。以下是一些经过实战检验的关键技巧5.1 数据增强模拟多样化的观看条件视频数据增强比图像更复杂需要保持时间一致性。时空一致性增强对同一视频片段的所有帧应用相同的空间变换如相同的随机裁剪、水平翻转、颜色抖动亮度、对比度、饱和度。使用torchvision.transforms的RandomApply并确保参数在时序上一致。时序采样与抖动在训练时可以从长视频中随机抽取固定长度如32帧的片段。同时可以随机跳过一些帧降低帧率来模拟不同的视频播放速度增强模型对运动速度变化的鲁棒性。模拟噪声与压缩为了提升模型对真实网络视频可能经过压缩、有噪声的泛化能力可以随机添加高斯噪声、模拟JPEG压缩伪影或视频编码块效应。5.2 模型训练技巧与损失函数工程多尺度训练与测试在训练时将输入视频帧随机缩放到不同分辨率如192x192, 224x224, 256x256。在测试时对同一视频采用多种尺度进行预测然后将结果上采样到原尺寸进行平均多尺度集成能有效提升模型对不同分辨率输入的鲁棒性。深度监督在编码器-解码器结构的中间层也接上辅助的显著性预测头并用真实标签进行监督损失权重较小。这有助于梯度更好地回传缓解深层网络训练困难的问题并让模型学习到多尺度的显著性特征。更先进的损失函数组合除了KLD和CC还可以引入NSS Loss直接最大化预测图在真实注视点处的归一化值。SIM Loss直接最小化预测分布与真实分布之间的相似度1 - SIM。边缘保持损失鼓励显著性图的边缘与原始图像的边缘对齐避免预测图过于模糊。标签平滑与注视点扩散原始注视点是离散的直接使用可能导致模型过拟合。通常会用固定大小如与图像尺寸相关的高斯核对注视点进行平滑生成连续的密度图作为训练标签。高斯核的Sigma值是一个重要超参太大会使标签过于平滑太小则接近离散点。5.3 后处理与集成策略模型预测出的原始显著性图往往不够平滑或存在噪声。简单的后处理能带来立竿见影的效果高斯平滑对预测图进行轻微的高斯滤波sigma3~5可以平滑噪声使显著性区域更加连贯。中心偏置先验心理学研究表明人在观看画面时存在轻微的中央区域注视倾向。可以在最终的预测图上乘以一个中心加权的掩膜如二维高斯分布但权重不宜过大否则会抑制真正的显著性物体。模型集成这是竞赛中提升性能最有效的手段之一。可以训练多个不同架构的模型如CNN-LSTM, 3D CNN, Transformer或者同一架构不同初始化、不同数据增强策略下的模型。在测试时将它们对同一视频的预测结果进行平均或加权平均。集成能有效降低方差提高预测的稳定性和准确性。6. 实战中遇到的典型问题与排查实录在实际开发过程中你会遇到各种各样的问题。以下是我在多次实验中总结的一些常见“坑”及其解决方案。6.1 模型预测结果全图模糊或趋于均匀症状无论输入什么视频模型输出的显著性图都像是一层薄雾没有清晰的焦点区域CC和NSS指标极低。可能原因与排查损失函数失衡检查KLD Loss和CC Loss的权重。如果CC Loss权重过大在训练初期模型可能难以优化复杂的相关系数容易陷入输出常数图的局部最优解此时CC可能不为0但预测无意义。解决方案如前所述初期以KLD为主后期再增加CC权重。标签处理错误确认用于训练的密度图是否正确归一化为概率分布和为1。如果密度图所有值都极小或未归一化KLD Loss会失去意义。解决方案在数据加载器中打印几个样本的密度图检查其数值范围和总和。模型容量不足或梯度消失过于简单的模型可能无法捕捉复杂的显著性模式。解决方案使用更深的CNN主干如ResNet-50或尝试Transformer。检查中间层的激活值是否过小考虑添加BatchNorm层或使用残差连接。学习率过高过高的学习率可能导致优化过程在最优解附近震荡无法收敛。解决方案使用学习率预热Warmup和余弦退火Cosine Annealing调度器。6.2 过拟合在训练集上表现好验证集上差症状训练损失持续下降训练集指标优秀但验证集损失早早就停止下降甚至上升指标远低于训练集。可能原因与排查数据增强不足视频显著性数据有限模型极易记住训练样本。解决方案加强数据增强特别是时空一致性的裁剪、翻转、颜色扰动。可以尝试MixUp或CutMix等更高级的增强方法在视频上的变体。模型过于复杂参数量远大于训练数据量。解决方案增加Dropout层在LSTM或全连接层后使用权重衰减Weight Decay或者采用更轻量级的模型架构。训练时间过长在没有早停Early Stopping的情况下模型会对训练集过度优化。解决方案监控验证集损失当其在连续多个epoch不再改善时停止训练。6.3 预测图有“网格状”或“块状”伪影症状输出的显著性图看起来不自然有明显的棋盘格或块状图案。可能原因与排查转置卷积Deconvolution的副作用在解码器中使用转置卷积进行上采样时如果核大小和步长不匹配容易产生棋盘效应。解决方案将转置卷积替换为双线性上采样Upsampling后接常规卷积这是目前更推荐的做法正如我们示例模型中所用。最终层激活函数确保最终输出层使用Sigmoid激活函数将值约束在[0,1]区间而不是ReLU可能导致大量零值区域形成块状。6.4 时序建模失效预测结果帧间抖动剧烈症状模型对每一帧的预测是独立的相邻帧的显著性图变化突兀没有时间平滑性。可能原因与排查LSTM/Transformer未正确传递状态在训练和推理时确保对于一个视频序列LSTM的隐藏状态是在序列内部连续传递的而不是每帧重置。在示例模型中我们一次性输入整个片段batch_firstTrueLSTM会内部处理序列依赖。输入片段过短如果每次只输入单帧或极短的片段如2-3帧模型无法学习长时序依赖。解决方案增加输入的时间步长T如16, 32帧。缺少显式的时间平滑约束可以在损失函数中加入时间一致性损失例如鼓励相邻帧预测图之间的差异如L1或L2距离变小。loss_temporal torch.mean(torch.abs(pred[:, 1:] - pred[:, :-1]))并将其作为一个附加项加入总损失。7. 面向NTIRE竞赛的进阶优化方向如果你的目标是参与NTIRE这类顶级竞赛并取得名次那么在上述基础之上还需要进行更深入的探索和优化。7.1 探索更强大的主干网络与预训练权重Swin Transformer目前无疑是这个领域的霸主。尝试使用Swin-B、Swin-L甚至Swin-Huge作为视觉编码器。利用在大型数据集如ImageNet-22K上预训练的权重进行初始化能带来巨大的性能提升。视频理解预训练模型使用在大型视频数据集如Kinetics, Something-Something上预训练过的3D CNN或Video Transformer模型作为起点。这些模型已经学习了丰富的时空表征对其进行微调Fine-tuning比从头训练快得多效果也好得多。多模态预训练探索像CLIP这样的视觉-语言预训练模型。虽然CLIP是针对图像-文本对的但其视觉编码器提取的特征具有强大的语义信息。你可以用CLIP的视觉编码器来初始化你的空间特征提取部分或者将CLIP的特征作为额外的语义先验输入到模型中。7.2 设计复杂的多模态融合机制简单的特征拼接或相加可能不是最优的。可以设计更精细的融合模块跨模态注意力让视觉特征和音频特征通过注意力机制相互查询、键、值。例如视觉特征作为Query音频特征作为Key和Value这样视觉特征可以“询问”音频信息来增强自己。门控融合学习一个动态的门控权重来控制每个模态特征对最终融合结果的贡献程度。这能让模型根据当前内容自适应地选择相信视觉还是声音线索。分层融合在编码器的不同层级进行多模态融合。浅层融合低级特征如边缘、纹理深层融合高级语义特征。7.3 利用测试时增强与模型集成在最终的测试阶段这些策略能为你赢得关键的零点几个百分点。测试时增强对测试视频进行多种变换如水平翻转、多尺度缩放、小幅度的颜色调整对每个变换后的输入都进行预测然后将所有预测结果反变换回原尺寸后取平均。异质模型集成不要只集成同一种架构的模型。将基于CNN的、基于Transformer的、3D的和2D时序的模型都集成起来。多样性是集成学习效果好的关键。时间滑动窗口集成对于长视频使用重叠的时间滑动窗口进行多次预测对重叠区域的预测结果进行加权平均可以减少因片段划分带来的边界效应。参加NTIRE这样的竞赛就像一场马拉松。它考验的不仅仅是一个巧妙的模型想法更是对问题深刻的理解、扎实的工程实现能力、耐心的调参和大量计算资源的持续投入。从数据预处理到损失函数设计从模型架构选型到训练技巧每一个环节的细微改进都可能汇聚成最终排名的提升。最关键的还是动手实践在不断试错和迭代中积累属于自己的经验。当你看到自己的模型能够越来越准确地预测出人眼在复杂动态场景中的注视轨迹时那种成就感是无可替代的。