X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/5818b61929dbef0d50482028e99b2c96e13b6bbd..36f292ecceb8d5978bffcfce45b5ac804b5d9486:/src/ransac.py?ds=inline diff --git a/src/ransac.py b/src/ransac.py index 4908421..6557ea4 100644 --- a/src/ransac.py +++ b/src/ransac.py @@ -48,22 +48,27 @@ class Linear_model: score += min(d, dist) return score, cons + def remove(self, data): + self.data = list(set(self.data) - set(data)) + def iterate(model, distance): score = float("inf") consensual = model.initial() estimate = model.get(consensual) - new_score, consensual = model.score(estimate, distance) - while (new_score < score): - score = new_score - try: - estimate = model.get(consensual) - new_score, consensual = model.score(estimate, distance) - except NP.linalg.LinAlgError: - pass + new_score, new_consensual = model.score(estimate, distance) + if new_consensual != []: + while (new_score < score): + score, consensual = new_score, new_consensual + try: + estimate = model.get(consensual) + new_score, new_consensual = model.score(estimate, distance) + except (NP.linalg.LinAlgError): + pass return score, estimate, consensual -def estimate(data, dist, k, modelClass=Linear_model): - model = modelClass(data) +def estimate(data, dist, k, modelClass=Linear_model, model=None): + if not model: + model = modelClass(data) best = float("inf") estimate = None consensual = None @@ -76,9 +81,13 @@ def estimate(data, dist, k, modelClass=Linear_model): return estimate, consensual -def ransac_duo(data, dist, k, mk, modelClass=Linear_model): +def ransac_multi(m, data, dist, k, modelClass=Linear_model, model=None): + if not model: + model = modelClass(data) + ests = [] cons = [] - for i in xrange(mk): - model, cons = estimate(set(data) - set(cons), dist, k, modelClass) - return (model, cons), estimate(set(data) - set(cons), dist, k, modelClass) - + for i in xrange(m): + est, cons_new = estimate(None, dist, k, model=model) + model.remove(cons_new) + ests.append((est, cons_new)) + return ests