Pull to refresh

Comments 22

Приведенный выше пример использования интегрального изображения, вероятно, можно адаптировать для разработки оптимального алгоритма O(1)
Так надо было в заголовке так и писать. Нахрена мне читать гору расчётов если это не 0(1). Любая студентота напишет алгоритм с О(n) для центра масс
Shiny2, прочитайте еще раз, внимательнее, начиная от заголовка, и заканчивая заключением. Вы удивительно торопливы.
Так хотелось увидеть анимацию после всех этих красочных картинок

Интересная статья и идея. У вас уже есть реализация? Было бы очень интересно увидеть результы сравнения с другими реализациями.


В целом, на мой взгляд, интегральные изображения ― один из самых недооцененных алгоритмов.

Может оно и так. Но для трёх измерений получаются просто запредельные объёмы интегральных изображений, а т.к. для вычислений требуется прыгать в разные их части, то это очень негативно сказывается на скорости вычислений, особенно на GPU.


Ещё интересен вопрос точности. Мне в аналогичной ситуации, при суммировании даже точности double не хватило. Пришлось алгоритм Кохена использовать.

Наверное, мне просто нравится интуитивно понятный алгоритм, который превращает сложность O(M*N) в O(1), и вероятно может быть адаптирован для многих вычислительных задач, где нужно складывать и умножать по регионам.
В любом случае, Fast Multipole Method никакая моя реализация не побьет :) Но в отличие от FFT, которая решает только задачу N тел и более ничего, у интегральных изображений потенциал все же больше.

FFT используется в огромном количестве задач. Или вы хотели сказать FMM?


А вот по скорости надо пробовать, тут может быть очень неоднозначно.

FMM, конечно, а не FFT :)

Я несколько озадачен. Кажется, однократный проход по матрице MxN — это О(MxN), а не О(1), как в статье. Или я что-то упустил?

Для вычисления центра масс по интегральному изображению сложность O(1), но, конечно, нужно ещё это изображение построить.

И да и нет. Для двоичного поиска тоже нужно отсортировать массив. А это O(NlogN) в лучшем случае. Но двоичный поиск при этом остается O(logN), не так ли?

Теперь я понял идею, спасибо :)

Надеюсь вы знаете о такой фишке как вычитание среднего значения из данных перед интегрированием?
Потом при получении суммы — просто прибавляете среднее значение необходимое количество раз. Такой трюк особенно полезен для картинок, где значения обычно от 0 до 255 и интегральные значения растут до невообразимых высот :) Если эе сместить range пикселей к интервалу -128...127 интегральное значение будет бегать около нуля, что в случае floating-point значений сильно улучшает точность.

Но вообще говоря, в image processing community, интегральные изображения давно отошли на задний план. С недавним прогрессом в Convolutional Neural Networks все эти ручные оптимизации и алгоритмические потуги постепенно сходят на нет. Самая тупая нейро-сетка справляется с задачами гораздо лучше чем алгоритмы, разрабатываемые десятками лет. Я думаю и вам нужно смотреть в том-же направлении.
С недавним прогрессом в Convolutional Neural Networks все эти ручные оптимизации и алгоритмические потуги постепенно сходят на нет.

В тех местах, где можно задавить задачу вычислительной мощностью и памятью. Большинство задач до сих пор решаются на изображениях смешного разрешения требуя при этом невменяемой памяти и специализированного железа, которого чаще нет чем есть.
И да, сетки и интегральные изображения можно скрещивать, как в работе вот этих ребят где они добиваются более быстрого инференса за счет этих самых интегральных исзображений.

Любопытно. Но у меня как правило получается изображение со сравнительно однородным распределением и несколькими областями-экстремумами, значения которых отличаются на несколько порядков в большую сторону.

Спасибо за статью, было интересно почитать про подход.


На картинке, где сравнивается методы аппроксимации функций гравитации, хотелось бы увидеть еще катринку с честно просчитаной гравитацией. Она вообще сильно отличается от интегральной со взвешенными координатами? У меня такое подозрение, что отличия должны быть, т.к. на картинке все-таки заметны концентрические окружности, которых скорее всего не должно быть на честно просчитаной картинке.

Спасибо! Попробую сгенерировать иллюстрацию со строгим решением, хотя не уверен, что GPU это решение осилит. Может быть для поля небольшого размера и получится.
Кажется в других науках ваши интегральный изображение называются кумулятивной функцией распределения.
Я понял, что мы переходом в центр масс мы поднимаем точность до квадратичной, так как убиваем дипольный момент. А не знаете какого-нибудь способа хоть как-нибудь посчитать квадрупольный тензор, чтобы поднять точность до куба? Понятно, что в лоб не вариант, там сложность будет квадрат от числа элементов в секторе. Но может есть какие-нибудь фокусы?
Верно, cumulative distribution function. На второй вопрос я к сожалению не смогу ответить, моя математическая подготовка будет несколько пониже уровнем :(
Но на каждой итерации объекты меняют положения и скорости, а значит и интеральное изображение меняется. Как вы его обновляете, чтобы не тратить O(M*N) на каждом шаге по времени?
Обновлять приходится на каждом шаге, но вычисление интегрального изображения — это самый простой этап по абсолютным вычислительным затратам. Вообще, целиком алгоритм эволюции поля примерно такой: 1) вычисление интегрального изображения масс O(N), 2) вычисление сил — O(NlogN), 3) решение дифференциальных уравнений движения O(N) и 4) перераспределение масс O(N). Здесь N = X*Y — Общее количество дискретных элементов в поле.

Вычисление интегрального изображения — это просто суммирование по строкам, транспонирование, еще одно суммирование по строкам и еще одно транспонирование.

Решение дифференциальных уравнений — это алгоритм RK4, и в абсолютном отношении оно примерно вчетверо сложнее вычисления интегрального изображения.
Sign up to leave a comment.