Я пытаюсь сравнить производительность в Halide двухпроходного, отделяемого подхода к методу фильтрации на основе интегрального изображения, чтобы лучше понять планирование Halide. Я не могу найти примеры создания интегрального изображения в Halide, где функция Интегрального изображения используется при определении следующей функции.Фильтрация встроенного фильтра изображений
ImageParam input(type_of<uint8_t>(), 3, "image 1");
Var x("x"), y("y"), c("c"), xi("xi"), yi("yi");
Func ip("ip");
ip(x, y, c) = cast<float>(BoundaryConditions::repeat_edge(input)(x, y, c));
Param<int> radius("radius", 15, 1, 50);
RDom imageDomain(input);
RDom r(-radius, radius, -radius, radius);
// Make an integral image
Func integralImage = ip;
integralImage(x, imageDomain.y, c) += integralImage(x, imageDomain.y - 1, c);
integralImage(imageDomain.x, y, c) += integralImage(imageDomain.x - 1, y, c);
integralImage.compute_root(); // Come up with a better schedule for this
// Apply box filter to integral image
Func outputImage;
outputImage(x,y,c) = integralImage(x+radius,y+radius,c)
+ integralImage(x-radius,y-radius,c)
- integralImage(x-radius,y+radius,c)
- integralImage(x-radius,y+radius,c);
Expr normFactor = (2*radius+1) * (2*radius+1);
outputImage(x,y,c) = outputImage(x,y,c)/normFactor;
result(x,y,c) = cast<uint8_t>(outputImage(x,y,c));
result.parallel(y).vectorize(x,8)
Я нашел следующий код в тестах:
https://github.com/halide/Halide/blob/master/test/correctness/multi_pass_reduction.cpp
Но этот пример использует реализовать для вычисления интегрального изображения в качестве буфера по фиксированной области и не потребляет определение интегрального изображения как функции в определении последующей функции.
Когда я запускаю этот код, я замечаю, что:
- Расчет интегрального изображения происходит крайне медленно (перемещает мой трубопровод до 0 кадров в секунду)
- я получаю неправильный ответ. Я чувствую, что, должно быть, я как-то неправильно определяю свой интегральный образ.
У меня также есть связанный вопрос, как наилучшим образом планировать вычисление интегрального изображения в этом типе сценария в Halide?
Вопрос определенно с моим определением integIImage. Если я изменю определение на: integImage (imageDomain.x, imageDomain.y, c) = ip (imageDomain.x, imageDomain.y, c) + integImage (imageDomain.x-1, imageDomain.y, c) + integralImage (imageDomain.x, imageDomain.y-1, c) - integImage (imageDomain.x-1, imageDomain.y-1, c); –