更新:
最初的问题表述有点不清楚。我不只是裁剪图像,但应用
双线性插值
我正在尝试训练一个深度学习模型来预测面部标志
this paper
. 我需要将图像中包含人脸的部分裁剪成更小的面片,围绕着面部标志。例如,如下图所示:
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代码,但可能有人以前已经做过类似的事情。