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 自然就会稳很多。
参考资料: