DINOv3 与自车 Mask:为什么它在车身强反光时更稳

最近又在看 DINOv3,顺手拿它做了一些自车 mask 相关的观察。一个很直观的感受是:它在识别自车区域时,尤其是车身反光比较严重的情况下,表现比我预期得更稳。

这件事挺有意思。因为“自车 mask”听起来像个不难的问题:车是固定的,摄像头也是固定的,按理说应该很好分。
但真到实际图像里,最难缠的恰恰不是几何,而是外观变化——尤其是反光。

自车 mask 为什么重要

在自动驾驶或者车载视觉系统里,自车 mask 往往不是最显眼的任务,但它很基础。

它通常会影响很多下游模块:

  • 去掉自车区域,避免 detection / segmentation 被车头、引擎盖、后视镜干扰
  • 做 occupancy、free space 或路面理解时,先把“本车本体”从可行驶区域中排除
  • 给多相机拼接、鸟瞰变换、数据清洗提供稳定先验
  • 在生成式或编辑类任务里,把自车区域单独隔离出来

所以自车 mask 做得不好,很多后续模块都会被污染。
而这个问题最大的挑战之一,就是车身表面的镜面反射。

反光为什么这么难

如果只是普通的语义分割模型,面对自车区域时通常会学到一套很强的“外观模板”:

  • 某些固定位置经常出现车头边缘
  • 某种颜色、材质、阴影很像引擎盖
  • 某块区域总是伴随挡风玻璃或雨刷

这种学习方式在大多数时候没问题,但一旦车身反光很强,事情就变了。

比如你会看到这些情况:

  • 蓝天白云直接映在车盖上,纹理看起来像“天空”
  • 路边树影映在车身上,局部像“植被”或“阴影区域”
  • 高楼玻璃或周围车辆反射到车门上,边界非常碎
  • 太阳直射下出现高亮饱和区域,局部纹理几乎消失

这时如果模型主要依赖纹理或颜色统计,就很容易犯错。
它看到的不是“这是一块自车表面”,而更像“这里长得像天空/树/建筑/路面”。

也就是说,specular reflection 会把语义分割里的“材质外观一致性”打碎。

DINOv3 为什么让我觉得不一样

先说结论:我不觉得 DINOv3 的优势来自它“更会分割”,而是它更会形成稳定的视觉表征。

DINOv3 本身不是一个专门为 semantic segmentation 设计的头部模型,它更像一个大规模自监督视觉 backbone。它的核心价值在于:在没有人工标签的前提下,用超大规模图像数据训练出非常强的通用视觉特征,而且特别强调 dense feature 的质量。

这点很关键。

以前很多 foundation model 的 global feature 很强,拿来做分类、检索不错,但一落到 patch-level 的 dense task 上就未必稳定。
DINOv3 这次一个重要改进,就是专门处理了长时间大规模训练后 dense feature 容易退化的问题。论文里提出的 Gram anchoring,本质上是在约束 patch 与 patch 之间的相对结构,不让局部表征在训练后期“糊掉”。

换句话说,它不是只关心“整张图像像什么”,也很关心“图里这一小块和周围那些小块之间,到底是什么关系”。

而自车 mask,恰恰是一个很吃这种能力的任务。

为什么强反光场景下它更稳

我现在比较相信有几个原因叠在一起。

1. 它更不容易被局部纹理骗走

反光最麻烦的一点,是会把别的语义纹理投到自车表面上。
如果模型过于依赖局部颜色和纹理,就容易把“映在车上的天空”真当成天空。

DINOv3 这类大规模自监督模型往往学到的是更抽象的视觉一致性:
它不会只盯着某一小块的表面纹理,还会结合周围 patch 的关系、整体轮廓、上下文位置去理解这块区域到底属于什么。

所以哪怕引擎盖上反出一片树影,它也更可能判断:这是“车的一部分,上面有反射”,而不是“真的有一棵树长在这里”。

2. 它的 dense feature 保持得更好

