当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Python skimage.measure.ransac用法及代码示例

用法:

skimage.measure.ransac(data, model_class, min_samples, residual_threshold, is_data_valid=None, is_model_valid=None, max_trials=100, stop_sample_num=inf, stop_residuals_sum=0, stop_probability=1, random_state=None, initial_inliers=None)

使用 RANSAC(随机样本一致性)算法将模型拟合到数据中。

RANSAC 是一种迭代算法,用于对来自完整数据集的内点子集的参数进行稳健估计。每次迭代执行以下任务:

  1. 从原始数据中选择min_samples随机样本,检查这组数据是否有效(见is_data_valid)。

  2. 将模型估计到随机子集 (model_cls.estimate(*data[random_subset]) 并检查估计的模型是否有效(参见is_model_valid)。

  3. 通过计算估计模型的残差 (model_cls.residuals(*data)) 将所有数据分类为内点或异常点 - 所有残差小于 residual_threshold 的数据样本都被视为内点。

  4. 如果内部样本数最大,则将估计模型保存为最佳模型。如果当前估计的模型具有相同数量的内点,则仅当残差之和较少时才将其视为最佳模型。

这些步骤将执行最大次数或直到满足特殊停止标准之一。使用先前确定的最佳模型的所有内部样本来估计最终模型。

参数

data[list, tuple of] (N, ...) 数组

模型适合的数据集,其中 N 是数据点的数量,其余维度取决于模型要求。如果模型类需要多个输入数据数组(例如 skimage.transform.AffineTransform 的源坐标和目标坐标),则可以选择将它们作为元组或列表传递。请注意,在这种情况下,函数 estimate(*data)residuals(*data)is_model_valid(model, *random_data)is_data_valid(*random_data) 都必须将每个数据数组作为单独的参数。

model_class对象

具有以下对象方法的对象:

  • success = estimate(*data)

  • residuals(*data)

其中success表示模型估计是否成功(True或None表示成功,False表示失败)。

min_samplesint 在 (0, N) 范围内

适合模型的最小数据点数。

residual_threshold浮点数大于 0

数据点被分类为内点的最大距离。

is_data_valid函数,可选

在模型拟合之前使用随机选择的数据调用此函数:is_data_valid(*random_data)。

is_model_valid函数,可选

使用估计的模型和随机选择的数据调用此函数:is_model_valid(model, *random_data), 。

max_trialsint 可选

随机样本选择的最大迭代次数。

stop_sample_numint 可选

如果至少找到此数量的内点,则停止迭代。

stop_residuals_sum浮点数,可选

如果残差之和小于或等于此阈值,则停止迭代。

stop_probability在 [0, 1] 范围内浮点数,可选

如果使用 probability >= stop_probability 对至少一组 outlier-free 训练数据进行采样,则 RANSAC 迭代停止,具体取决于当前最佳模型的内点比率和试验次数。这需要生成至少 N 个样本(试验):

N >= log(1 - 概率) /log(1 - e**m)

其中概率(置信度)通常设置为较高的值,例如 0.99,e 是当前的 inliers w.r.t 分数。样本总数,m为min_samples值。

random_state{无,int numpy.random.Generator },可选

如果random_state是没有的numpy.random.Generator使用单例。如果random_state是一个int 一个新的Generator使用实例,播种random_state.如果random_state已经是一个Generator实例然后使用该实例。

initial_inliersarray-like of bool, shape (N,), optional

模型估计的初始样本选择

返回

model对象

具有最大共识集的最佳模型。

inliers(N, ) 数组

分类为 True 的内点的布尔掩码。

参考

1

“RANSAC”, Wikipedia, https://en.wikipedia.org/wiki/RANSAC

例子

生成没有倾斜的椭圆数据并添加噪声:

>>> t = np.linspace(0, 2 * np.pi, 50)
>>> xc, yc = 20, 30
>>> a, b = 5, 10
>>> x = xc + a * np.cos(t)
>>> y = yc + b * np.sin(t)
>>> data = np.column_stack([x, y])
>>> rng = np.random.default_rng(203560)  # do not copy this value
>>> data += rng.normal(size=data.shape)

添加一些错误数据:

>>> data[0] = (100, 100)
>>> data[1] = (110, 120)
>>> data[2] = (120, 130)
>>> data[3] = (140, 130)

使用所有可用数据估计椭圆模型:

>>> model = EllipseModel()
>>> model.estimate(data)
True
>>> np.round(model.params)  
array([ 72.,  75.,  77.,  14.,   1.])

使用 RANSAC 估计椭圆模型:

>>> ransac_model, inliers = ransac(data, EllipseModel, 20, 3, max_trials=50)
>>> abs(np.round(ransac_model.params))
array([20., 30., 10.,  6.,  2.])
>>> inliers  
array([False, False, False, False,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True], dtype=bool)
>>> sum(inliers) > 40
True

RANSAC 可用于稳健地估计几何变换。在本节中,我们还将展示如何使用总样本的比例,而不是绝对数量。

>>> from skimage.transform import SimilarityTransform
>>> rng = np.random.default_rng()
>>> src = 100 * rng.random((50, 2))
>>> model0 = SimilarityTransform(scale=0.5, rotation=1,
...                              translation=(10, 20))
>>> dst = model0(src)
>>> dst[0] = (10000, 10000)
>>> dst[1] = (-100, 100)
>>> dst[2] = (50, 50)
>>> ratio = 0.5  # use half of the samples
>>> min_samples = int(ratio * len(src))
>>> model, inliers = ransac((src, dst), SimilarityTransform, min_samples,
...                         10,
...                         initial_inliers=np.ones(len(src), dtype=bool))
>>> inliers  
array([False, False, False,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True])

相关用法


注:本文由纯净天空筛选整理自scikit-image.org大神的英文原创作品 skimage.measure.ransac。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。