Оптимизация производительности для расчета евклидова расстояния между двумя изображениями

Я реализовал алгоритм k-ближайших соседей в python для классификации некоторых случайно выбранных изображений из mnist. база данных. Однако я обнаружил, что моя функция расстояния работает довольно медленно: анализ 10 тестовых изображений по сравнению с тренировочным набором из 10 тыс. изображений занимает около 2 минут. Изображения имеют разрешение 28x28 пикселей. Поскольку я новичок в python, у меня возникло ощущение, что это может быть быстрее. Предполагается, что функция вычисляет евклидово расстояние между двумя изображениями в градациях серого одинакового размера.

def calculateDistance(image1, image2):
    distance = 0
    for i in range(len(image1)):
        for j in range(len(image1)):
            distance += math.pow((image1[i][j]-image2[i][j]),2)
    distance = numpy.sqrt(distance)
    return distance

person wodzu    schedule 16.10.2015    source источник
comment
Этот вопрос кажется подходящим для просмотра кода.   -  person TigerhawkT3    schedule 17.10.2015


Ответы (2)


Если вы используете массивы numpy для представления изображений, вместо этого вы можете использовать следующее:

def calculateDistance(i1, i2):
    return numpy.sum((i1-i2)**2)

Это должно быть намного быстрее, потому что для тяжелой работы используется быстрая реализация C. Также рассмотрите возможность использования кэширования, чтобы не вычислять разницу двух изображений дважды.

person Niklas B.    schedule 16.10.2015
comment
да! это дает мне огромное ускорение! теперь требуется ~ 8 секунд, чтобы классифицировать 10 тестовых изображений. Спасибо! - person wodzu; 17.10.2015

1) вычислить разницу между двумя изображениями во временную переменную, затем умножить эту переменную саму на себя (операция с целыми числами) вместо выполнения Math.pow, которая является операцией с плавающей запятой 2) если вы просто сравниваете расстояния, например, чтобы найти пару с наименьшим расстоянием, не утруждайте себя sqrt'ом в конце (на самом деле это не сильно ускорит процесс, потому что это не в цикле, но все же не нужно, вы используете результат только для относительных сравнений)

person qoba    schedule 16.10.2015
comment
Я попробовал это, но по какой-то неизвестной мне причине это привело к тому, что классификация была менее успешной. Это также не ускорило время расчета - потребовалось еще больше времени (около 10 минут). - person wodzu; 17.10.2015