图像分类模板——有数据集即可实现图像分类任务

目录

一.如何制作/获取数据集?数据集的格式?

1.自己制作数据集

2.从网上下载免费数据集

3.数据集的格式?

二、划分数据集

1.选取需要的数据集(以三分类为例)

2.将数据集划分为训练集和测试集,按照73分

三、图像分类万能模板(基于alexnet的预训练模型)

四、训练过程和训练结果

1.训练过程截图

1.1 jupyter lab

1.2 vs code

2.训练结果截图

五、用训练出的模型去预测(detect)


一.如何制作/获取数据集?数据集的格式?

1.自己制作数据集

按照自己的图像分类任务,依次按类收集图片。(百度平台/自行拍摄……)

2.从网上下载免费数据集

AI Studio平台

3.数据集的格式?

将平台上下载下来的数据集解压后,如下所示:

数据集(目标类1/目标类2/……目标类n)

二、划分数据集

数据集划分为训练集和测试集。

训练集用来训练模型,测试集用来评价模型。

划分前: 数据集(目标类1/目标类2/……/目标类n)

划分后:(82分、73分)

(训练集:目标类1 70%/目标类2 70%/……/目标类n 70%)

(测试集:目标类1 30%/目标类2 30%/……/目标类n 30%)

1.选取需要的数据集(以三分类为例)

从11类中选取3类,我想训练一个识别柴犬、拉布拉多和中华田园犬的模型

这样,我把解压后的文件夹中的这3个文件夹拿到我待制作的数据集文件夹中,如下图所示:

柴犬文件夹照片有89张

2.将数据集划分为训练集和测试集,按照73分

创建train文件夹和test文件夹,将柴犬文件夹、拉布拉多文件夹、中华田园犬文件夹放到train文件夹下。如下图所示:

训练集文件下如下图所示:

将柴犬文件夹改为0,拉布拉多文件夹改为1,中华田园犬文件夹改为2

在1中,刚才我们注意到柴犬文件夹有89张,按照73分,训练集:测试集=62.3:26.7

训练集63张,测试集26张

将train文件夹中的柴犬文件夹的图片保留63张,剩余移到test文件夹下的柴犬文件夹下。如下图所示。

上面是0(柴犬)划分后的结果,1(拉布拉多)、2(中华田园犬)同理。

三、图像分类万能模板(基于alexnet的预训练模型)

下面代码只需要修改4处(代码中我已用中文标出),即可使用。

(1)"划分后的训练集文件夹绝对路径" 、 "划分后的测试集文件夹绝对路径"

(2)图像分类任务的分类数

(3)训练轮数

(4)训练后的模型保存路径

from random import shuffle
from matplotlib import pyplot as plt
import torch
import torchvision
import copy

#一、数据集
#1.1图片增强定义
from torchvision import transforms
train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])
])
test_transform = transforms.Compose([
    transforms.Resize((224,224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])
])

#1.2 datasets
train_dir = r"划分后的训练集文件夹绝对路径"
test_dir = r"划分后的测试集文件夹绝对路径"
train_ds = torchvision.datasets.ImageFolder(
    train_dir,
    transform=train_transform
)
test_ds = torchvision.datasets.ImageFolder(
    test_dir,
    transform=test_transform
)
#1.3 dataloader
BATCHSIZE = 32
train_dl = torch.utils.data.DataLoader(
    train_ds,
    batch_size=BATCHSIZE,
    shuffle = True
)
test_dl = torch.utils.data.DataLoader(
    test_ds,
    batch_size=BATCHSIZE
)
#1.4 输出数据集信息
print("训练集数量:",len(train_ds))
print("测试集数量:",len(test_ds))

#二、创建模型
#2.1 加载alexnet预训练模型
from torch import nn
model = torchvision.models.alexnet(pretrained=True)
for p in model.features.parameters():#卷积层梯度更新冻结
    p.requires_grad = False
model.classifier[-1].out_features = 图像分类任务的分类数
print(model.classifier[-1].out_features)
#2.2查看模型信息
print(model)

#三、模型训练与测试
#3.1 train函数
def train(dl,model,loss_fn,optimizer):
    size = len(dl.dataset)  #数据集总个数
    num_batches = len(dl)  #总批次数

    train_loss, correct = 0,0
    model.train()
    for x,y in dl:  #x,y代表每一批次
        x,y = x.to(device),y.to(device)
        pred = model(x)
        loss = loss_fn(pred,y)  #一个批次上的损失
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        with torch.no_grad():
            #上下文管理器,不会计算梯度
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()  #累加每一个batch下的正确个数
            train_loss += loss.item()  #累加每一个batch的loss
    correct /= size
    train_loss /= num_batches
    return correct,train_loss
