🔍搜索⌘K

水面上的倒影,我一个框都没敢画

问题

标夜景数据的时候碰到个麻烦:夜里摄像头打红外,画面里的水会反光,目标在水面上的实体和它在水面下的倒影经常贴在一起,甚至有时候倒影比实体还清楚。

按理说看到目标就框。但这里有两个几乎连在一起的东西,只框一个到底该框哪个?我一开始的判断是”哪个清楚框哪个”,后来发现这判断标准本身就是错的。

现象

如果按”清楚的那个框”来标,会出两个具体的问题。

一是算出来的位移会错。程序判断目标转没转,靠的是拿检测框的位置算位移:内侧竖边取横坐标,框的中点取纵坐标。框对了,算出来的位移才准。

而倒影就在实体的正下方。要是框到倒影上,位置整体偏了一截,算出来的位移跟着偏,转没转的判断就直接歪了——这个检测的整套逻辑会跟着崩。

二是双臂的场景会被搅乱。有个机位上有两根臂,会做双臂相位判断。要是实体和倒影各画一个框,本来两根臂就变成”四个臂”,相位判断被搅在一起,也就不准了。

更麻烦的是模型会学歪。夜景里倒影比实体还清楚,如果连着夜景数据一起标、一视同仁,模型就会学到”倒影 = 目标”。上线以后只要水面有点反光、或者旁边有栏杆反着光,误检就泛滥了。

怎么解决

改成按位置判断,不看清晰度:只框水面之上那个实体,倒影不管多清楚都不框。

判据从”清楚与否”换成”在水线之上还是之下”,没有模糊空间。而且夜里倒影可能比实体还清楚这条,恰恰说明清晰度不能当判据。

边界情况也顺手定了:

  • 实体和倒影贴得太近、几乎分不开:只框实体,宁可框小一点,也不要把倒影包进去;
  • 只能看到倒影、实体完全辨认不出来:一点都不框,当作负样本。但这种要单独记下来报出去——这属于异常工况(说明臂压得特别低),如果这类画面很多,那部署那边也是个隐患;
  • 边缘只露出一截:只要是实体,照样框。

同理不框的还有:对岸的绿化带、水面反光、栏杆和桥架的结构、云台转动时的运动模糊、雨雪打出来的水波纹。

结论

画框的判据要用位置这种有明确边界的东西,不要用”清楚不清楚”这种听起来合理但会骗人的主观判断——夜里倒影比实体还清楚是真实存在的,一按清晰度判就全乱了。

而且一条标注纪律背后一般都有原因,不是无所谓的事。这里是三件事绑在一起:框的位置直接喂给位移计算、框的个数直接喂给双臂相位判断、标注的口径直接喂给模型学到的东西。标错一帧,图省事的代价比一开始多花的那点时间大得多。