python - 如何(快速)从特定点的二维图像中提取双线性插值补丁?
问题描述
更新:最初的问题表述有点不清楚。我不只是裁剪图像,而是在补丁提取过程中应用双线性插值。(请参阅下面的论文参考)。这就是为什么该算法比仅仅切片更复杂的原因。
我正在尝试训练深度学习模型来预测本文之后的人脸标志。我需要将包含面部的部分图像裁剪为面部标志周围的较小块。例如,如果我们有如下所示的图像:
该函数应生成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 代码,但可能有人以前已经做过类似的事情。
您能否就上面显示的代码提出一些替代方案,或者提出如何使其更快的建议?(除了使用几个并行工作者)。
解决方案
1) 使用 numpy
2)选择带有索引提取的补丁。例子:
Patch=img[0:100,0:100]
3)创建 3 维体,其中 3 维是补丁。[15x15x 补丁数量]
4)做你的双线性int。在同一时间对所有补丁使用 numpy (插入一个像素,计算所有第三维像素)。
这将增加您的处理超出您的想象
如果您不想变老等待您的工作完成,请忘记数学模块。它在数据科学中没有地位。
推荐阅读
- lightgbm - lightgbm 数据集 API 中的参数“reference”是什么意思?
- apache-spark - 在 Spark 中快速分布式生成唯一增量 uint64 id
- html - Shopify:如果我的收藏成块,如何获取收藏网址
- docker - 为什么 docker bash 看不到交叉编译器
- node.js - 我似乎无法将 BlockDecoder 导入我的打字稿项目
- python - 即使 pip 在本地计算机上更新,setuptools 也会搜索旧的 pypi 存储库
- python - 尝试在 pycharm 中升级后无法识别“pip”
- mysql - MySQL有条件地根据某行列的总和进行选择
- laravel - 你可以使用带有 php date() 的 Laravel ::get 语句将日期编号转换为日期名称吗?
- azure-pipelines - 找不到测试时,Azure DevOps 管道 .NET Core CLI 测试任务失败