PyTorch实战指南:从零搭建计算机视觉模型的完整流程 - 教程

本文将手把手带你完成从环境搭建到模型部署的完整CV模型开发流程,涵盖PyTorch基础、模型设计、训练优化和实际应用。

一、环境配置与基础准备

1.1 PyTorch安装与GPU环境配置

PyTorch的安装需要根据硬件和软件环境选择合适版本。对于GPU用户,确保CUDA工具包与显卡驱动兼容是关键。

安装步骤

# 使用conda创建虚拟环境
conda create -n pytorch-cv python=3.9
conda activate pytorch-cv
# 安装PyTorch(根据CUDA版本选择)
# CUDA 11.7版本
conda install pytorch torchvision torchaudio cudatoolkit=11.7 -c pytorch
# 仅CPU版本
conda install pytorch torchvision torchaudio cpuonly -c pytorch

验证GPU可用性

import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"GPU可用: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"GPU设备: {torch.cuda.get_device_name(0)}")

1.2 常用CV库介绍

完整的CV开发环境需要以下核心库支持:

  • OpenCV:图像处理和计算机视觉基础操作

  • PIL/Pillow:图像加载和基本变换

  • torchvision:PyTorch视觉工具库,提供数据集、模型和变换

  • Matplotlib:结果可视化和数据展示

安装命令

pip install opencv-python pillow matplotlib torchvision

1.3 数据加载与预处理

PyTorch提供Dataset和DataLoader类来高效管理数据加载。

自定义Dataset示例

from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
class CustomDataset(Dataset):
    def __init__(self, data_path, transform=None):
        self.data = []  # 加载数据路径和标签
        self.transform = transform
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        image, label = self.data[idx]
        if self.transform:
            image = self.transform(image)
        return image, label
# 数据预处理流程
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                       std=[0.229, 0.224, 0.225])
])
# 创建DataLoader
dataset = CustomDataset('./data', transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

二、模型架构设计

2.1 经典CNN结构解析

从简单的LeNet到复杂的ResNet,CNN架构不断演进但核心思想不变。

LeNet-5实现(MNIST手写数字识别):

import torch.nn as nn
class LeNet5(nn.Module):
    def __init__(self, num_classes=10):
        super(LeNet5, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(1, 6, kernel_size=5, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(6, 16, kernel_size=5),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.classifier = nn.Sequential(
            nn.Linear(16 * 5 * 5, 120),
            nn.ReLU(),
            nn.Linear(120, 84),
            nn.ReLU(),
            nn.Linear(84, num_classes)
        )
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

ResNet残差块实现

class ResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3,
                              stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.
posted @ 2025-12-04 13:44  gccbuaa  阅读(9)  评论(0)    收藏  举报