2016-06-03 4 views
1

Я пытаюсь сравнить производительность в 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

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

Когда я запускаю этот код, я замечаю, что:

  1. Расчет интегрального изображения происходит крайне медленно (перемещает мой трубопровод до 0 кадров в секунду)
  2. я получаю неправильный ответ. Я чувствую, что, должно быть, я как-то неправильно определяю свой интегральный образ.

У меня также есть связанный вопрос, как наилучшим образом планировать вычисление интегрального изображения в этом типе сценария в Halide?

+0

Вопрос определенно с моим определением 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); –

ответ

1

Моя проблема была в определении моего интегрального изображения. Если бы я изменить свою реализацию в стандартной четкости один проход интегрального изображения, я получаю ожидаемое поведение:

Func integralImage; 
integralImage(x,y,c) = 0.0f; // Pure definition 
integralImage(intImDom.x,intImDom.y,c) = ip(intImDom.x,intImDom.y,c) 
        + integralImage(intImDom.x-1,intImDom.y,c) 
        + integralImage(intImDom.x,intImDom.y-1,c) 
        - integralImage(intImDom.x-1,intImDom.y-1,c); 

integralImage.compute_root(); 

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

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

Смежные вопросы