我在把一张(37263, 32763)的图片经过unfold()生成滑窗后,得到(238, 3, 4096, 4096)的张量windows,把windows维度变为(B, H, W, C)后无论是使用np.array(windows)还是windows.numpy()把windows转换为numpy,windows_np, 我在后续操作中令window = windows_np[i, :, :, :], window = (window * 255).astypee(uint8)消耗了150s左右,但经测试对和windows_np相同形状的数组才需要这么多时间(也就是我只想对一个窗口做这个操作却对所有窗口做了一遍),或者window = windows_np[i, :, :, :].copy()但copy()竟然花了120s左右,显然是复制了所有的窗口。虽然我能在外面先把所有窗口处理好,但我不理解为什么会这样。
import os
os.environ["OPENCV_IO_MAX_IMAGE_PIXELS"] = pow(2, 40).__str__()
import cv2
import torch
import torchvision.transforms as transforms
import numpy as np
import time
import gc
if __name__ == '__main__':
# 自定义滑动窗口的大小
file1_name = ['PWYL', 'PWYN-C ', 'PWYN-S', 'PWZF-C', 'PWZF-S']
file2_name = ['CS', 'SS']
for file1 in file1_name:
for file2 in file2_name:
image = cv2.imread(f'{file1}/{file2}/{file1}-{file2}.jpg')
transform = transforms.Compose([transforms.ToTensor()])
data = transform(image)
(winW, winH) = (4096, 4096)
stepSize = (2048, 2048)
windows = torch.nn.functional.unfold(data.unsqueeze(0), kernel_size=(winW, winH), stride=stepSize)
num_windows = windows.shape[2]
channels = 3
windows_np = windows.permute(0, 2, 1).reshape(num_windows, channels, winW, winH).permute(0, 2, 3, 1).numpy()
out_dir = f'dataset/{file1}/{file2}'
if not os.path.exists(out_dir):
os.makedirs(out_dir, exist_ok=True)
for i in range(num_windows):
s1 = time.perf_counter()
window = windows_np[i, :, :, :]
e1 = time.perf_counter()
print(f'time2: {e1 - s1}')
s2 = time.perf_counter()
window_uint8 = (window * 255).astype(np.uint8)
e2 = time.perf_counter()
print(f'time3: {e2 - s2}')
np.save( f'{out_dir}/{file1}_{file2}_{i}.npy', window_uint8)
exit()
del image
del windows_np
gc.collect()