构建驾驶视频理解模型,掌握 3D Conv/TimeSformer 视频编码、时序池化、Video-LLM 架构与流式处理。
第2章的 ViT 将图像分割为空间 patches。视频的挑战在于增加了时间维度:
图像: (C, H, W) → Patch: (patch_size, patch_size) → N = (H/P) × (W/P) tokens
视频: (C, T, H, W) → Patch: (patch_size_t, patch_size, patch_size) → N = (T/Pt) × (H/P) × (W/P) tokens
例如 16帧 224×224 视频,patch_size=16, patch_size_t=2:
- T' = 16/2 = 8 时间块
- H' = W' = 14 空间块
- 共计 8×14×14 = 1568 个时空 tokens
self.proj = nn.Conv3d(
3, hidden_dim,
kernel_size=(patch_size_t, patch_size, patch_size),
stride=(patch_size_t, patch_size, patch_size),
)
全时空 attention 复杂度为 O((T×N)²),对于视频完全不可行。
TimeSformer 将注意力分解为:
- 空间注意力 (S-Attn): 每帧内 patch 之间的 attention → O(T × N²)
- 时间注意力 (T-Attn): 每个空间位置跨帧的 attention → O(N × T²)
- S-Attn: "这一帧里,哪些区域是相关的?"
- T-Attn: "这个位置上的物体,在不同帧间如何变化?"
- 两者交替执行,信息逐步融合
| 方案 | 复杂度 | T=8, N=196 |
|---|---|---|
| Joint | O(T²N²) | ~2.5M ops |
| Divided | O(TN² + NT²) | ~320K ops |
| 加速比 | — | ~8x |
1568 个时空 tokens + LLM 的文本 tokens = 序列太长。需要压缩。
| 策略 | 输出长度 | 适用场景 |
|---|---|---|
| Mean Pool | 1 | 简单场景分类 |
| Max Pool | 1 | 关键帧检测 |
| Token Merge | N/r | 需要保留部分时序信息 |
| Q-Former | K (learned) | 自适应关键信息提取 |
| Last Frame | 64 | 取最后帧(最近信息) |
- 变道、转弯、刹车、加速、停车
- "变道发生在第30-70帧"
- "What happened between frame 30 and 70?"
- "Is the driver changing lanes safely?"
- 滑动窗口(8-16帧 buffer)
- 逐帧/逐片段增量处理
- 适合车载部署
1. ✅ 3D Patch Embedding: 时空 tokenization
2. ✅ Divided Attention: O(TN²+NT²) 高效时空注意力
3. ✅ 时序池化: 5种策略压缩时序 token
4. ✅ Video-LLM: 视频+语言的完整 pipeline
5. ✅ Temporal Grounding: 定位行为起止帧
6. ✅ 实时流处理: 滑动窗口车载部署
下一章:BEV 感知 — 多相机融合的 3D 空间理解