一、代码
from PIL import Image
from torchvision.transforms import Compose, Resize, ToTensor, Normalize
def numpy2pil(img_numpy):
return Image.fromarray(img_numpy)
def pil2numpy(img_pil):
return np.asarray(img_pil)
def tensor2numpy(tensor):
# 将 Tensor 转换为 NumPy 数组
# .detach() 方法用于创建一个新的张量(Tensor),这个新张量与原始张量共享数据,但不再需要计算梯度。
numpy_arr = tensor.squeeze().permute(1, 2, 0).detach().cpu().numpy() * 255
print(f"NumPy 数组形状: {numpy_arr.shape}")
return numpy_arr
def img2input(img):
# 定义转换
transform = Compose([
Resize((224, 224)), # 调整大小到 (224, 224)
ToTensor(), # 转换为 Tensor,范围 [0, 1]
Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 标准化 RGB 图像
])
# 应用转换,得到 Tensor
tensor = transform(img) # shape: [3, 224, 224]
print(f"转换后的 Tensor 形状: {tensor.shape}")
# 调整 Tensor 的形状为 (1, 3, 224, 224) 以匹配模型输入
input_tensor = tensor.unsqueeze(0) # 在第0维增加一维,batch size 为 1
print(f"调整后的 Tensor 形状: {input_tensor.shape}")
return input_tensor
def main():
img = Image.open('https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg')
print(img.size, img.mode)
tensor = img2input(img)
numpy_arr = tensor2numpy(tensor)
if __name__ == '__main__':
main()
二、结果
转换后的 Tensor 形状: torch.Size([3, 224, 224])
调整后的 Tensor 形状: torch.Size([1, 3, 224, 224])
NumPy 数组形状: (224, 224, 3)