代码之家  ›  专栏  ›  技术社区  ›  devforfu

如何(快速)从二维图像的特定点提取双线性插值面片?

  •  1
  • devforfu  · 技术社区  · 5 年前

    更新: 最初的问题表述有点不清楚。我不只是裁剪图像,但应用 双线性插值


    我正在尝试训练一个深度学习模型来预测面部标志 this paper . 我需要将图像中包含人脸的部分裁剪成更小的面片,围绕着面部标志。例如,如下图所示:

    enter image description here

    N=15 “补丁”,每个地标一个补丁:

    enter image description here

    我有以下基于 torch 张量:

    def generate_patch(x, y, w, h, image):
        c = image.size(0)
        patch = torch.zeros((c, h, w), dtype=image.dtype)
        for q in range(h):
            for p in range(w):
                yq = y + q - (h - 1)/2
                xp = x + p - (w - 1)/2
                xd = 1 - (xp - math.floor(xp))
                xu = 1 - (math.ceil(xp) - xp)
                yd = 1 - (yq - math.floor(yq))
                yu = 1 - (math.ceil(yq) - yq)
                for idx in range(c):
                    patch[idx, q, p] = (
                        image[idx, math.floor(yq), math.floor(xp)]*yd*xd + 
                        image[idx, math.floor(yq),  math.ceil(xp)]*yd*xu +
                        image[idx,  math.ceil(yq), math.floor(xp)]*yu*xd +
                        image[idx,  math.ceil(yq),  math.ceil(xp)]*yu*xu
                    ).item()
        return patch
    
    
    def generate_patches(image, points, n=None, sz=31):
        if n is None:
            n = len(points)//2
        patches = []
        for i in range(n):
            x_val, y_val = points[i], points[i + n]
            patch = generate_patch(x_val, y_val, sz, sz, image)
            patches.append(patch)
        return patches
    

    代码完成了它的工作,但是太慢了。我猜是因为所有这些for循环和单独的像素索引。我想矢量化这段代码,或者找一些基于C的实现,可以做得更快。

    我知道有一个 extract_patches_2d 函数来自 sklearn 帮助从图像中随机选取补丁的包。但是,我想从 具体要点 而不是随机的。我想我可以以某种方式修改前面提到的函数,或者将上面显示的实现转换为Cython/C代码,但可能有人以前已经做过类似的事情。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Martin    5 年前

    1) 使用numpy

    Patch=img[0:100,0:100]
    

    3) 创建三维实体,其中在第三维是补丁[15x15x补丁数量]

    这将使你的处理能力超出你的想象

    如果你不想变老等着你的工作完成忘记数学模块。它在数据科学中没有一席之地。