簡體   English   中英

如何(快速)從特定點的二維圖像中提取雙線性插值塊?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM