У меня есть 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