Сравните список истинных цветов с другим списком цветов - PullRequest
2 голосов
/ 23 июня 2019

У меня есть 2 массива / списки цветов. Один представляет фактические доминирующие цвета в изображении, другой представляет список цветов, которые алгоритм считает доминирующими цветами в изображении.

Я хочу сравнить 2 списка, чтобы увидеть, насколько * близок алгоритм к фактическому основному списку истинных цветов. * 2 цвета считаются близкими (одинаковыми), если евклидово расстояние между ними <= 25. </p>

Проблема в том, что 2 списка не обязательно будут одинаковой длины. И цвета в каждом списке не будут в любом порядке. Цвета всегда будут в цветовом пространстве CieLAB (cv2.COLOR_BGR2LAB).

Пример 2 списков, которые мне нужно сравнить по сходству. Обратите внимание, что они в разном порядке и разной длины списка. Но эти 2 считаются одинаковыми, потому что он нашел все цвета в истинности земли (плюс некоторые дополнительные), и все эти цвета находятся на расстоянии <= 25. </p>

ground_truth = [[76, 177, 34], [36, 28, 237], [204, 72, 63], [0, 242, 255]]
результаты = [[35, 29, 234], [200, 72, 63], [70, 177, 34], [0, 242, 250], [45,29,67], [3,90,52] ]

Я построил валидатор ниже, но я не уверен, правильно ли он? Любой совет о том, как реализовать мою цель выше?

def validator(algoTuner, result, ground_truth):
    # Score = How close the colours in result are to the colours in ground_truth

    # p = pairwise distance between result and ground_truth
    # hits = get all distances from p that are <= max_dist
    # score = float(len(hits)) / len(ground_truth)
    dists = cdist(result, ground_truth, 'euclidean')
    score = float(len(dists[ dists < 25 ])) / len(ground_truth)
    return score

Редактировать после ответа @ Накора, это будет более правильным? Помните, что алгоритм может найти больше цветов, чем в основной правде. Все, что имеет значение, - это алгоритм, который находит все правильные цвета в основной правде, любые дополнительные не влияют на оценку.

def validator(algoTuner, result, ground_truth, debug=False):
    dists = cdist(result, ground_truth, 'euclidean')
    correct_guesses = np.sum(dists<25, axis=1)
    correct_guesses = correct_guesses[ correct_guesses > 0 ]
    # score = correct_guesses.mean()
    score = float(correct_guesses.size) / len(ground_truth)

    if debug:
        print(len(correct_guesses))
        print(correct_guesses)
        print(score)
    return score

1 Ответ

0 голосов
/ 23 июня 2019

Я думаю, что часть, где вы рассчитываете счет, не верна. Вы подсчитываете количество элементов ниже 25 во всем мире. Но если я правильно понял, вы ищете, если для каждого цвета в ground_truth есть хотя бы один цвет в result, который находится на расстоянии менее 25 пунктов.

Если это так, то я бы изменил ваш валидатор:

def validator(algoTuner, result, ground_truth):
    # Score = How close the colours in result are to the colours in ground_truth

    # p = pairwise distance between result and ground_truth
    # hits = get all distances from p that are <= max_dist
    # score = float(len(hits)) / len(ground_truth)
    dists = cdist(result, ground_truth, 'euclidean')
    correct_guesses = np.sum(dists<25,axis=0)
    score = (correct_guesses>0).mean()
    return score

Возвращает пропорции цветов в ground_truth, которые также присутствуют в результате. В вашем примере оценка будет 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...