首页 > 解决方案 > 如何(快速)从特定点的二维图像中提取双线性插值补丁?

问题描述

更新:最初的问题表述有点不清楚。我不只是裁剪图像,而是在补丁提取过程中应用双线性插值。(请参阅下面的论文参考)。这就是为什么该算法比仅仅切片更复杂的原因。


我正在尝试训练深度学习模型来预测本文之后的人脸标志。我需要将包含面部的部分图像裁剪为面部标志周围的较小块。例如,如果我们有如下所示的图像:

在此处输入图像描述

该函数应生成N=15“补丁”,每个地标一个补丁:

在此处输入图像描述

我在张量之上构建了以下简单的实现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 代码,但可能有人以前已经做过类似的事情。

您能否就上面显示的代码提出一些替代方案,或者提出如何使其更快的建议?(除了使用几个并行工作者)。

标签: pythondeep-learningregressionpytorch

解决方案


1) 使用 numpy

2)选择带有索引提取的补丁。例子:

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

3)创建 3 维体,其中 3 维是补丁。[15x15x 补丁数量]

4)做你的双线性int。在同一时间对所有补丁使用 numpy (插入一个像素,计算所有第三维像素)。

这将增加您的处理超出您的想象

如果您不想变老等待您的工作完成,请忘记数学模块。它在数据科学中没有地位。


推荐阅读