要求实现一个软件系统完成图像的分类任务。 技术要求:使用 Python 完成软件系统的实现并给出具体代码。可以软件实现为单个桌面 程序,也可以使用 Web 技术设计用户界面,而图片识别的 AI 模型则部署在后端。 AI 模型可以使用 OpenCV 与 PyTorch 实现。 功能要求: 要求该软件系统提高友好的图形用户界面和以下两个基本功能: 1. 允许用户从测试集中挑选图片,并给出对该图片的分类结果。 2. 允许用户上传图片,并给出分类结果。 测试数据来源: CIFAR-10 数据集 https://www.cs.toronto.edu/~kriz/cifar.html
时间: 2023-06-26 07:09:10 浏览: 126
利用pytorch对CIFAR数据进行图像分类(包含全套代码和10+个模型的实现)
5星 · 资源好评率100%
好的,这是一个比较大的项目,需要分几个步骤来完成。
1. 数据集的准备
首先需要从CIFAR-10数据集中获取训练集和测试集。可以使用Python的`torchvision`库来导入这个数据集。具体代码如下:
```python
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)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
# 定义数据加载器
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
```
2. 构建模型
接下来需要构建一个图像分类的AI模型。这里可以使用PyTorch来实现。我们可以选择使用预训练的ResNet模型,也可以自己定义一个卷积神经网络。
```python
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import models
# 使用预训练的 ResNet 模型
model = models.resnet18(pretrained=True)
# 替换最后一层全连接层
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
```
3. 训练模型
有了模型和数据集之后,我们就可以开始训练模型了。这里可以使用PyTorch提供的训练循环来完成训练过程。
```python
for epoch in range(2): # 训练两个 epoch
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 获取输入数据
inputs, labels = data
# 梯度清零
optimizer.zero_grad()
# 前向传播、计算损失、反向传播、更新参数
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 记录损失
running_loss += loss.item()
if i % 2000 == 1999: # 每 2000 个 minibatch 打印一次损失
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
```
4. 测试模型
训练好模型之后,我们需要测试一下模型的准确率。同样可以使用PyTorch提供的测试循环来完成测试过程。
```python
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))
```
5. 构建图形用户界面
最后一步是构建一个图形用户界面,让用户可以方便地使用我们训练好的模型进行图像分类。这里可以使用Python的GUI库`tkinter`来完成。
```python
import tkinter as tk
from PIL import Image, ImageTk
# 创建 GUI 窗口
window = tk.Tk()
window.title("Image Classification")
window.geometry("400x400")
# 定义 GUI 元素
label = tk.Label(window, text="Choose an image:")
label.pack()
button1 = tk.Button(window, text="Select Image", command=select_image)
button1.pack()
button2 = tk.Button(window, text="Classify Image", command=classify_image)
button2.pack()
text = tk.Text(window, height=10, width=50)
text.pack()
image_label = tk.Label(window)
image_label.pack()
# 启动 GUI 循环
window.mainloop()
```
在这个GUI界面中,我们需要定义两个按钮,一个用于选择图片,一个用于对选中的图片进行分类。还需要在界面中显示图片和分类结果。
6. 完整代码
下面是完整的Python代码,包括数据集的导入、模型的构建、训练过程、测试过程和GUI界面的构建。
```python
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import models
import tkinter as tk
from PIL import Image, ImageTk
import urllib.request
import io
# 数据集的准备
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
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)
# 构建模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(2):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 2000 == 1999:
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
# 测试模型
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))
# 构建图形用户界面
def select_image():
global image_file
image_path = tk.filedialog.askopenfilename()
image_file = Image.open(image_path)
image_file.thumbnail((250, 250))
img = ImageTk.PhotoImage(image_file)
image_label.configure(image=img)
image_label.image = img
def classify_image():
global image_file
if not image_file:
return
with torch.no_grad():
image_tensor = transform(image_file)
image_tensor = image_tensor.unsqueeze(0)
outputs = model(image_tensor)
_, predicted = torch.max(outputs.data, 1)
text.delete(1.0, tk.END)
text.insert(tk.END, "Classified as: " + classes[predicted.item()])
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
window = tk.Tk()
window.title("Image Classification")
window.geometry("400x400")
label = tk.Label(window, text="Choose an image:")
label.pack()
button1 = tk.Button(window, text="Select Image", command=select_image)
button1.pack()
button2 = tk.Button(window, text="Classify Image", command=classify_image)
button2.pack()
text = tk.Text(window, height=10, width=50)
text.pack()
image_label = tk.Label(window)
image_label.pack()
window.mainloop()
```
这个程序可以在本地环境中运行,但需要注意一些库的安装和数据集的导入。如果要部署到Web环境中,还需要使用一些Web框架(如Flask)来实现后端。
阅读全文