基于CNN对掌纹图片进行分类

因为临近期末,老师让我们做一个期末项目,因为平时上课都在划水,所以这也是我第一个自己写的深度学习项目,写上博客留作纪念。

数据集是这样的

总共有7000张图片
在这里插入图片描述

首先先导入相关包
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets,transforms
import cv2
定义超参数`
BATCH_SIZE=32 #定义超参数,每次处理32张图片
DEVICE=torch.device("cuda" if torch.cuda.is_available() else "cpu" )#检测电脑上是否有GPU,如果有就使用GPU,如果没有就使用cpu
EPOCHS=20 #将数据集训练20轮
对图片做预处理
Pipline=transforms.Compose(
    [
        transforms.ToTensor( ),#将图片转化为tensor
        transforms.Normalize((0.1307),(0.3081))#降低模型复杂度,官网提供的数据
        
    ]
)#对图像作相应处理
将数据集按照3:1划分训练集和测试集并分到不同文件夹中
import shutil
PATH='C:\\Users\\admin\\Desktop\\deeplearning\\PalmBigDataBase\\'
for i in range(1,386):
    for j in range(1,10):
        if j%3!=0:
            shutil.move(PATH+'P_F_'+str(i)+'_'+str(j)+'.bmp','C:\\Users\\admin\\Desktop\\train') #将一个文件夹下的图片分到不同文件夹
        elif j%3==0:
            shutil.move(PATH+'P_F_'+str(i)+'_'+str(j)+'.bmp','C:\\Users\\admin\\Desktop\\test')
加载数据集
from torch.utils.data import DataLoader
from torch.utils.data import TensorDataset
import numpy as np
import os
import re
import cv2
train_set=[]
train_label=[]
test_set=[]
train_dataset=[]
test_label=[]
test_dataset=[]
for filename in os.listdir('C:\\Users\\admin\\Desktop\\train'):
    imgPath='C:\\Users\\admin\\Desktop\\train'
    img=cv2.imread(imgPath+'\\'+filename,0)#循环读取该目录下的所有图片
    train_label.append(int(re.findall(r"\d+",filename)[0]))#将图片名的第一个数字作为该图片的类
    train_set.append(Pipline(img).numpy().tolist())#对图片作pipline操作后转化为数组
train_dataset=TensorDataset(torch.tensor(train_set),torch.tensor(train_label))#对两个列表进行压缩后作为训练集
for filename in os.listdir('C:\\Users\\admin\\Desktop\\test'):
    imgPath='C:\\Users\\admin\\Desktop\\test'
    img=cv2.imread(imgPath+'\\'+filename,0)
    test_label.append(int(re.findall(r"\d+",filename)[0]))
    test_set.append(Pipline(img).numpy().tolist())
test_dataset=TensorDataset(torch.tensor(test_set),torch.tensor(test_label))#对两个列表进行压缩后作为测试集
TrainLoader=DataLoader(train_dataset,batch_size=BATCH_SIZE,shuffle=True)#加载训练集
TestLoader=DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=True)#加载测试集

关于TensorDataset函数,这篇博客讲的很详细,看了就能懂
https://blog.csdn.net/qq_40211493/article/details/107529148

构建cnn网络
class net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1=nn.Conv2d(1,10,5)#进行2d卷积,因为是灰度图像,所以初试通道是1。输入通道为1,输出通道是10,进行5*5的2d卷积
        self.conv2=nn.Conv2d(10,20,3)
        self.fc1=nn.Linear(20*60*60,500)
        self.fc2=nn.Linear(500,386)#要分386类
    def forward(self,x):
        input_size=x.size(0) #batch_size)
        x=self.conv1(x) # 输入:batch *1*128*128 输出 batch *10*124*124
        x=F.relu(x) #size保持不变
        x=F.max_pool2d(x,2,2) #输入 batch *10*124*124 输出batch*10*62*62,对图片进行压缩,减少运算。
        x=self.conv2(x) #输入 batch*10*62*62 输出 batch*20*60*60
        x=F.relu(x)#激活层,不改变图片的shape,每次卷积之后进行一次激活,输出一个非线性函数,增强神经元的表达能力
        x=x.view(input_size,-1) #将图片转化为一维线性
        x=self.fc1(x)#输入 batch*30*60*60 输出 batch*500
        x=F.relu(x)
        x=self.fc2(x)#输入 batch*500 输出 batch*386
        out_put=F.log_softmax(x,dim=1)#计算损失函数,输出概率最大的类别 
        return out_put
        
创建优化器
model=net().to(DEVICE)#创建模型,将模型部署到设备上
optimizer=optim.Adam(model.parameters())#对参数进行优化
对模型进行训练和测试
def train_model(model,optimizer,epoch,device,TrainLoader):
    model.train()#模型训练
    for (batch_index ,data) in enumerate(TrainLoader):
        x_data,label=data
        x_data =x_data.to(device)
        label =label.to(device)
        optimizer.zero_grad()#梯度初始化为0 
        output=model(x_data)
        loss=F.cross_entropy(output,label)#计算损失
        loss.backward()
        optimizer.step()
        if batch_index %300 ==0:
            print("Train Epoch:{} \t Loss:{:.6f}".format(epoch,loss.item()))
def test(model,device,TestLoader):
    model.eval()  #模型验证
    correct=0.0  #正确率
    test_loss=0.0  #测试损失
    with torch.no_grad():  #不会计算梯度,也不会进行反向传播
        for(batch_index ,data) in enumerate(TestLoader):
            y_data,label=data
            y_data=y_data.to(device)  #部署到DEVICE上
            label =label.to(device)
            output=model(y_data) #测试数据
            test_loss+=F.cross_entropy(output,label).item()  #计算测试损失
            pred=output.max(1,keepdim=True)[1]  #[0]值  [1]索引  找到概率值最大的下标
#           pred=torch.max(output,dimm=1)
#           pred=output.argmax(dim=1)
            correct+=pred.eq(label.view_as(pred)).sum().item()  #累计正确的值
        test_loss/=len(TestLoader.dataset)
        print("Test -- Average loss:{:.4f},Accuracy:{:.3f}\n".format(test_loss,100.0*correct/len(TestLoader.dataset)))
训练
for epoch in  range(1,EPOCHS+1):
    train_model(model,optimizer,epoch,DEVICE,TrainLoader)
    test(model,DEVICE,TestLoader)

运行结果展示
在这里插入图片描述
祝大家天天开心,万事如意

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 基于卷积神经网络(CNN)对15类花卉进行识别是一个典型的图像分类问题。CNN是一种深度学习模型,专门应用于图像识别任务。在这个问题中,我们需要建立一个CNN模型来识别15类花卉。 要实现这个识别任务,首先需要一个包含标记好的数据集,其中包括各种花卉的图像样本。这些图像样本将被用于CNN的训练过程。为了更好地训练模型,可以选择在训练集中使用数据增强技术,如旋转、缩放和翻转等方法,来提高模型的鲁棒性和泛化能力。 然后,我们可以构建一个基于CNN的模型架构。CNN通常包括卷积层、池化层和全连接层等组件。通过卷积和池化操作,模型可以从图像中提取特征,并在全连接层中进行分类。可以选择使用常用的CNN架构,如LeNet、AlexNet、VGGNet或ResNet等,也可以根据具体任务进行调整和优化。 在模型建立完成后,需要对其进行训练和验证。训练过程中,通过将训练集输入到CNN模型中,并使用反向传播算法来训练模型的权重和偏置。验证集用于检查模型在未见过图像上的分类性能。为了防止模型过拟合,可以使用正则化技术,如dropout或L2正则化等。 当模型训练完毕,并且在验证集上达到一个满意的准确率之后,就可以使用测试集来评估模型的性能。测试集包含一组未见过的花卉图像,通过将测试集输入到训练好的模型中,并根据输出进行分类,就可以对模型的分类性能进行评估。 综上所述,基于CNN对15类花卉进行识别的过程主要包括数据准备、模型构建、训练验证和性能评估等步骤。通过这个过程,我们可以利用深度学习技术实现高效准确地花卉识别任务。 ### 回答2: 卷积神经网络 (Convolutional Neural Network, CNN) 是一种深度学习算法,特别适用于图像识别任务。基于CNN对15类花卉进行识别是一个具体的图像分类问题,下文将简要解释如何进行这项任务。 首先,我们需要准备一个包含15类花卉的大型数据集作为训练集。每个花卉类别应当包含足够数量的图像样本,使得网络能够学习到每个类别的特征。可以使用各种源自互联网的公开数据集,如ImageNet或Flower Recognition Dataset等。确保训练集中的图像样本尽可能地涵盖花卉类别的多样性。 接下来,我们需要构建一个CNN模型。CNN通常由若干个卷积层(Convolutional Layer)、池化层(Pooling Layer)和全连接层(Fully Connected Layer)组成。卷积层用于提取图像的局部特征,池化层则用于降低特征图的维度,全连接层则用于输出最终的分类结果。 构建CNN模型时,可以使用经典的架构,如AlexNet、VGGNet或ResNet等。同时,需要根据花卉识别任务的特点,调整网络的层数、过滤器的大小以及池化步幅等超参数,以增强模型对花卉图像的表示能力。 在模型构建完成后,我们需要将数据集分为训练集和测试集,通常可以采用70%的数据作为训练集,30%的数据作为测试集。使用训练集数据来训练CNN模型,并根据测试集数据对模型进行验证和评估。 在训练过程中,使用反向传播算法(Backpropagation)来更新模型的权重和偏置,使得模型能够对花卉图像进行准确的分类。 最后,通过在未见过的花卉图像上使用训练好的CNN模型进行预测,即可对15类花卉进行识别。可以将待预测的图像输入CNN模型,并获取模型输出的概率分布,选择概率最高的类别作为预测结果。 通过以上步骤,我们可以基于CNN实现对15类花卉的识别。这个过程涉及到数据的准备、模型的构建、训练和预测等环节,需要一定的算法和深度学习知识作为基础。但是一旦模型训练好,它可以准确快速地对15类花卉进行分类,具有广泛的应用前景。 ### 回答3: 卷积神经网络(CNN)是一种广泛应用于图像识别领域的深度学习算法。基于CNN对15类花卉进行识别时,可以采取以下步骤: 首先,准备一个适当规模的数据集,其中包含15种不同类型的花卉图像。这些图像应具有多样性和代表性,以便能够有效地训练CNN模型。 接下来,使用Python编程语言和深度学习框架,例如TensorFlow或PyTorch等,构建一个基于CNN的图像分类模型。该模型应包括卷积层、池化层、全连接层和输出层等组件。 然后,将数据集划分为训练集和测试集,通常采用80:20的比例。训练集用于训练CNN模型,测试集用于评估模型的性能。 接着,进行模型的训练。在每个训练迭代中,将随机选择一批训练图像输入到CNN模型中,并通过反向传播算法进行模型参数的更新,以逐步优化模型的性能。 完成训练后,使用测试集评估CNN模型在新数据上的泛化能力。通过计算模型预测结果与实际标签之间的差异,可以得到模型的准确率、精确率、召回率等指标,以评估模型的性能。 最后,使用训练好的CNN模型对新的花卉图像进行识别。将新图像输入到CNN模型,并根据输出层的结果确定图像所属的花卉类别。 通过以上步骤,基于CNN对15类花卉进行识别的任务可以得到良好的结果。然而,为了获得更好的性能,可能需要进行超参数调整、数据增强等优化措施。同时,还可以结合其他的技术手段,如迁移学习、模型融合等方法,进一步提升识别性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值