#3.2 test函数
def test(test_dl,model,loss_fn):
    size = len(test_dl.dataset)  #数据集总个数
    num_batches = len(test_dl)  #总批次数

    test_loss, correct = 0,0
    model.eval()
    with torch.no_grad():
        for x,y in test_dl:  #x,y代表每一批次
            x,y = x.to(device),y.to(device)
            pred = model(x)
            loss = loss_fn(pred,y)  #一个批次上的损失
            test_loss += loss.item()  #累加每一个batch的loss
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()  #累加每一个batch下的正确个数
        correct /= size
        test_loss /= num_batches
        return correct,test_loss
#3.3 一些参数设置
if torch.cuda.is_available():
    model.to('cuda')
loss_fn = nn.CrossEntropyLoss()
optim = torch.optim.Adam(model.classifier.parameters(),lr=0.0001)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(device)
#训练轮数
epochs = 50
train_loss = []
train_acc = []
test_loss = []
test_acc = []
#训练后的模型保存路径,以,pth结尾
PATH = "./alexnet_pre_first.pth"
best_acc = 0
#3.4 训练和测试循环
#4.开始训练
for epoch in range(epochs):
    epoch_acc,epoch_loss = train(train_dl,model,loss_fn,optim)
    epoch_test_acc,epoch_test_loss = test(test_dl,model,loss_fn)
    if epoch_test_acc > best_acc:
        best_model_wts = copy.deepcopy(model.state_dict())
        best_acc = epoch_test_acc
        torch.save(model, PATH)
#         torch.save(model.state_dict(),PATH)
    train_acc.append(epoch_acc)
    train_loss.append(epoch_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)
    template = ("epoch:{:2d},train_loss:{:.5f},train_acc:{:.1f},test_loss:{:.5f},test_acc:{:.1f}")
    print(template.format(epoch+1,epoch_loss,epoch_acc*100,epoch_test_loss,epoch_test_acc*100))
print("Done")
#3.5训练结果打印输出
print("train_acc",train_acc)
print("train_loss",train_loss)
print("test_acc",test_acc)
print("test_loss",test_loss)
#这部分是将训练结果绘制图形
plt.plot(range(训练轮数),train_loss,label='train_loss')
plt.plot(range(训练轮数),test_loss,label='test_loss')
plt.legend()
plt.show()

plt.plot(range(训练轮数),train_acc,label='train_acc')
plt.plot(range(训练轮数),test_acc,label='test_acc')
plt.legend()
plt.show()
from PIL import Image
#这部分是使用训练出来的模型去预测其它图片
path = r"要预测的图片路径"
#识别种类
classes = ['分类目标0','分类目标1','分类目标n']
#图片处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])
])
#加载预处理模型
model = torch.load(r"训练好的模型文件路径",map_location='cpu')
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = model.to(device)
#对图片进行识别
img = Image.open(path)
img = transform(img)
img = torch.unsqueeze(img,dim=0)  #增加batch维度
model.eval()
with torch.no_grad():
    img = img.to(device)
    pred = model(img)
    pre_gailv = torch.softmax(pred,dim=1)
    pre_label = torch.argmax(pre_gailv).cpu().numpy().item()
    print(classes[pre_label])

四、训练过程和训练结果

1.训练过程截图

什么软件都可以,下面分别是jupyter lab 和vs code进行训练时的截图

1.1 jupyter lab

1.2 vs code

2.训练结果截图

