【深入浅出PyTorch】--8.1.PyTorch生态--torchvision

🎯 进阶之路:走进 PyTorch 生态系统

恭喜你!经过前七章的学习,你已经掌握了 PyTorch 的核心组件:

  • 张量操作与自动求导(torch.Tensor, autograd
  • 神经网络构建(torch.nn
  • 模型训练流程(前向传播、损失计算、反向传播、优化器)
  • 自定义模型结构与模块化设计
  • 使用 TensorBoard 等工具进行可视化分析

现在,是时候将这些技能应用到真实世界的任务中了。而要做到这一点,离不开 PyTorch 生态系统 的支持。

🌐 什么是 PyTorch 生态系统?

PyTorch 之所以成为深度学习研究和工业界的主流框架之一,不仅仅因为它 API 设计简洁、动态图机制灵活,更重要的是其背后强大的 开源社区生态。这个生态系统由一系列高质量的第三方库组成,它们基于 PyTorch 构建,专注于解决特定领域的实际问题。

这些工具包通常提供:

功能 示例
数据加载与预处理 Dataset, DataLoader 的高级封装
数据增强 领域专用的图像/文本/图数据增广方法
预定义模型结构 ResNet, BERT, GCN 等经典模型一键调用
预训练权重 ImageNet、COCO、WikiText 等大规模数据集上的预训练模型
损失函数与评估指标 分类、检测、分割等任务专用指标
训练/推理流水线封装 简化训练循环,支持分布式训练
可视化与调试工具 特征图可视化、注意力机制展示等

🔧 主要领域及其代表性工具包

领域 工具包 简介
计算机视觉 TorchVision 官方视觉库,包含数据集(CIFAR, ImageNet)、模型(ResNet, Faster R-CNN)、变换(transforms)等
视频理解 TorchVideo(已并入 PyTorchVideo) Facebook AI 开发,支持视频分类、动作识别等
自然语言处理 torchtext 官方 NLP 库,支持文本数据处理、词向量、语言模型等(注意:新版已简化 API) 替代方案:Hugging Face Transformers + Datasets
图神经网络 PyG (PyTorch Geometric) 德国达姆施塔特工业大学开发,支持图卷积、图注意力等复杂结构
音频处理 torchaudio 官方音频库,支持语音识别、音频分类、声纹识别等
强化学习 TorchRL / Stable-Baselines3 (支持 PyTorch) 提供 RL 算法实现与环境接口
模型部署 [TorchScript, TorchServe, ONNX] 支持模型导出、序列化与生产环境部署

💡 小贴士:虽然 torchtexttorchaudio 是官方库,但在实际项目中,许多开发者更倾向于使用 Hugging Face TransformersKaldi 等更成熟的生态工具。


目录

1.torchvision--简介

1.1.torchvision.datasets(数据集)

[📷 一、图像分类(Image Classification)](#📷 一、图像分类(Image Classification))

[🏙️ 二、目标检测与语义分割(Object Detection & Segmentation)](#🏙️ 二、目标检测与语义分割(Object Detection & Segmentation))

[👤 三、人脸识别与人脸分析(Face Recognition / Analysis)](#👤 三、人脸识别与人脸分析(Face Recognition / Analysis))

[🚗 四、自动驾驶与三维感知(Autonomous Driving & 3D Vision)](#🚗 四、自动驾驶与三维感知(Autonomous Driving & 3D Vision))

[🎥 五、视频理解(Video Understanding)](#🎥 五、视频理解(Video Understanding))

[🌆 六、场景识别与自然图像(Scene Recognition)](#🌆 六、场景识别与自然图像(Scene Recognition))

[🧠 七、合成与特殊用途数据集(Synthetic / Utility)](#🧠 七、合成与特殊用途数据集(Synthetic / Utility))

1.2.torchvision.transforms(数据增强)

1.3.torchvision.models(模型加载)

[1.3.1.图像分类(Image Classification)](#1.3.1.图像分类(Image Classification))

[1.3.2.语义分割(Semantic Segmentation)](#1.3.2.语义分割(Semantic Segmentation))

1.3.3.目标检测、实例分割与关键点检测

1.4.torchvision.io(数据读写)

1.5.torchvision.ops(视觉操作)

1.6.torchvision.utils(可视化)


1.torchvision--简介

在前面的学习和实战中,我们经常会用到torchvision来调用预训练模型,加载数据集,对图片进行数据增强的操作。在本章我们将给大家简单介绍下torchvision以及相关操作。

" The torchvision package consists of popular datasets, model architectures, and common image transformations for computer vision. "

正如引言介绍的一样,我们可以知道torchvision包含了在计算机视觉中常常用到的数据集,模型和图像处理的方式,而具体的torchvision则包括了下面这几部分,带 ***** 的部分是我们经常会使用到的一些库,所以在下面的部分我们对这些库进行一个简单的介绍:

  • torchvision.datasets *

  • torchvision.models *

  • torchvision.tramsforms *

  • torchvision.io

  • torchvision.ops

  • torchvision.utils

1.1.torchvision.datasets(数据集)

torchvision.datasets主要包含了一些我们在计算机视觉中常见的数据集,在==0.10.0版本==的torchvision下,有以下的数据集:

任务 推荐数据集
图像分类 CIFAR-10/100, Fashion-MNIST, STL10, Caltech
场景识别 Places365
目标检测 VOC, COCO, WIDERFace
语义分割 Cityscapes, SBD, VOC
人脸分析 CelebA, WIDERFace
动作识别 Kinetics-400, UCF101
自动驾驶 KITTI, Cityscapes
模型调试 FakeData
字符识别 EMNIST, KMNIST, QMNIST, SVHN

📷 一、图像分类(Image Classification)

这些数据集主要用于图像分类任务,是深度学习入门和模型验证的经典基准。

数据集 简介
CIFAR-10 / CIFAR-100 小尺寸彩色图像数据集(32×32),分别包含10类和100类物体。常用于测试模型性能。
Fashion-MNIST 10类服装的灰度图(28×28),替代原始 MNIST 手写数字,更具挑战性。
KMNIST Kuzushiji-MNIST,日文草书字符的灰度图像(28×28),用于字符识别研究。
EMNIST 扩展版 MNIST,包含手写字母和数字,结构与 MNIST 兼容但类别更多。
QMNIST MNIST 的扩展版本,来自原始 NIST 数据库,可用于更精确的实验对比。
SVHN (Street View House Numbers) 街景门牌号码图像(32×32 彩色),真实场景下的数字识别任务,比 MNIST 更复杂。
STL10 类似 CIFAR-10,但图像更大(96×96),且提供无标签数据用于半监督学习。

🏙️ 二、目标检测与语义分割(Object Detection & Segmentation)

用于目标检测、实例分割、语义分割等高级视觉任务。

数据集 简介
VOC (Pascal Visual Object Classes) 经典多任务数据集(2007/2012),包含 20 类物体,支持分类、检测、分割任务。
COCO (via torchvision 支持加载) 虽然 torchvision 不直接命名 COCO,但可通过 CocoDetection, CocoCaptions 接口加载(需手动下载)。大规模目标检测、分割、图像描述数据集。
Cityscapes 城市场景下的语义分割数据集,包含 5000 张精细标注图像,30 类城市交通元素(车、行人、道路等)。
SBD (Semantic Boundaries Dataset) VOC 的扩展,提供像素级语义分割标注,常用于语义分割模型训练。
WIDERFace 大规模人脸检测数据集,包含各种姿态、遮挡、光照条件下的人脸,标注了边界框和关键点。

👤 三、人脸识别与人脸分析(Face Recognition / Analysis)

专注于人脸相关任务,如检测、关键点定位、属性识别。

数据集 简介
CelebA (CelebFaces Attributes Dataset) 包含超过 20 万张名人脸部图像,每张标注了 40 种属性(如微笑、戴眼镜)和 5 个关键点。
EMNIST(也适用于手写识别) 包含手写英文字母,可用于字符级别的人脸之外的模式识别。

🚗 四、自动驾驶与三维感知(Autonomous Driving & 3D Vision)

用于自动驾驶相关的视觉任务,结合图像与激光雷达数据。

数据集 简介
KITTI 自动驾驶基准数据集,包含图像、激光雷达点云、GPS/IMU 数据,支持目标检测、立体匹配、光流估计等任务。
Cityscapes 同上,也广泛用于自动驾驶中的语义分割任务。

🎥 五、视频理解(Video Understanding)

用于视频分类、动作识别等时序建模任务。

数据集 简介
Kinetics-400 大规模动作识别数据集,包含约 24 万段 YouTube 视频,涵盖 400 种人类动作(如跳舞、游泳)。
UCF101 视频动作识别经典数据集,101 类动作,约 1.3 万段视频,适合小规模实验。

🌆 六、场景识别与自然图像(Scene Recognition)

用于场景分类、图像检索等任务。

数据集 简介
Places365 包含 365 种室内外场景的大规模数据集(如厨房、森林、机场),适合场景分类模型预训练。
PhotoTour (Liberty, Yosemite, Notre Dame) 用于图像匹配和特征提取,常用于训练描述子(如 SuperPoint),基于旅游照片的匹配任务。

🧠 七、合成与特殊用途数据集(Synthetic / Utility)

用于调试、测试或教学目的。

数据集 简介
FakeData 合成随机数据集,不依赖磁盘文件,用于快速测试数据加载流程和模型结构是否正确。
Caltech-101 / Caltech-256 图像分类数据集,分别包含 101 和 256 类物体,图像质量高,类别多样。

调用可以使用代码:

python 复制代码
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 示例:加载 CIFAR-10
transform = transforms.Compose([transforms.ToTensor()])
train_set = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)

# 示例:加载 Cityscapes(需指定 split)
cityscape = datasets.Cityscapes(root='./cityscapes', split='train', mode='fine', target_type='semantic', transform=transform)

# 示例:加载 Kinetics-400(注意:需要大量存储空间)
kinetics = datasets.Kinetics400(root='./kinetics', frames_per_clip=16, step_between_clips=5)

1.2.torchvision.transforms(数据增强)

我们知道在计算机视觉中处理的数据集有很大一部分是图片类型的,如果获取的数据是格式或者大小不一的图片,则需要进行归一化和大小缩放等操作,这些是常用的数据预处理方法。除此之外,当图片数据有限时,我们还需要通过对现有图片数据进行各种变换,如缩小或放大、水平或垂直翻转等,这些是常见的数据增强方法。而torchvision.transforms中就包含了许多这样的操作。在之前第四章的Fashion-mnist实战中对数据的处理时我们就用到了torchvision.transformer:

python 复制代码
from torchvision import transforms
data_transform = transforms.Compose([
    transforms.ToPILImage(),   # 这一步取决于后续的数据读取方式,如果使用内置数据集则不需要
    transforms.Resize(image_size),
    transforms.ToTensor()
])

除了上面提到的几种数据增强操作,在torchvision官方文档里提到了更多的操作,具体使用方法也可以参考本节配套的"transforms.ipynb",在这个notebook中我们给出了常见的transforms的API及其使用方法,更多数据变换的操作我们可以点击这里进行查看。

1.3.torchvision.models(模型加载)

为了提升深度学习研究与应用的效率,避免"重复造轮子",PyTorch 团队通过 torchvision.models 模块提供了大量在大规模数据集上预训练好的模型。这些模型不仅可用于迁移学习(Transfer Learning),也可以作为新模型设计的基准或特征提取器使用。

🔗 官方文档地址:https://pytorch.org/vision/stable/models.html

此外,如果你希望获取更多非官方但高质量的预训练模型实现,可以参考社区项目:

🔗 pretrained-models.pytorch ------ 包含 DenseNet-BC、SE-Net 等多种扩展模型

**1.3.1.**图像分类(Image Classification)

所有分类模型均在 ImageNet-1K 数据集 上进行预训练,包含 1000 类自然图像,输入尺寸通常为 (3, 224, 224)

模型名称 特点简介
AlexNet 2012 年 ImageNet 冠军,首次使用 GPU 加速训练的 CNN,奠定现代 CNN 基础。
VGG (VGG11/13/16/19) 结构简单规整,全部使用 3×3 卷积堆叠,适合教学理解。
ResNet (18/34/50/101/152) 引入残差连接(Residual Block),解决深层网络梯度消失问题,广泛用于各种任务 backbone。
SqueezeNet 参数极少(<5MB),轻量级设计,"Fire Module" 实现高效压缩。
DenseNet 每一层都与后续层直接相连,增强特征复用,减少参数冗余。
Inception v3 / GoogLeNet 使用多分支结构(Inception Module)提升感受野多样性;GoogLeNet 是原始版本,Inception v3 是改进版。
ShuffleNet v2 针对移动端优化,强调内存访问效率(MAC),适合嵌入式设备。
MobileNetV2 / V3 轻量化代表,使用倒置残差 + 线性瓶颈模块;V3 结合 NAS 搜索进一步优化。
ResNeXt 分组卷积 + 残差结构,提升模型表达能力(如 ResNeXt-50)。
Wide ResNet 在 ResNet 基础上加宽通道数,提升性能而非加深层数。
MNASNet 使用神经架构搜索(NAS)自动设计的轻量模型,平衡精度与延迟。
EfficientNet (B0-B7) 使用复合缩放策略统一调整深度、宽度、分辨率,在小模型到大模型间取得最优性能。
RegNet Facebook 提出的新一代 backbone 设计原则,参数更可控,性能优于 ResNeXt。

📌 查看准确率

👉 ImageNet 分类模型性能对比表

1.3.2.语义分割(Semantic Segmentation)

模型在 COCO train2017 的 stuffthingmaps 子集 上训练,输出每个像素的类别标签,共 21 类(含背景):

python 复制代码
classes = [
    'background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle',
    'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
    'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'
]
模型 主干网络(Backbone) 特点
FCN-ResNet50 / FCN-ResNet101 ResNet50/101 全卷积网络鼻祖,端到端像素预测。
DeepLabV3-ResNet50 / DeepLabV3-ResNet101 ResNet50/101 使用空洞卷积(ASPP)扩大感受野,边界处理更好。
LR-ASPP MobileNetV3-Large MobileNetV3-Large 轻量级实时分割模型,适用于移动场景。
DeepLabV3-MobileNetV3-Large MobileNetV3-Large 高精度轻量分割方案,兼顾速度与效果。

🎯 输出形式:(N, num_classes, H, W),需通过 argmax(dim=1) 获取预测类别图。

📊 评估指标

  • Mean IoU (Intersection over Union):平均交并比
  • Pixel Accuracy:全局像素正确率

📌 查看性能指标

👉 语义分割模型性能对比

1.3.3.目标检测、实例分割与关键点检测

模型均在 COCO train2017 数据集上训练,支持以下任务:

📌 类别信息(共 91 类,部分标记为 'N/A')

python 复制代码
COCO_INSTANCE_CATEGORY_NAMES = [
    '__background__', 'person', 'bicycle', 'car', ..., 'toothbrush'
]  # 共 91 类(含背景)

📌 人体关键点名称(共 17 个关键点)

python 复制代码
COCO_PERSON_KEYPOINT_NAMES = [
    'nose',
    'left_eye', 'right_eye',
    'left_ear', 'right_ear',
    'left_shoulder', 'right_shoulder',
    'left_elbow', 'right_elbow',
    'left_wrist', 'right_wrist',
    'left_hip', 'right_hip',
    'left_knee', 'right_knee',
    'left_ankle', 'right_ankle'
]

✅ 支持的模型架构

模型 支持任务 特点
Faster R-CNN 目标检测 两阶段检测器经典之作,精度高,速度适中。
Mask R-CNN 检测 + 实例分割 + 关键点 在 Faster R-CNN 基础上增加 mask head 和 keypoint head,全能型模型。
RetinaNet 目标检测 单阶段检测器,引入 Focal Loss 解决正负样本不平衡问题。
SSD / SSDlite 目标检测 单阶段高速检测器;SSDlite 使用 MobileNet 为主干,适合移动端。

🎯 输出格式(以 Mask R-CNN 为例):

python 复制代码
{
    'boxes': tensor(N, 4),        # 边界框 [x1, y1, x2, y2]
    'labels': tensor(N,),         # 对应类别 ID
    'scores': tensor(N,),         # 置信度得分
    'masks': tensor(N, 1, H, W),  # 实例分割掩码
    'keypoints': tensor(N, 17, 3) # (x, y, visibility)
}

📊 评估指标(COCO 标准)

  • Box AP:边界框平均精度(IoU=0.5:0.95)
  • Mask AP:实例分割 AP
  • Keypoint AP:关键点检测 AP

📌 查看性能指标

👉 目标检测与分割模型性能对比

1.4.torchvision.io(数据读写)

torchvision.io提供了视频、图片和文件的 IO 操作的功能,它们包括读取、写入、编解码处理操作。随着torchvision的发展,io也增加了更多底层的高效率的API。在使用torchvision.io的过程中,我们需要注意以下几点:

  • 不同版本之间,torchvision.io有着较大变化,因此在使用时,需要查看下我们的torchvision版本是否存在你想使用的方法。

  • 除了read_video()等方法,torchvision.io为我们提供了一个细粒度的视频API torchvision.io.VideoReader() ,它具有更高的效率并且更加接近底层处理。在使用时,我们需要先安装ffmpeg然后从源码重新编译torchvision我们才能我们能使用这些方法。

  • 在使用Video相关API时,我们最好提前安装好PyAV这个库。

图像读写(Image I/O)

python 复制代码
import torch
import torchvision.io as io
from torchvision.utils import save_image
import matplotlib.pyplot as plt

# 读取图像为 Tensor (C, H, W),值范围 [0, 255],dtype=torch.uint8
image_tensor = io.read_image("example.jpg")  # 自动判断格式(JPEG/PNG等)

print(image_tensor.shape)  # e.g., torch.Size([3, 480, 640])
print(image_tensor.dtype)  # torch.uint8

# 写入图像
io.write_jpeg(image_tensor, "output.jpg")        # 仅支持 uint8
io.write_png(image_tensor, "output.png")

# 转换为 float 并归一化用于模型输入
image_float = image_tensor.float() / 255.0

1.5.torchvision.ops(视觉操作)

这些操作在目标检测、分割等任务中至关重要。

torchvision.ops 为我们提供了许多计算机视觉的特定操作,包括但不仅限于NMS,RoIAlign(MASK R-CNN中应用的一种方法),RoIPool(Fast R-CNN中用到的一种方法)。在合适的时间使用可以大大降低我们的工作量,避免重复的造轮子,想看更多的函数介绍可以点击这里进行细致查看。

✅ 1. NMS(非极大值抑制)

python 复制代码
from torchvision.ops import nms
import torch

boxes = torch.tensor([
    [0, 0, 100, 100],
    [50, 50, 150, 150],
    [80, 80, 180, 180]
], dtype=torch.float)

scores = torch.tensor([0.9, 0.8, 0.7])

keep_indices = nms(boxes, scores, iou_threshold=0.5)
print(keep_indices)  # 保留的框索引,如 tensor([0, 2])

1.6.torchvision.utils(可视化)

torchvision.utils 为我们提供了一些可视化的方法,可以帮助我们将若干张图片拼接在一起、可视化检测和分割的效果。具体方法可以点击这里进行查看。

总的来说,torchvision的出现帮助我们解决了常见的计算机视觉中一些重复且耗时的工作,并在数据集的获取、数据增强、模型预训练等方面大大降低了我们的工作难度,可以让我们更加快速上手一些计算机视觉任务。

1. 图像网格拼接(make_grid

python 复制代码
# -*- coding: utf-8 -*-
"""
可视化工具示例:使用 torchvision.utils.make_grid 和 draw_bounding_boxes
展示图像网格拼接与目标检测结果可视化
"""

import torch
import torchvision.transforms as transforms
from torchvision.utils import make_grid, draw_bounding_boxes
from torchvision.io import read_image
from PIL import Image
import matplotlib.pyplot as plt

# -------------------------------
# 1. 图像网格拼接(make_grid 示例)
# -------------------------------

# 生成一些随机图像数据(模拟模型输出或数据集样本)
# 假设是 [-1, 1] 范围内的张量(例如 GAN 输出)
images = torch.randn(16, 3, 64, 64)

# 方法一:使用 normalize=True 自动归一化到 [0,1]
# ❌ 错误写法(旧版): range=(-1, 1)
# grid = make_grid(images, nrow=4, padding=2, normalize=True, range=(-1, 1))

# ✅ 正确写法(新版本推荐)
grid = make_grid(images, nrow=4, padding=2, normalize=True)  # 自动处理 [-1,1] -> [0,1]

# 显示图像网格
plt.figure(figsize=(8, 8))
plt.imshow(grid.permute(1, 2, 0).numpy())  # CHW -> HWC
plt.axis("off")
plt.title("Image Grid (Normalized)")
plt.show()

# -------------------------------
# 2. 加载真实图像并绘制边界框
# -------------------------------

# 尝试读取本地图片(请确保路径正确,或替换为你的图片路径)
image_path = "example.jpg"  # 修改为你自己的图片路径

try:
    image_tensor = read_image(image_path)  # (C, H, W), dtype=torch.uint8
except FileNotFoundError:
    print(f"[警告] 找不到 {image_path},使用随机图像代替。")
    image_tensor = (torch.rand(3, 256, 384) * 255).to(torch.uint8)

# 定义一些边界框(格式:[x1, y1, x2, y2])
boxes = torch.tensor([
    [50, 50, 200, 200],
    [100, 150, 300, 250]
])

labels = ["Person", "Car"]
colors = ["red", "blue"]

# 使用 draw_bounding_boxes 绘制框(返回 uint8 tensor)
try:
    image_with_boxes = draw_bounding_boxes(
        image_tensor,
        boxes=boxes,
        labels=labels,
        colors=colors,
        width=3,
        font_size=20  # 如果提示找不到字体,可尝试注释此行
    )
except TypeError as e:
    if "font_size" in str(e):
        print("[提示] font_size 不支持,可能是 torchvision 版本较老,忽略该参数。")
        image_with_boxes = draw_bounding_boxes(
            image_tensor,
            boxes=boxes,
            labels=labels,
            colors=colors,
            width=3
        )
    else:
        raise e

# 转为 PIL 图像显示
pil_image = Image.fromarray(image_with_boxes.permute(1, 2, 0).numpy())
pil_image.show()  # 或者用 plt 显示
相关推荐
AngelPP15 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年15 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
AI探索者15 小时前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者15 小时前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
九狼15 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS15 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区16 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈16 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
FishCoderh17 小时前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅17 小时前
Python函数入门详解(定义+调用+参数)
python