Скорость numpy.sum - PullRequest
       2

Скорость numpy.sum

0 голосов
/ 29 октября 2018

Я пишу приложение для компьютерного зрения на Python с OpenCV, в котором мне нужно (очень часто) вычислять сумму по разным прямоугольным областям одного и того же изображения. Одним из способов его вычисления является наивный способ через np.sum, а альтернативой является использование Integral Image , так что мне нужно только найти четыре значения для вычисления суммы.

Мой (unittest) -код для проверки выглядит так:

    self.input_image = np.random.rand(self.rows, self.cols)
    tic = time.clock()
    for i in range(cnt):
        np.sum(self.input_image[0:self.rows, 0:self.cols])
    toc = time.clock()
    t_direct_ms = ((toc-tic)/cnt)*1000.0
    print ("direct time: %.5f ms" % t_direct_ms)

    # self.ii._sum_image = cv2.integral(input_image)
    tic = time.clock()
    for i in range(cnt):
        self.ii.sum_region(0, self.rows, 0, self.cols)
    toc = time.clock()
    t_integral_ms = ((toc - tic) / cnt)*1000.0
    print ("lookup time: %.5f ms" % t_integral_ms)

    print ("Speed ratio direct/integral: %.2f" % (t_direct_ms / t_integral_ms))

и

def sum_region(self, row_start, row_end, col_start, col_end):
    A = self._sum_image[row_end, col_end]
    B = self._sum_image[row_start, col_end]
    C = self._sum_image[row_end, col_start]
    D = self._sum_image[row_start, col_start]
    return A - B - C + D

с

self._sum_image = cv2.integral(image)

Результат тот же (тестирование с использованием рандомизированных входных изображений), однако мое ускорение для плавающих изображений размером (300,80) составляет всего около 15:

direct time: 0.01017 ms 
lookup time: 0.00069 ms 
Speed ratio direct/integral: 14.84

Я бы ожидал гораздо более высокого ускорения, поскольку интегральное изображение имеет только несколько поисков, и numpy.sum должен суммировать более 24000 значений.

Внутренняя структура numpy намного быстрее? Или есть проблема с тем, как я измеряю?

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