在处理高分辨率长视频时,视觉Transformer(ViT)和多模态大语言模型(MLLM)面临的核心挑战是计算资源的爆炸式增长。以4K分辨率(3840×2160像素)视频为例,按标准16×16分块策略,单帧将产生32,400个视觉令牌(token)。对于30fps的5分钟视频,总令牌数高达2.9亿个,这直接导致:
现有解决方案如均匀降采样(Uniform Sampling)或随机令牌丢弃(Random Token Dropping)存在明显缺陷。前者会丢失关键动作帧,后者则破坏空间连续性。我们通过实验发现,在UCF-101动作识别数据集上,这两种方法分别会导致12.7%和9.3%的准确率下降。
AutoGaze采用四级金字塔式编码结构:
python复制class MultiScaleEncoder(nn.Module):
def __init__(self):
super().__init__()
self.conv2d = nn.Conv2d(3, 192, kernel_size=16, stride=16) # 224x224→14x14
self.conv3d = nn.Conv3d(192, 192, kernel_size=(3,3,3), padding=(1,1,1))
def forward(self, x):
# x: (B,T,C,H,W)
patches = []
for scale in [32,64,112,224]:
resized = F.interpolate(x, size=(scale,scale))
p = self.conv2d(resized) # 提取多尺度特征
p = self.conv3d(p) # 时空特征融合
patches.append(p)
return patches # 4种尺度特征图
关键设计考量:
令牌选择过程采用马尔可夫决策过程(MDP)建模:
策略网络输出265维分布(对应4个尺度的总块数),使用Gumbel-Softmax实现可微分采样:
math复制π(a|s) = \text{softmax}((Q(s,a) + g)/τ), g∼Gumbel(0,1)
其中温度系数τ从1.0退火至0.01,逐步提升选择确定性。
NTP预训练阶段:
math复制L_{NTP} = \sum_{t=1}^T [\text{CE}(a_t^*,a_t) + λ|L_{recon}(t)-L_{target}|]
其中λ=0.3,L_target=0.7RL微调阶段:
采用Group-wise Relative Policy Optimization (GRPO)算法:
math复制A_t = \sum_{k=t}^T γ^{k-t}(r_k - b_k) - β\log\frac{π(a_t|s_t)}{π_{old}(a_t|s_t)}
重构网络基于VideoMAE改进,使用三组件混合损失:
python复制def reconstruction_loss(original, reconstructed):
l1 = F.l1_loss(original, reconstructed)
dino = F.mse_loss(dinov2(original), dinov2(reconstructed))
siglip = F.mse_loss(siglip2(original), siglip2(reconstructed))
return l1 + 0.3*dino + 0.3*siglip
实测表明,该组合在PSNR(28.6dB)和人工评估(MOS 4.2/5.0)上均优于单一损失函数。
在NVIDIA A100显卡上的测试结果:
| 模型类型 | 输入分辨率 | 原始FPS | AutoGaze FPS | 加速比 |
|---|---|---|---|---|
| ViT-Base | 256帧@224px | 12.3 | 234.6 | 19× |
| ViT-Large | 1024帧@4K | 0.8 | 8.2 | 10.3× |
| LLaMA-3+V | 5分钟长视频 | N/A | 实时 | - |
内存占用优化更为显著:处理1小时4K视频时,显存需求从48GB降至1.2GB。
在HLVid基准测试中的表现:
| 方法 | 准确率 | 令牌数/帧 | 相对SOTA |
|---|---|---|---|
| 密集采样 | 62.1% | 32,400 | - |
| 均匀采样 | 57.6% | 1,600 | ↓4.5% |
| TokenMerge | 60.3% | 8,100 | ↓1.8% |
| AutoGaze | 66.6% | 324-648 | ↑4.5% |
反常的精度提升源于:
采用环形缓冲区实现:
c++复制struct StreamingBuffer {
cudaEvent_t ready_event;
float* features[3]; // 三帧缓存
int current_idx;
void add_frame(float* new_frame) {
cudaMemcpyAsync(features[current_idx], new_frame,
size, cudaMemcpyDeviceToDevice);
cudaEventRecord(ready_event);
current_idx = (current_idx + 1) % 3;
}
};
配合CUDA Graph优化,使端到端延迟稳定在23ms/帧(4K分辨率)。
不同尺度的选择权重动态调整:
实现方式:
python复制def scale_selector(motion_score, text_score):
base_weights = [0.1, 0.3, 0.4, 0.2] # 32,64,112,224
if motion_score > 0.7:
return [0.4, 0.3, 0.2, 0.1]
elif text_score > 0.6:
return [0.05, 0.15, 0.3, 0.5]
else:
return base_weights
症状:物体边缘出现马赛克或模糊
解决方案:
症状:处理时间忽长忽短
优化措施:
在Zoom会议场景的实测效果:
在nuScenes数据集上的表现:
实际部署中发现:对远处交通标志(<50像素高),AutoGaze会自动分配更多令牌,使识别率提升7%。