项目背景:
随着人工智能和深度学习技术的迅速发展,图像分类任务在计算机视觉领域取得了显著的成就。在日常生活中,猫和狗是人们常见且喜爱的宠物,对它们进行准确的分类具有一定的实际需求和应用价值。
同时,大规模的图像数据集的可用性以及强大的计算资源的普及,为开展基于深度学习的图像分类研究提供了良好的条件。此外,深度学习在图像识别领域的卓越表现,使得其能够处理复杂的图像特征,从而为实现高精度的猫狗分类提供了技术支持。
项目目的:
探索和应用深度学习技术在图像分类任务中的有效性和潜力,特别是在处理具有相似特征的猫和狗图像时。提高对猫狗图像的分类准确率,为相关的图像识别应用提供可靠的模型和算法。深入理解深度学习模型在学习和提取图像特征方面的机制,通过对猫狗分类的研究,优化模型结构和训练参数,以提升模型的性能和泛化能力。为动物保护、宠物管理等领域提供技术支持,例如自动识别流浪猫狗、辅助宠物医疗诊断等。培养和提升团队在深度学习、计算机视觉和数据处理方面的技术能力和创新思维摘要:本文介绍了使用深度学习技术实现猫狗分类的项目,包括数据预处理、模型选择、训练过程以及结果评估。通过这个项目,我们能够深入了解深度学习在图像分类任务中的应用。
在计算机视觉领域,图像分类是一个基础且重要的任务。猫狗分类作为一个经典的二分类问题,具有较高的研究价值和实际应用场景。通过对大量的猫狗图片进行学习,我们可以训练出一个能够准确区分猫狗的模型。
import torch.optim as optim
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.optim
import torch.utils.data
import torch.utils.data.distributed
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models
from torch.autograd import Variable
from tqdm import tqdm
import os
from PIL import Image
import cv2
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
DEVICE
数据清洗transform111 = {
'train': transforms.Compose([
transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
transforms.RandomRotation(degrees=15),
transforms.RandomHorizontalFlip(),
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(size=256),
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
])
}
transform111
torchvision.transforms包DataLoader是 Pytorch 重要的特性,它们使得数据增加和加载数据变得非常简单。 使用 DataLoader 加载数据的时候就会将之前定义的数据 transform 就会应用的数据上了。
代码如下
import shutil
modellr = 1e-3
BATCH_SIZE = 64
EPOCHS = 100
for root, dirs, files in os.walk('./dataset'):
for file in files:
if 'ipynb_checkpoints' in file:
os.remove(os.path.join(root, file))
if 'ipynb_checkpoints' in root:
shutil.rmtree(root)
dataset_train = datasets.ImageFolder('dataset/train', transform111)
print(dataset_train.imgs)
print(dataset_train.class_to_idx)
dataset_test = datasets.ImageFolder('dataset/val', transform111)
print(dataset_test.class_to_idx)
dataset = './dataset'
train_directory = os.path.join(dataset, 'train')
valid_directory = os.path.join(dataset, 'val')
batch_size = 32
num_classes = 6
print(train_directory)
data = {
'train': datasets.ImageFolder(root=train_directory, transform=transform111['train']),
'val': datasets.ImageFolder(root=valid_directory, transform=transform111['val'])
}
train_data_size = len(data['train'])
valid_data_size = len(data['val'])
train_loader = torch.utils.data.DataLoader(data['train'], batch_size=batch_size, shuffle=True, num_workers=8)
test_loader = torch.utils.data.DataLoader(data['val'], batch_size=batch_size, shuffle=True, num_workers=8)
print(train_data_size, valid_data_size)
由于我们的数据量相对有限,采用迁移学习的方法,利用在大规模数据集上预训练好的模型参数,然后在我们的猫狗数据集上进行微调。
代码如下:
model = torchvision.models.resnet50(pretrained=False)
model
为了适应自己的数据集,将ResNet-50的最后一层替换为,将原来最后一个全连接层的输入喂给一个有256个输出单元的线性层,接着再连接ReLU层和Dropout层,然后是256 x 2的线性层,输出为 2通道的softmax层。
criterion = nn.CrossEntropyLoss()
num_ftrs = model.fc.in_features
model.fc = nn.Sequential(
nn.Linear(num_ftrs, 256),
nn.ReLU(),
nn.Dropout(0.4),
nn.Linear(256, 6),
nn.LogSoftmax(dim=1)
)
model.to(DEVICE)
optimizer = optim.Adam(model.parameters(), lr=modellr)
def adjust_learning_rate(optimizer, epoch):
modellrnew = modellr * (0.1 ** (epoch // 50))
print("lr:", modellrnew)
for param_group in optimizer.param_groups:
param_group['lr'] = modellrnew
def train(model, device, train_loader, optimizer, epoch):
model.train()
sum_loss = 0
train_acc = 0
total_num = len(train_loader.dataset)
for batch_idx, (data, target) in enumerate(tqdm(train_loader)):
data, target = Variable(data).to(device), Variable(target).to(device)
im = Variable(data)
output = model(data)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print_loss = loss.data.item()
sum_loss += print_loss
out_t = output.argmax(dim=1)
num_correct = (out_t == target).sum().item()
acc = num_correct / im.shape[0]
train_acc += acc
if (batch_idx + 1) % 50 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]tLoss: {:.6f}'.format(
epoch, (batch_idx + 1) * len(data), len(train_loader.dataset),
100. * (batch_idx + 1) / len(train_loader), loss.item()))
ave_loss = sum_loss / len(train_loader)
ave_acc = train_acc / len(train_loader)
print('epoch:{}, train_acc: {}, loss:{}'.format(epoch, ave_acc, ave_loss))
return ave_acc, ave_loss
def val(model, device, test_loader):
model.eval()
test_loss = 0
correct = 0
total_num = len(test_loader.dataset)
with torch.no_grad():
for data, target in test_loader:
data, target = Variable(data).to(device), Variable(target).to(device)
output = model(data)
loss = criterion(output, target)
_, pred = torch.max(output.data, 1)
correct += torch.sum(pred == target)
print_loss = loss.data.item()
test_loss += print_loss
correct = correct.data.item()
acc = correct / total_num
avgloss = test_loss / len(test_loader)
print('Val set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)n'.format(
avgloss, correct, len(test_loader.dataset), 100 * acc))
return acc, avgloss
train_acc_list, train_loss_list, val_acc_list, val_loss_list = [], [], [], []
for epoch in range(1, EPOCHS + 1):
adjust_learning_rate(optimizer, epoch)
train_acc, train_loss = train(model, DEVICE, train_loader, optimizer, epoch)
val_acc, val_loss = val(model, DEVICE, test_loader)
train_acc_list.append(train_acc)
val_acc_list.append(val_acc)
train_loss_list.append(train_loss)
val_loss_list.append(val_loss)
torch.save(model, 'model.pth')
import matplotlib.pyplot as plt
epochs_range = range(EPOCHS)
print(epochs_range, train_acc_list)
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, train_acc_list, label='Training Accuracy')
plt.plot(epochs_range, val_acc_list, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss_list, label='Training Loss')
plt.plot(epochs_range, val_loss_list, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.savefig('./acc-loss.jpg')
import torch.utils.data.distributed
import torchvision.transforms as transforms
import torchvision.datasets as datasets
from torch.autograd import Variable
from pathlib import Path
classes = ('cat', 'dog')
transform_test = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = torch.load("model.pth")
model.eval()
model.to(DEVICE)
dataset_test = datasets.ImageFolder('dataset/test', transform_test)
print(len(dataset_test))
y_true, y_sore = [], []
for index in range(len(dataset_test)):
item = dataset_test[index]
img, label = item
img.unsqueeze_(0)
data = Variable(img).to(DEVICE)
output = model(data)
_, pred = torch.max(output.data, 1)
y_true.append(label)
y_sore.append(pred.data.item())
print('Image Name:{}, label:{}, predict:{}'.format(dataset_test.imgs[index][0], classes[label], classes[pred.data.item()]))
index += 1
通过本次猫狗分类项目的实践,我们深入掌握了深度学习在图像分类中的应用技术。未来,可以进一步探索更先进的模型架构和训练方法,提高分类的准确率和泛化能力,并将其应用到更广泛的图像分类任务中。
相关知识
基于深度学习的猫狗分类实战
基于tensorflow深度学习的猫狗分类识别
基于度学习的猫狗分类识别
基于深度学习的猫狗图片分类研究(数据集+实验代码+4000字实验报告)
深度学习实战:基于CNN的猫狗图像识别
基于YOLOv8深度学习的200种鸟类智能检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
一种基于深度学习的狗叫情感识别方法及装置与流程
基于YOLOv8深度学习的120种犬类检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战、狗类检测、犬种识别
深度学习图像处理04:图像分类模型训练实战——动物分类
基于深度学习的宠物狗活动监测系统设计
网址: 基于深度学习的猫狗分类实战 https://m.mcbbbk.com/newsview480389.html
上一篇: 原创 若 |
下一篇: 怎么教狗狗拜拜动作 |