SampleConsensusPrerejective(分机 RANSAC)是如何工作的?
How does SampleConsensusPrerejective (ext. RANSAC) really work?
我用的是pcl的SampleConsensusPrerejective方法,效果很好。我按照教程中的描述使用它。但是我并不完全理解 RANSAC 算法是如何工作的。使用 FPFH 计算特征。
据我了解,该算法从输入云和目标云中获取随机特征,并将输入云投影到目标云的计算姿势上。然后计算 consensus set
并经过一些迭代后采用最大 consensus set
的姿势。到目前为止一切顺利。
但是如何比较这些特征和计算姿势呢?我还不明白基于四边形点 <α, ϕ, θ, d>
的特征直方图有何真正的帮助。采摘后到底发生了什么来自输入和目标云的三个示例特征?
谁能用简单的话解释一下接下来会发生什么?非常感谢!
我不太熟悉这个库,但我可以解释 RANSAC 的一般作用,并且可以提供一些关于他们的算法可能在做什么的想法,因为我在相关优化算法方面有很多经验。
RANSAC 是一种非常通用的优化算法,旨在在存在异常值的情况下找到解决方案。想象一下,给定一个线性方程 a*x_i+b=y_i
,您需要针对给定的 x_i
和 y_i
求出 a
和 b
。通常简单的最小二乘法可以解决问题,但在存在离群值的情况下,最小二乘法会严重失败 - 导致完全错误的解决方案。
使用 RANSAC one one 可以取两个随机索引 i,j
找到最好的 a
和 b
,画线并检查给定的线与点集的近似程度 (x_i,y_i)
。然后在一系列尝试之后,您选择最好的一个并将其称为解决方案,或者给出最佳样本集 select 总内点及其解决方案,并与它们进行最佳拟合。这种方法应该在给定足够样本的情况下过滤掉任何异常值,否则会导致失败 - 只需根据常识检查最终结果即可。
也可以玩"how well the line approximates the set of points"。用户决定标准。最大化给定阈值的异常值或最小化中值误差。只要有意义就行。
您可以将 RANSAC 应用于几乎任何优化过程,给定误差函数和优化机制。
他们的优化是如何进行的?我不知道。询问他们的开发人员,阅读他们的代码或文档。但我可以为您提供一些想法。
给定原始云中的特征点 (A,B,C)
和目标云中的三个匹配特征 (X,Y,Z)
可以确定将 (A,B,C)
映射到 (X,Y,Z)
- 如果它们不完全匹配,则进行最佳匹配。如果您还考虑负正交变换(反射+旋转+移位)而不仅仅是正交变换,则需要四个点。这只是一个经典的线性代数。在任何情况下,四点可能更可取,因为数据肯定有噪声,因此解决方案的准确性更高。
找到候选解决方案后,可以匹配整个云,看看它们是否适合给定的解决方案 - 这是误差函数(查看它们的实现以查看确切的标准)。
如果您只是将特征 A、B、C、X、Y、Z 随机随机化,您最终会找到解决方案,但这将花费大量时间,使其变得不切实际。因此,我相信他们有一些方法可以缩小所需的测试数量。比如说,如果他们有一个函数 f
,可能是一个非常错误的函数,原始云中的每个特征都适合目标云中的匹配。然后你可以简单地检查点集 (A,B,C)
与 (f(A),f(B),f(C))
。但是他们可能有一些更复杂和更棘手的东西来获得更好的稳健性。
希望它能让您对此类算法有所了解。
我用的是pcl的SampleConsensusPrerejective方法,效果很好。我按照教程中的描述使用它。但是我并不完全理解 RANSAC 算法是如何工作的。使用 FPFH 计算特征。
据我了解,该算法从输入云和目标云中获取随机特征,并将输入云投影到目标云的计算姿势上。然后计算 consensus set
并经过一些迭代后采用最大 consensus set
的姿势。到目前为止一切顺利。
但是如何比较这些特征和计算姿势呢?我还不明白基于四边形点 <α, ϕ, θ, d>
的特征直方图有何真正的帮助。采摘后到底发生了什么来自输入和目标云的三个示例特征?
谁能用简单的话解释一下接下来会发生什么?非常感谢!
我不太熟悉这个库,但我可以解释 RANSAC 的一般作用,并且可以提供一些关于他们的算法可能在做什么的想法,因为我在相关优化算法方面有很多经验。
RANSAC 是一种非常通用的优化算法,旨在在存在异常值的情况下找到解决方案。想象一下,给定一个线性方程 a*x_i+b=y_i
,您需要针对给定的 x_i
和 y_i
求出 a
和 b
。通常简单的最小二乘法可以解决问题,但在存在离群值的情况下,最小二乘法会严重失败 - 导致完全错误的解决方案。
使用 RANSAC one one 可以取两个随机索引 i,j
找到最好的 a
和 b
,画线并检查给定的线与点集的近似程度 (x_i,y_i)
。然后在一系列尝试之后,您选择最好的一个并将其称为解决方案,或者给出最佳样本集 select 总内点及其解决方案,并与它们进行最佳拟合。这种方法应该在给定足够样本的情况下过滤掉任何异常值,否则会导致失败 - 只需根据常识检查最终结果即可。
也可以玩"how well the line approximates the set of points"。用户决定标准。最大化给定阈值的异常值或最小化中值误差。只要有意义就行。
您可以将 RANSAC 应用于几乎任何优化过程,给定误差函数和优化机制。
他们的优化是如何进行的?我不知道。询问他们的开发人员,阅读他们的代码或文档。但我可以为您提供一些想法。
给定原始云中的特征点 (A,B,C)
和目标云中的三个匹配特征 (X,Y,Z)
可以确定将 (A,B,C)
映射到 (X,Y,Z)
- 如果它们不完全匹配,则进行最佳匹配。如果您还考虑负正交变换(反射+旋转+移位)而不仅仅是正交变换,则需要四个点。这只是一个经典的线性代数。在任何情况下,四点可能更可取,因为数据肯定有噪声,因此解决方案的准确性更高。
找到候选解决方案后,可以匹配整个云,看看它们是否适合给定的解决方案 - 这是误差函数(查看它们的实现以查看确切的标准)。
如果您只是将特征 A、B、C、X、Y、Z 随机随机化,您最终会找到解决方案,但这将花费大量时间,使其变得不切实际。因此,我相信他们有一些方法可以缩小所需的测试数量。比如说,如果他们有一个函数 f
,可能是一个非常错误的函数,原始云中的每个特征都适合目标云中的匹配。然后你可以简单地检查点集 (A,B,C)
与 (f(A),f(B),f(C))
。但是他们可能有一些更复杂和更棘手的东西来获得更好的稳健性。
希望它能让您对此类算法有所了解。