19 PyTorch 图像分类项目学习教程

19 PyTorch 图像分类项目学习教程

本文将带领你从零开始,使用 PyTorch 完成一个基本的图像分类项目。以下是项目结构和步骤:

1. 项目准备

1.1 环境搭建

首先,确保你的计算机上安装了以下依赖库:

1
pip install torch torchvision matplotlib

1.2 数据集选择

我们将使用 CIFAR-10 数据集。这个数据集由 10 个类的 60,000 张 32x32 彩色图像组成。

1.3 导入必要的库

1
2
3
4
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt

2. 数据加载

2.1 数据预处理

在加载数据之前,我们需要进行一些数据预处理,例如裁剪、缩放和标准化。

1
2
3
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

2.2 下载数据集

我们使用 torchvision 来下载 CIFAR-10 数据集。

1
2
3
4
5
6
7
8
9
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)

2.3 查看数据

让我们查看一些数据以了解数据集的结构。

1
2
3
4
5
6
7
8
9
10
11
dataiter = iter(trainloader)
images, labels = next(dataiter)

# 展示图像
def imshow(img):
img = img / 2 + 0.5 # 非标准化
plt.imshow(img.numpy().transpose((1, 2, 0)))
plt.show()

imshow(images[0])
print('Label:', labels[0].item())

3. 构建模型

我们将构建一个简单的卷积神经网络 (CNN)。

3.1 模型定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x

net = Net()

4. 定义损失函数和优化器

4.1 设置损失函数和优化器

我们将使用交叉熵损失函数和随机梯度下降优化器。

1
2
3
4
import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

5. 训练模型

5.1 训练循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for epoch in range(2):  # 训练 2 个 epoch
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data

# 清零优化器的梯度
optimizer.zero_grad()

# 正向 + 反向 + 优化
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()

# 打印统计信息
running_loss += loss.item()
if i % 2000 == 1999: # 每 2000 个小批量打印一次
print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0

print('Finished Training')

6. 测试模型

6.1 测试过程

1
2
3
4
5
6
7
8
9
10
11
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')

6.2 各类别的准确率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 获取所有类别的准确率
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))

with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
c = (predicted == labels).squeeze()
for i in range(4): # batch_size
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1

for i in range(10):
print(f'Accuracy of {classes[i]:5s} : {100 * class_correct[i] / class_total[i]:2.2f} %')

7. 小结

通过上述步骤,我们成功构建了一个简单的图像分类模型,使用 PyTorch 进行训练和测试。你可以进一步尝试改进模型,调整超参数,并使用其他更复杂的模型架构。

希望本教程对你学习 PyTorch 有所帮助!继续深入学习和实践,你将会有更深入的理解。

对象检测项目

对象检测项目

在这一小节中,我们将详细介绍如何使用 PyTorch 来进行对象检测,具体包括数据准备、模型选择、训练和评估四个部分。

1. 数据准备

在进行对象检测之前,我们需要准备适当的数据集,常用的数据集有 PASCAL VOC、COCO、KITTI 等。假设我们使用 COCO 数据集。

1.1 数据集下载

你可以从 COCO 数据集的官方网站下载数据集:

1.2 数据集格式

COCO 数据集的标注文件是以 JSON 格式存储的,包含了图像文件名、目标类别、边界框坐标等信息。边界框的信息通常是以 [x_min, y_min, width, height] 的形式给出。

1.3 数据预处理

为了使得数据可以被模型有效地使用,我们需要进行以下预处理:

  • 图像缩放
  • 数据增强
  • 标注格式转换

可以使用 torchvision 中的 transforms 来进行图像预处理。

1
2
3
4
5
6
7
import torchvision.transforms as transforms

transform = transforms.Compose([
transforms.ToPILImage(),
transforms.Resize((256, 256)),
transforms.ToTensor(),
])

2. 模型选择

PyTorch 提供了许多预训练的模型,我们可以直接利用这些模型加速我们的对象检测任务。对于对象检测,我们可以使用以下几个模型:

  • Faster R-CNN
  • RetinaNet
  • YOLO

这里我们使用 Faster R-CNN 作为示范。

2.1 导入模型

1
2
3
4
5
6
7
import torchvision.models.detection as detection

# 加载预训练的模型
model = detection.fasterrcnn_resnet50_fpn(pretrained=True)

# 将模型切换到评估模式
model.eval()

2.2 修改模型

如果你需要检测自定义类别,可以通过修改模型的最终层来适应新的类别数量。

1
2
3
4
5
num_classes = 3  # 假设我们要检测 3 种类别
in_features = model.roi_heads.box_predictor.cls_score.in_features

# 替换掉原来的预测头
model.roi_heads.box_predictor = detection.faster_rcnn.FastRCNNPredictor(in_features, num_classes)

3. 训练模型

在这一部分,我们将模型训练到一个新的数据集上。

3.1 创建数据加载器

为了加载和处理数据,我们需要定义一个 DatasetDataLoader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from torch.utils.data import Dataset, DataLoader

class CustomDataset(Dataset):
def __init__(self, transform=None):
# 初始化数据集,加载图像文件和标注
self.transform = transform

def __getitem__(self, idx):
# 加载图像和目标
pass # 实现标注文件读取和图像加载