如果 dense feature 不稳定,模型在边界附近特别容易出问题。
自车区域本来就常出现在画面边缘,而且经常伴随高亮、遮挡、玻璃、金属边框,这些地方最需要 patch-level 的细粒度判别。

DINOv3 在这方面值得注意的地方,不是简单“scale 更大”,而是它明确在优化局部表示不要退化
这会直接影响 mask 的连贯性:该连起来的区域能连起来,该断开的边界不容易糊成一片。

3. 自监督预训练让它见过更多“脏外观”

监督式分割模型常常受限于标注集分布。
如果训练数据里车身反光不够多、天气分布不够杂、曝光情况不够极端,模型很容易默认“自车应该长这样”。

而 DINOv3 这种大规模自监督训练,本质上是在非常杂乱、非常开放的数据分布上学“视觉不变量”。
它未必真的见过你的那台车、那个相机位、那个反光角度,但它更可能见过大量:

  • 镜面材质
  • 金属表面
  • 强曝光与阴影
  • 复杂背景投影
  • 不同天气和时间条件

这种预训练带来的不是任务标签知识,而是外观变化下仍保持语义一致的能力

4. 它更像在识别“区域身份”,而不是“表面颜色”

我现在越来越觉得,自车 mask 这个任务如果只从 segmentation 角度理解,会低估它的难点。
它本质上其实更像在做一件事:

判断这块像素到底是不是“属于本车本体”的区域。

这不是一个纯纹理问题,而是一个“区域身份识别”问题。
而 foundation model 的强项之一,恰恰是学这种相对稳定的身份表征。

反光会改变 appearance,但通常不会真正改变“它属于哪一类区域”这件事。
如果模型学到的是 identity-level representation,而不是 texture template,那么它自然就更稳。

这对自动驾驶场景意味着什么

这件事对我最大的启发是:有些看起来很“传统”的视觉子任务,可能正在从 task-specific model 转向 foundation feature + lightweight head 的范式。

自车 mask 以前很容易被当成一个“小 segmentation 任务”:

  • 找一批标注
  • 训练一个小 UNet / DeepLab
  • 在固定车上做适配

这当然能 work,但它很可能对 domain change 很敏感。
一旦换车型、换相机、换天气、换车漆颜色、换曝光策略,问题就会冒出来。

而如果 backbone 本身具备更强的鲁棒表征,事情会不一样:

  • 少量标注就可能够用
  • 车身外观变化不再那么致命
  • 跨天气、跨时间、跨场景的泛化会更自然
  • 后续还可以把同一套 feature 复用到别的 dense task

这比单独把一个 segmentation 小任务不断打补丁,更像一个长期可扩展的方向。

当然,DINOv3 也不是银弹

说它表现更好,不代表这个问题已经解决了。

几个现实限制还是在:

  • 极端高光饱和时,图像本身信息就已经丢失,任何模型都会难
  • 多相机畸变和边缘模糊仍然会影响 mask 边界
  • 不同车体结构差异很大,跨平台泛化未必自动成立
  • 如果部署预算很紧,DINOv3 这类 backbone 的推理成本也需要仔细衡量

所以更合理的理解不是“DINOv3 可以直接替代所有自车 mask 方案”,而是:

它把这个任务的鲁棒性上限往上抬了一截,尤其是在传统外观先验最容易失效的场景里。

我的想法

以前我们很容易把自车 mask 视为一个工程细节:画个多边形、训个小模型、做点后处理,差不多就够了。
但如果你真的在复杂天气、复杂光照、复杂反射下看效果,就会发现这其实是一个挺考验表征质量的问题。

而 DINOv3 让我重新意识到一件事:
很多 dense prediction 问题的上限,不一定先被 head 决定,而更可能先被 backbone 的局部表征质量决定。

对“车身强反光”这种场景尤其如此。因为这里真正难的不是分割算子本身,而是模型能不能在 appearance 被扰乱时,仍然抓住区域的真实身份。

如果它能做到这一点,自车 mask 自然就会稳很多。


参考资料: