當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。