def __len__(self):
# 返回数据集大小
pass # 返回图像数量

# 创建 DataLoader
dataset = CustomDataset(transform=transform)
data_loader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=4)

3.2 训练循环

训练循环中将包含正向传播、损失计算和反向传播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import torch

num_epochs = 10
for epoch in range(num_epochs):
for images, targets in data_loader:
images = [img.to(device) for img in images]
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]

loss_dict = model(images, targets)
losses = sum(loss for loss in loss_dict.values())

# 清空梯度
optimizer.zero_grad()
# 反向传播
losses.backward()
# 更新参数
optimizer.step()

4. 评估模型

训练后需要评估模型的表现,通常使用 mAP(mean Average Precision)作为评价指标。

4.1 评估函数

你可以使用 torchvision 提供的评估工具来计算 mAP。

1
2
3
4
5
6
7
8
from torchvision.models.detection import fasterrcnn_resnet50_fpn

model.eval()
with torch.no_grad():
for images, targets in data_loader:
images = [img.to(device) for img in images]
predictions = model(images)
# 计算 mAP

结束

在本小节中,我们概述了如何在 PyTorch 中进行对象检测的基本步骤。从数据准备到模型选择、训练和评估。通过这些步骤,你可以构建并训练自己的对象检测模型,并应用于相关的实际问题中。更多高级技巧和细节则需要在不断实践中进行探索和学习。

21 PyTorch 图像生成项目教程

21 PyTorch 图像生成项目教程

在本节中,我们将创建一个使用 PyTorch 的图像生成项目。我们将使用生成对抗网络(GANs)来生成图像。这是一个相对简单的示例,旨在帮助您快速上手 PyTorch 并理解其基本概念。

1. 环境准备

在开始之前,确保您已安装必要的库。可以使用以下命令来安装 PyTorch 和其他依赖库:

1
pip install torch torchvision matplotlib

2. 数据集

我们将使用 CIFAR-10 数据集,该数据集包含 60,000 张 32x32 的彩色图像分为 10 个类别。我们将使用 torchvision 来下载和加载数据集。

1
2
3
4
5
6
7
8
9
10
11
12
import torchvision
import torchvision.transforms as transforms

# 定义转换方式
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])

# 加载 CIFAR-10 数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

3. 定义生成对抗网络

3.1 判别器(Discriminator)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import torch
import torch.nn as nn

class Discriminator(nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
self.model = nn.Sequential(
nn.Linear(32*32*3, 128),
nn.LeakyReLU(0.2),
nn.Linear(128, 1),
nn.Sigmoid()
)

def forward(self, x):
x = x.view(x.size(0), -1) # Flatten the input
return self.model(x)

3.2 生成器(Generator)

1
2
3
4
5
6
7
8
9
10
11
12
class Generator(nn.Module):
def __init__(self):
super(Generator, self).__init__()
self.model = nn.Sequential(
nn.Linear(100, 128),
nn.ReLU(),
nn.Linear(128, 32*32*3),
nn.Tanh()
)

def forward(self, z):
return self.model(z).view(-1, 3, 32, 32) # Reshape to match CIFAR-10 dimensions

4. 训练模型

4.1 定义训练过程

我们将实现 GAN 的训练过程,包括更新生成器和判别器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import torch.optim as optim

# 初始化模型
discriminator = Discriminator()
generator = Generator()

# 定义损失函数
criterion = nn.BCELoss()

# 优化器
optimizer_d = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))
optimizer_g = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))

# 训练循环
num_epochs = 50
for epoch in range(num_epochs):
for i, (images, _) in enumerate(trainloader):
# 更新判别器
discriminator.zero_grad()

# 真实图像标签和生成图像标签
real_labels = torch.ones(images.size(0), 1)
fake_labels = torch.zeros(images.size(0), 1)

# 计算损失
outputs = discriminator(images)
d_loss_real = criterion(outputs, real_labels)

z = torch.randn(images.size(0), 100)
fake_images = generator(z)
outputs = discriminator(fake_images.detach())
d_loss_fake = criterion(outputs, fake_labels)

d_loss = d_loss_real + d_loss_fake
d_loss.backward()
optimizer_d.step()

# 更新生成器
generator.zero_grad()
outputs = discriminator(fake_images)
g_loss = criterion(outputs, real_labels)
g_loss.backward()
optimizer_g.step()

print(f'Epoch [{epoch+1}/{num_epochs}], d_loss: {d_loss.item():.4f}, g_loss: {g_loss.item():.4f}')

5. 生成与可视化图像

我们将使用生成器生成图像并将其可视化。

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt

# 生成图像
z = torch.randn(64, 100)
fake_images = generator(z).detach()

# 可视化
grid = torchvision.utils.make_grid(fake_images, nrow=8, normalize=True)
plt.imshow(grid.permute(1, 2, 0).numpy())
plt.title('Generated Images')
plt.axis('off')
plt.show()

6. 总结

在本节中,我们学习了如何使用 PyTorch 实现简单的生成对抗网络(GAN)。我们定义了判别器和生成器模型,加载了 CIFAR-10 数据集,并实现了训练过程。最后,我们使用生成器生成并可视化了一组图像。

继续学习可以探索更复杂的网络架构和技术,比如条件 GANs、生成对抗网络的改进等。