HeadlinesBriefing favicon HeadlinesBriefing.com

N平方披萨问题:3D扫描匹配中的内存陷阱

Towards Data Science •
×

一个12英寸的披萨并不是比8英寸披萨多一半的披萨。它是2.25倍。这是因为披萨的面积遵循其半径的平方。人们对面积,或任何比其线性边界增长更快的事物,通常直觉很差。这就是为什么披萨店按直径定价,而顾客总是可靠地购买他们吃不完的披萨。同样的直觉失误在一个客户的3D扫描匹配管道中存在了近一年。它使他们在队列中每个工作节点上的内存翻倍。在评分代码的某处,有一个每个元素对应一行和一列的表。每个阅读该代码的人都看到了一个列表,而他们本应看到一个正方形。该管道对齐两个表面扫描,将一个从另一个中减去,并检查剩余的部分。如果两个扫描是同一物体,那么剩余部分就是空的。一类扫描仪有一个已知的故障模式:当物体有平面时,扫描仪有时会记录一个浅金字塔。如果留在数据中,这些金字塔看起来像真实的几何差异,并导致真正的匹配被拒绝。因此,在我们将两个项目标记为匹配之前,我们检查剩余的壳是否呈金字塔形。如果是,金字塔部分将从物体中移除,而不是被视为匹配的证据。检测金字塔意味着找到其平坦的底面,评分器通过查看表面方向来找到底面。网格上的每个三角形都有一个法线(垂直于三角形平面的方向单位),而平坦底面的三角形都大致面向同一方向。评分器将法线分组为簇。然后它测量每个簇的分散程度。最紧密的簇是底面候选,如果其分散度低于阈值,则底面被接受。分散度就是平方所在之处。它被定义为簇中每对法线之间余弦的方差。这是一个完全合理的分散度度量,余弦经常被用来比较向量,因为它们快速、易于计算且尺度不变。然而,对于每个簇,该调用构建了一个N * N的余弦表。如果簇很大,例如在平坦的重叠表面上,这会产生一个密集的表,可能会比较每个对应的法线。在最坏的情况下,该表变成一个方阵。这是一个问题,因为它需要大量内存,而在最坏的情况下,所需内存是单次余弦比较所需内存的N^2倍。这意味着什么在大多数比较中N很小,没有人注意到。同一物体的两个扫描之间的剩余壳很薄。它碎裂成许多小块,每块有几百个法线。几百的平方不算什么。例外的情况是管道最想正确处理的情况:由不同扫描仪拍摄的同一物体的两个扫描。减法留下一个连续的薄壳,而不是许多壳。更糟的是,壳表面近乎平行。这导致了一个簇和一个高相似度的密集分散表。每个条目8字节,一个包含数万个法线的簇的表本身就达数GB。其中两个表,加上库沿途获取的工作副本,在我们分析的最差比较中达到了大约15GB。那一次比较为队列中每个工作节点设定了内存下限。每个对齐任务都被分配了一个足够大的槽位来度过它,大约是典型任务所需的两倍。