PIL(Python Imaging Library,现为 Pillow 库)和torchvision是Python中两个常用于图像处理的库,它们之间存在紧密的依赖关系。它们的关系可以概括为:PIL 是基础图像处理工具,torchvision 是基于 PIL 构建的深度学习扩展

一、核心功能对比

维度 PIL (Pillow) torchvision
定位 通用图像处理库 PyTorch 的计算机视觉库
核心功能 图像读写、缩放、裁剪、色彩转换等 数据加载、预处理、模型、数据集
数据格式 PIL.Image 对象 torch.Tensor
典型场景 基础图像操作 深度学习训练与推理

二、协作流程

在深度学习工作流中,两者通常按以下方式协作:

  1. PIL 读取图像:从磁盘读取图像,得到 PIL.Image 对象。
  2. torchvision 预处理:将 PIL.Image 转换为 torch.Tensor,并应用归一化、增强等操作。
  3. 模型推理 / 训练:处理后的 Tensor 输入 PyTorch 模型。
  4. PIL 后处理(可选):将模型输出转回 PIL.Image 进行可视化。

三、关键协作点

1. 数据预处理(transforms 模块)

torchvision.transforms 中的大多数操作默认接收 PIL.Image,并输出 Tensor

from PIL import Image
from torchvision import transforms

# 加载图像(PIL格式)
image = Image.open('example.jpg')

# 定义预处理流程
transform = transforms.Compose([
    transforms.Resize(256),           # PIL缩放
    transforms.CenterCrop(224),       # PIL裁剪
    transforms.ToTensor(),            # PIL → Tensor
    transforms.Normalize(             # Tensor归一化
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]
    ),
])

# 应用预处理(得到Tensor)
tensor = transform(image)  # 输入PIL,输出Tensor
2. 数据集加载(datasets 模块)

torchvision.datasets 中的数据集(如 CIFAR、ImageNet)默认返回 PIL.Image: 

from torchvision import datasets

# 加载CIFAR-10数据集
train_dataset = datasets.CIFAR10(
    root='./data',
    train=True,
    download=True,
    transform=transform  # 传入预处理函数
)

# 获取样本(经过transform后变为Tensor)
image, label = train_dataset[0]
print(type(image))  # <class 'torch.Tensor'>
3. 模型输出后处理

若需将模型输出的 Tensor 转回图像显示,可使用 transforms.ToPILImage

from torchvision import transforms

# 创建后处理函数
to_pil = transforms.ToPILImage()

# 假设output是模型输出的Tensor
output_image = to_pil(output)  # Tensor → PIL
output_image.show()  # 显示图像

 

四、性能优化:替代方案

虽然 PIL 是 torchvision 的默认后端,但对于大规模数据处理,可使用更高效的替代方案:

1. OpenCV:用 cv2.imread() 替代 PIL.Image.open(),速度更快。
import cv2
from torchvision import transforms

# 用OpenCV读取(返回numpy数组)
img_cv = cv2.imread('example.jpg')
img_cv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)  # 转为RGB

# 转换为PIL再处理
img_pil = Image.fromarray(img_cv)
tensor = transform(img_pil)
2.  albumentations:高性能数据增强库,直接处理 numpy.ndarray,无需转换为 PIL.Image
import albumentations as A
from albumentations.pytorch import ToTensorV2

# 定义增强操作(直接处理numpy数组)
transform = A.Compose([
    A.Resize(256, 256),
    A.Normalize(),
    ToTensorV2(),
])

# 直接处理OpenCV读取的图像
img_tensor = transform(image=img_cv)['image']

 

五、总结选择建议

场景 推荐工具 理由
基础图像处理(裁剪、缩放等) PIL 简单易用,与 torchvision 无缝集成
深度学习数据预处理 torchvision.transforms 专为 PyTorch 设计,支持 PIL 到 Tensor 的转换
图像读写优化 OpenCV 比 PIL 读取速度更快,适合工业级应用
高性能数据增强 albumentations 速度快,直接处理 numpy 数组,适合大规模数据集

 

 

 

 

 

 

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