[英]How to (quickly) extract bilinear-interpolated patches from a 2d image at specific points?
更新:最初的問題表述有點不清楚。 我不只是裁剪圖像,而是在補丁提取過程中應用雙線性插值。 (請參閱下面的論文參考)。 這就是為什么該算法比僅僅切片更復雜的原因。
我想培養一個深度學習模型來預測下臉地標本文。 我需要將包含面部的圖像部分裁剪成面部標志周圍的小塊。 例如,如果我們有如下所示的圖像:
該函數應生成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 的實現。
我知道sklearn
包中的extract_patches_2d
函數有助於從圖像中選擇隨機補丁。 但是,我想從特定點挑選補丁而不是隨機進行。 我想我可以以某種方式調整上述函數,或者將上面顯示的實現轉換為 Cython/C 代碼,但可能有人以前已經做過這樣的事情。
您能否為上面顯示的代碼提供一些替代方案,或者關於如何使其更快的建議? (除了使用多個並行工作器)。
1) 使用 numpy
2)選擇帶有索引提取的補丁。 例子:
Patch=img[0:100,0:100]
3)創建3維身體,其中第3維是補丁。 [15x15x補丁數量]
4)做你的雙線性整數。 同時對所有補丁使用 numpy(插入一個像素計算第 3 維中的所有像素)。
這將增加您超出您想象的處理能力
如果您不想在等待工作完成時變老,請忘記數學模塊。 它在數據科學中沒有立足之地。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.