五、用训练出的模型去预测(detect)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
12篇学通csharp网络编程——第四篇 TCP应用编程 12篇学通csharp网络编程——第三篇 HTTP应用编程(下) 12篇学通csharp网络编程——第二篇 HTTP应用编程(上) 12篇学通csharp网络编程——第一篇 基础之进程线程 Lucene(1)lucene,你也会(7篇)——第一篇 快速入门 MongoDB(8)8天学通MongoDB——第八天 驱动实践 8天学通MongoDB——第七天 运维技术 8天学通MongoDB——第六天 分片技术 8天学通MongoDB——第五天 主从复制 8天学通MongoDB——第四天 索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之UML——用例图 团队沟通利器之UML——活动图 wcf系列(5)wcf系列学习5天速成——第五天 服务托管 wcf系列学习5天速成——第四天 wcf之分布式架构 wcf系列学习5天速成——第三天 事务的使用 wcf系列5天速成——第二天 binding的使用(2) wcf系列5天速成——第一天 binding的使用(1) wpf系列(8)8天入门wpf—— 第八天 最后的补充 8天入门wpf—— 第七天 画刷 8天入门wpf—— 第六天 细说控件 8天入门wpf—— 第五天 数据绑定 8天入门wpf—— 第四天 模板 8天入门wpf—— 第三天 样式 8天入门wpf—— 第二天 xaml详解 8天入门wpf—— 第一天 基础概念介绍 并行开发(8)8天玩转并行开发——第八天 用VS性能向导解剖你的程序 8天玩转并行开发——第七天 简要分析任务与线程池 8天玩转并行开发——第六天 异步编程模型 8天玩转并行开发——第五天 同步机制(下) 8天玩转并行开发——第四天 同步机制(上) 8天玩转并行开发——第三天 plinq的使用 8天玩转并行开发——第二天 Task的使用 8天玩转并行开发——第一天 Parallel的使用 多线程系列(5)5天不再惧怕多线程——第五天 线程池 5天不再惧怕多线程——第四天 信号量 5天不再惧怕多线程——第三天 互斥体 5天不再惧怕多线程——第二天 锁机制 5天不再惧怕多线程——第一天 尝试Thread 经典算法专题(21)经典算法题每日演练——第二十一题 十字链表 经典算法题每日演练——第二十题 三元组 经典算法题每日演练——第十九题 双端队列 经典算法题每日演练——第十八题 外排序 经典算法题每日演练——第十七题 Dijkstra算法 经典算法题每日演练——第十六题 Kruskal算法 经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 经典算法题每日演练——第十题 树状数组 经典算法题每日演练——第九题 优先队列 经典算法题每日演练——第八题 AC自动机 经典算法题每日演练——第七题 KMP算法 经典算法题每日演练——第六题 协同推荐SlopeOne 算法 经典算法题每日演练——第五题 字符串相似度 经典算法题每日演练——第四题 最长公共子序列 经典算法题每日演练——第三题 猴子吃桃 经典算法题每日演练——第二题 五家共井 经典算法题每日演练——第一题 百钱买百鸡 开发利器系列(1)介绍一个小工具 Linqer 那点所谓的分布式(2)那点所谓的分布式——memcache 那点所谓的分布式——redis 树结构专题(5)6天通吃树结构—— 第五天 Trie树 6天通吃树结构—— 第四天 伸展树 6天通吃树结构—— 第三天 Treap树 6天通吃树结构—— 第二天 平衡二叉树 6天通吃树结构—— 第一天 二叉查找树 算法速成系列(15)算法系列15天速成——第十五天 图【下】(大结局) 算法系列15天速成——第十四天 图【上】 算法系列15天速成——第十三天 树操作【下】 算法系列15天速成——第十二天 树操作【中】 算法系列15天速成——第十一天 树操作(上) 算法系列15天速成——第十天 栈 算法系列15天速成——第九天 队列 算法系列15天速成——第八天 线性表【下】 算法系列15天速成——第七天 线性表【上】 算法系列15天速成——第六天 五大经典查找【下】 算法系列15天速成——第五天 五大经典查找【中】 算法系列15天速成——第四天 五大经典查找【上】 算法系列15天速成——第三天 七大经典排序【下】 算法系列15天速成——第二天 七大经典排序【中】 算法系列15天速成——第一天 七大经典排序【上】 算法洗脑系列(8)算法洗脑系列(8篇)——第八篇 概率思想 算法洗脑系列(8篇)——第七篇 动态规划 算法洗脑系列(8篇)——第六篇 回溯思想 算法洗脑系列(8篇)——第五篇 分治思想 算法洗脑系列(8篇)——第四篇 枚举思想 算法洗脑系列(8篇)——第三篇 贪心思想 算法洗脑系列(8篇)——第二篇 递归思想 算法洗脑系列(8篇)——第一篇 递推思想 天籁数学(3)天籁数学——数列篇(3) 天籁数学——数列篇(2) 天籁数学——数列篇(1) 图形图像(1)玩玩图形图像——第一篇:图片灰度化 小爬虫系列(4)玩玩小爬虫——抓取时的几个小细节 玩玩小爬虫——抓取动态页面 玩玩小爬虫——试搭小架构 玩玩小爬虫——入门

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值