Реализуйте MaskRCNN как часть NMS

Я начинающий на Halide, пытаюсь с его помощью ускорить maskrcnn.

К настоящему времени производительность действительно превосходна по сравнению с версией c. Затем я столкнулся с проблемой, которая беспокоила меня в течение нескольких дней: не максимальное подавление (nms), это классический алгоритм, но я не нашел подобного примера для него в галоиде, резюме таково:

Сначала отсортируйте поле массива, затем для каждого i в поле, от i+1 до конца этого массива, вычислите перекрытие с полем [i], затем либо сохраните его, либо удалите в соответствии с перекрытием. Можно ли это реализовать в галогениде? Должен ли я использовать define::extern? Appeciate много, если кто-нибудь может ответить.


Обновить:

Извините, что я не очень хорошо объяснил эту проблему. Немаксимальное подавление в MaskRcnn немного отличается от подавления в Canny Edge Detector. Вы можете обратиться к этому:

https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/

где код Python является реализацией такого алгоритма.

Если это слишком долго, подумайте над этим простым вопросом:

Для массива a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} нам нужно вычислить произведение между a[i] и a[j](i+1 ‹=j ‹ 10), если это значение произведения меньше 6 (например), то мы удаляем a[j], повторяя эту операцию для всех i в диапазоне [0, 9]. Спасибо.


person Francois    schedule 30.10.2017    source источник


Ответы (1)


Немаксимальное подавление WRT: краткий обзор Википедии и этой презентации (http://www.inf.u-szeged.hu/ssip/2003/lectures/chetverikov/edge_detection.pdf) дает мне некоторое представление о том, что делает алгоритм. Я понятия не имею, как определить направление края, но я думаю, что это может помочь:

Предполагая простой фильтр (x +/- 1, y +/- 1), Halide может найти максимум набора значений, используя RDom. Назовите этот результат МАКС. Создайте фильтр коэффициентов с помощью MAX — фильтр единиц и нулей. Умножьте коэффициенты на исходную матрицу, и вы должны получить неминимальное подавление.

Фильтр коэффициентов можно создать с помощью max((signed)(pixel - (MAX - 1)), 0), где значения пикселей беззнаковые. По сути, вычтите MAX-1 из исходных значений, используя беззнаковое вычитание и насыщение. Результатом фильтра является массив единиц и нулей.

Как видите, создать такой алгоритм в Halide несложно; на самом деле сложнее разобраться в значении таких терминов, как «перекрытие». Надеюсь, это даст вам некоторое представление о том, как действовать дальше.

Удачи, -Фил

person Phil Hutchinson    schedule 31.10.2017
comment
Спасибо за ваш любезный ответ, метод, который вы предлагаете, действительно хорош для алгоритма Canny Edge Detector, однако он немного отличается от того, что я хочу сделать. Я обновил более подробную информацию об этом алгоритме nms в Object Detection, способ реализации его в Halide долгое время беспокоил меня и нашу группу. Спасибо, если у вас есть еще отличные идеи. - person Francois; 01.11.2017