簡體   English   中英

PyTorch 中是否有提取圖像塊的功能?

[英]Is there a function to extract image patches in PyTorch?

給定一批圖像,我想提取所有可能的圖像塊,類似於卷積。 在 TensorFlow 中,我們可以使用tf.extract_image_patches來實現這一點。 PyTorch 中是否有等效的功能?

謝謝。

不幸的是,可能沒有直接的方法來實現您的目標。
但是 Tensor.unfold 函數可能是一個解決方案。
https://discuss.pytorch.org/t/how-to-extract-smaller-image-patches-3d/16837/2
這個網站或許能幫到你。

也許此代碼示例將有助於理解如何使用unfold ,靈感來自這個線程通過@gasoon鏈接,但更多的是有點冗長:

batch_size, n_channels, n_rows, n_cols = 32, 3, 64, 64
kernel_h, kernel_w = 7, 9
step = 5

x = torch.arange(batch_size*n_channels*n_rows*n_cols).view(batch_size, n_channels, n_rows, n_cols)

# unfold(dimension, size, step)
windows = x.unfold(2, kernel_h, step).unfold(3, kernel_w, step).permute(2, 3, 0, 1, 4, 5).reshape(-1, n_channels, kernel_h, kernel_w)
print(windows.shape)
# result: torch.Size([4608, 3, 7, 9]) = [n_windows, n_channels, krenel_h, kernel_w]

也花了一些時間研究這個,我發現這個 pytorch 線程對我有用,PyTorch dev ptrblck (保佑這個家伙)提供了等效的 pytorch 版本的 tensorflow 函數。

為簡單起見,我將在這里重新發布代碼(來自用戶FloCF )。

import math
import torch.nn.functional as F

def extract_image_patches(x, kernel, stride=1, dilation=1):
    # Do TF 'SAME' Padding
    b,c,h,w = x.shape
    h2 = math.ceil(h / stride)
    w2 = math.ceil(w / stride)
    pad_row = (h2 - 1) * stride + (kernel - 1) * dilation + 1 - h
    pad_col = (w2 - 1) * stride + (kernel - 1) * dilation + 1 - w
    x = F.pad(x, (pad_row//2, pad_row - pad_row//2, pad_col//2, pad_col - pad_col//2))
    
    # Extract patches
    patches = x.unfold(2, kernel, stride).unfold(3, kernel, stride)
    patches = patches.permute(0,4,5,1,2,3).contiguous()
    
    return patches.view(b,-1,patches.shape[-2], patches.shape[-1])

在 PyTorch 論壇上給這些人點贊 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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