模型换个拍摄角度就废了:训练数据和上线场景不是一回事
问题
我之前训好一个目标检测模型,在老环境下用得好好的。后来把摄像头位置换了一版(机位、俯仰角都调了,为了覆盖原来拍不到的盲区),再拿新角度的画面去跑,结果一塌糊涂。
现象
我抽样挑了几个新角度的白天画面,各三四十张,用置信度阈值 0.25 去推理,检出率只有 6% 到 17%——也就是说模型基本认不出目标了。原来靠模型自动出框来标数据的路子直接走不通,整个前提崩了。
怎么解决
说白了就一句话:模型只在它训练时见过的那种画面分布上靠谱。换了个拍摄角度,目标在画面里的位置、大小、背景全变了,虽然还是同一个东西,模型没见过这个新分布,就抓瞎。
认清楚这点之后,做法就清楚了:
- 重新采同一场景的数据,从头训。 新角度的画面得自己采一批、自己标,不能指望旧模型迁移。
- 评估集必须和上线场景一致。 我顺手定了个规矩:验证集一定要从新角度按”角度 + 时间”切出来,绝对不能把新旧角度的数据混在一起随机分。混在一起的话,旧角度那部分模型认得,验证准确率就好看,但上线跑的是新角度,实际一塌糊涂——指标虚高,骗自己。
另外还有个坑:有一批”别的相机拍的”素材(第一视角、不同镜头),本来想顺手混进训练增广一下。但部署场景是唯一固定的那几个机位,这批素材的相机、视角、背景全不一样,推理时根本不会出现,属于典型的场景外数据。混进去容易教偏。结论是不混主训练集,真要在那个域跑再单独训。
结论
- 训练时见过的场景和上线实际跑的场景不是一回事。换拍摄角度、换相机,哪怕拍的是同一个目标,模型也可能直接报废,得重采同一场景的数据从头训。
- 验证集要和部署场景对齐,不能图省事把新旧数据混着分;指标好看但场景不对,上线必翻车。
- 来源不一样的素材别随便当增广塞进去,场景不对反而教坏模型。