参考自:
import os
from icecream import ic
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from PIL import Image
path = "./1.jpeg"
# 图片本身
img = Image.open(path)
img.save("old.jpg")
# img.show()
img = torch.from_numpy(np.array(img, dtype=np.float32))
ic(img.shape) # torch.Size([680, 440,3])
# 添加模型需要的batch_size,将channel换到第二个维度
img = img.unsqueeze(0).transpose(1, 3).transpose(2, 3)
ic(img.shape) # torch.Size([1, 3, 680, 440])
# 先随便写池化层的kernel_size和步长
m = nn.MaxPool2d((3, 2), stride=(2, 1))
new_img = m(img)
ic(new_img.shape) # torch.Size([1, 3, 339, 439])
# 维度转变 成Image需要的
new_img = new_img.transpose(1, 2).transpose(2, 3).squeeze()
ic(new_img.shape) # torch.Size([339, 439, 3])
img = Image.fromarray(np.uint8(new_img)).convert('RGB')
img.save("./new.jpg")
其中新旧图片的尺寸和步长、kernel_size
的计算公式如下:
Input: ( N , C , H i n , W i n ) or ( C , H i n , W i n ) \text { Input: }\left(N, C, H_{i n}, W_{i n}\right) \text { or }\left(C, H_{i n}, W_{i n}\right) Input: (N,C,Hin,Win) or (C,Hin,Win)
Output: ( N , C , H out , W out ) or ( C , H out , W out ) , where \text { Output: }\left(N, C, H_{\text {out }}, W_{\text {out }}\right) \text { or }\left(C, H_{\text {out }}, W_{\text {out }}\right) \text {, where } Output: (N,C,Hout ,Wout ) or (C,Hout ,Wout ), where
效果如图