基于Python的图像分类模型训练与部署实践

今天 2阅读

在人工智能飞速发展的今天,计算机视觉技术已成为众多应用的核心。其中,图像分类作为计算机视觉的基础任务之一,广泛应用于人脸识别、自动驾驶、医学影像分析等领域。本文将从零开始,介绍如何使用深度学习框架PyTorch构建一个图像分类模型,并实现其训练与部署。

我们将完成以下目标:

使用PyTorch构建卷积神经网络(CNN)模型;在CIFAR-10数据集上进行模型训练;模型评估与测试;将训练好的模型导出为ONNX格式,并使用ONNX Runtime进行推理部署。

环境准备

在开始之前,请确保你已安装以下依赖库:

pip install torch torchvision onnx onnxruntime

数据准备与预处理

我们使用经典的CIFAR-10数据集,它包含60,000张32x32彩色图像,分为10个类别。

import torchfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoader# 数据预处理transform = transforms.Compose([    transforms.ToTensor(),    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# 加载训练集和测试集train_dataset = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)test_dataset = datasets.CIFAR10(root='./data', train=False, transform=transform, download=True)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

构建模型:简单的卷积神经网络

我们将构建一个简单的CNN模型用于图像分类。

import torch.nn as nnimport torch.nn.functional as Fclass SimpleCNN(nn.Module):    def __init__(self):        super(SimpleCNN, self).__init__()        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)        self.fc1 = nn.Linear(64 * 8 * 8, 512)        self.fc2 = nn.Linear(512, 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, 64 * 8 * 8)        x = F.relu(self.fc1(x))        x = self.fc2(x)        return xmodel = SimpleCNN()print(model)

训练模型

接下来我们定义损失函数和优化器,并进行模型训练。

import torch.optim as optimdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")model.to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练函数def train_model(model, num_epochs=10):    model.train()    for epoch in range(num_epochs):        running_loss = 0.0        for images, labels in train_loader:            images, labels = images.to(device), labels.to(device)            optimizer.zero_grad()            outputs = model(images)            loss = criterion(outputs, labels)            loss.backward()            optimizer.step()            running_loss += loss.item()        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')train_model(model, num_epochs=10)

模型评估

在测试集上评估模型性能。

def evaluate_model(model):    model.eval()    correct = 0    total = 0    with torch.no_grad():        for images, labels in test_loader:            images, labels = images.to(device), labels.to(device)            outputs = model(images)            _, predicted = torch.max(outputs.data, 1)            total += labels.size(0)            correct += (predicted == labels).sum().item()    print(f'Test Accuracy: {100 * correct / total:.2f}%')evaluate_model(model)

模型保存与导出为ONNX格式

训练完成后,我们可以将模型保存并转换为ONNX格式以便跨平台部署。

# 保存模型权重torch.save(model.state_dict(), 'simple_cnn.pth')# 导出为ONNX格式dummy_input = torch.randn(1, 3, 32, 32).to(device)onnx_path = 'simple_cnn.onnx'torch.onnx.export(model, dummy_input, onnx_path, export_params=True,                  opset_version=10, do_constant_folding=True,                  input_names=['input'], output_names=['output'],                  dynamic_axes={'input': {0: 'batch_size'},                                'output': {0: 'batch_size'}})print('Model has been converted to ONNX')

使用ONNX Runtime进行推理

我们可以使用ONNX Runtime加载ONNX模型并进行预测。

import numpy as npimport onnxruntime as ort# 加载ONNX模型ort_session = ort.InferenceSession('simple_cnn.onnx')# 获取测试集中一张图片进行预测images, labels = next(iter(test_loader))sample_image = images[0].unsqueeze(0).numpy()# 推理outputs = ort_session.run(    None,    {'input': sample_image})predicted_class = np.argmax(outputs[0], axis=1)print(f'Predicted class: {predicted_class[0]}, Actual class: {labels[0]}')

总结

本文介绍了使用PyTorch构建图像分类模型的完整流程,包括数据预处理、模型构建、训练、评估、保存以及部署到ONNX Runtime的过程。通过这一系列步骤,开发者可以快速实现从模型开发到实际部署的全流程。

未来的工作可以包括:

使用更复杂的模型如ResNet、EfficientNet等提升准确率;引入数据增强技术以提高泛化能力;在移动端或Web端部署模型;使用TensorRT等工具进一步加速推理过程。

深度学习的应用正在不断拓展边界,掌握这些技能将帮助你在AI领域走得更远。


参考文献

PyTorch官方文档 ONNX官方文档 CIFAR-10 Dataset - https://www.cs.toronto.edu/~kriz/cifar.html
免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第26700名访客 今日有19篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!