一帧标得准,和连续三千帧标得对,是两件完全不同的事。这一页讲清楚 4D 到底多了什么, 以及它为什么比逐帧 3D 贵得多、也值钱得多。
一个团队标了 1000 帧的车,每帧一个 3D 框,标得很准,质检也过了。
下游拿去做轨迹预测,效果很差。
不是标注不准。是下游不知道该拿哪个框去减哪个框。
预测一件事的前提是,你得先知道那是一个东西。 而逐帧标注给你的是 1000 个互不相干的框。
| 顺序 | 身份 | |
|---|---|---|
| 是什么 | 谁在前谁在后,一个全序 | 谁和谁是一伙的,一个分组 |
| 怎么来的 | 帧号和时间戳,白送 | 要判断,人或算法去做 |
| 能回答 | "这帧有什么" | "这辆车出现过几次" |
问一句:"这辆车一共出现了几次?"
只有帧号和框的时候答不了。有了身份才答得了。
顺序回答不了"几个",身份才能。
打个比方,一个花名册。顺序是行号,纸本来就一页一页,白送。 身份是每行写的是哪个人,要填。一千行只有行号没有名字,你知道有一千条记录, 但不知道张三来了几次。
帧号(顺序,免费) 几何 身份(要判断)
1 ┌──┐ A
2 ┌──┐ A
3 ┌──┐ A
...
500 ┌──┐ 这里换了一辆车? A 还是 B
501 ┌──┐ ?
在帧 500 那里,顺序完全正常,帧号连续,时间戳连续。 而身份可能已经断了一轮。
顺序是连续的,身份不是。顺序永远不会告诉你这里换人了。
天真的读法是:3D 是三个空间维度,4D 就是再加时间。但逐帧的 3D 框本来就带时间戳。
| 3D 标注 | 4D 标注 | |
|---|---|---|
| 时间戳 | ✅ 有 | ✅ 有,一样 |
| 物体身份 | ❌ 没有 | ✅ 写进数据里 |
| 产物 | 一堆孤立的点 | 若干条轨迹 |
一叠照片,每张背面写着拍摄时间,那是 3D 标注。
一段视频,帧之间有对应关系,那是 4D 标注。
照片也有时间戳。但照片里这个人是谁,要靠你自己认。
| 错误 | 影响范围 | 怎么修 |
|---|---|---|
| 框画歪了 | 那一帧 | 重画那一个框 |
| 身份错了 | 那条轨迹上的所有帧 | 要切开重拼。如果两条轨迹交换了,要同时改两边 |
一个身份错误可以污染三百帧。而且它很难局部修。
框歪了,你一眼看得出来。身份断了,那一帧的框看起来完全正常。
只有把时间轴拉长看,才看得出轨迹断了。
这跟前面讲的那些静默错误是同一类:坏了,但没人报警。
帧 100: ┌──┐ A
帧 101: 被树挡住,什么都没有
帧 102: 还是被挡住
帧 103: ┌──┐ A?还是另一辆?
看得见的时候判断同一,很容易。长得一样,位置连着。
难的是中间那两帧什么都没看见,凭什么说 103 出来的就是 100 的那辆。
它可能错。它可能超车走了,103 出来的是另一辆;也可能变道了,位置跳了一下。
所以 4D 标注的难点,不是看得见时判断同一,是看不见时还敢不敢判断同一。
这也意味着身份这个东西必须满足三条:连续,一个物体的一生是一条不断的线; 唯一,同一帧里一个物体只能有一个号;传递,1 和 2 是同一个、2 和 3 是同一个,那 1 和 3 也是。
标的时候人只需要判断相邻两帧是不是同一个,但系统必须保证全局这三条。 这就是为什么号的分配在工具里有一套生命周期:出现、消失、被遮挡、重新出现。
| # | 收益 | 说明 |
|---|---|---|
| ① | 省人工 | 标一帧,其他帧可以推演或者插值 |
| ② | 下游可用 | 轨迹、速度、意图、交互,全都建立在身份上 |
| ③ | 可质检 | 有了身份,才能检查"同一辆车的框有没有跳"。没有身份,连"抖动"都定义不了 |
第三条容易被忽略。它是一个副产品:一旦有了身份,质量检查才有一个可以衡量的对象。
4D 多的不是时间戳,是时间上的身份。它把一堆孤立的点接成线。
这个转换让产物从"一帧里有什么"变成"一个物体的一生",下游才拿得动。
代价是错误的影响范围从一帧变成一条轨迹,而且它看起来是正常的。