c++ - Halide:较大图像的去马赛克算法错误。似乎适用于 16x16 图像。

标签 c++ trace halide demosaicing

我正在尝试为拜耳过滤器实现去马赛克算法,如本 pdf 的第 2.8 节(第 8 页)所示:http://www.arl.army.mil/arlreports/2010/ARL-TR-5061.pdf .我坚持尝试通过 RDom 实现功能。当我使用 16x16 图像时,轨迹实际上已经结束,但是当我使用更大的图像(如 768x1280)时,轨迹卡在:

Store green.0(767, 1279);

以下是我的代码的简化版本:

#include "Halide.h"
#include<stdio.h>
#include<stdlib.h>
#include "halide_image_io.h"

using namespace Halide;


int main(int argc, char **argv) {

    Buffer<uint8_t> input = Tools::load_image(argv[1]);

    RDom r(2, input.width() - 4, 2, input.height() - 4);
    r.where((r.x % 2 == 0 && r.y % 2 == 0) || (r.x % 2 == 1 && r.y % 2 == 1));

    Var x("x"), y("y");

    Func g_n, w_n, g_n_est, green("green");

    g_n(x, y) = cast<float> (0);
    w_n(x, y) = cast<float> (0);
    g_n_est(x, y) = cast<float> (0);
    green(x, y) = cast<uint8_t> (0);


    printf("width: %d\n", input.width());
    printf("height: %d\n", input.height());
    printf("channels: %d\n", input.channels());

    g_n(r.x, r.y) = abs(cast<float>(input(r.x, r.y + 1) - input(r.x, r.y - 1))) + abs(cast<float>(input(r.x, r.y) - input(r.x, r.y - 2)));
    w_n(r.x, r.y) = cast<float>(1 / (1 + g_n(r.x, r.y)));
    g_n_est(r.x, r.y) = cast<float>(input(r.x, r.y - 1) + (input(r.x, r.y) - input(r.x, r.y - 2))) / 2;

    green(r.x, r.y) = cast<uint8_t>(w_n(r.x, r.y) * g_n_est(r.x, r.y));
    green.trace_stores();



    Buffer<uint8_t> temp = green.realize(input.width(), input.height());

    Tools::save_image(temp, "result.png");

}

这是 Halide 中的错误吗?在这种情况下,代码完成执行并保存 16x16 输入的输出图像,但卡在较大图像的跟踪中。

最佳答案

这只是一个非常非常低效的时间表。每个阶段在它们实现时都在更新定义中计算 O(n) 个像素(现在 RDom r 很大),但每个阶段也都内联到下一个。结果,green 中的每个点都在递归计算 g_n_estw_n 的整个图像,然后针对它们的每个像素递归计算g_n 的完整图像。

您在 green.0(767, 1023) 处看到的停顿实际上是它完成 green(x ,y) = 0 对于最后一个像素,由于 O(n^3) 它正在做的工作,此时它开始永远地实际计算所有更新阶段。

在这种情况下,积极开启更多跟踪会使问题更加清晰。配置编译时,您可以在全局范围内启用对实现或单个商店的跟踪:https://github.com/halide/Halide/wiki/Debugging-Tips#tracing .

对于此代码,将早期阶段安排为 compute_root 可能是您想要的,尽管您实际上可能需要 g_n_estw_n 定义是简单的纯函数(根本没有 RDom),可以融合到 green 中,按 block 调度,等等。

关于c++ - Halide:较大图像的去马赛克算法错误。似乎适用于 16x16 图像。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50588284/

相关文章:

c++ - 使用C++中的Delete避免内存泄漏

c++ - Accelerated C++ Practical Programming by Example 中的概念在今天是否仍然适用?

azure - 当 UseDevelopmentStorage=true 时,本地机器上的 Azure 跟踪日志在哪里

c++ - Linux - 找不到 SO 文件

c++ - 如何修复: Executing lambda expression using pthread in c++

python - Python 中的 setTrace() (redux)

linux - 适用于 Linux 的 WPP 跟踪

c++ - Halide - while 循环等效

c++ - 在 iOS 上将 Halide 提前 (AOT) 与 Metal 结合使用

c++ - 对宽度不匹配的输出缓冲区进行矢量化