Kaggle-狗种类的识别(Pytorch框架)基本图像识别流程

请添加图片描述

狗类别实现过程

一. 将数据集按标签分类,将标签转换为数字表示,并制作数据集
二. 搭建网络框架,inception,或者ResNet
三. 选择优化函数,训练模型

数据集制作

首先分析数据集,题中已经很明确告诉有120 种狗,那么就有120种标签值,分别为0-119。
给了一个训练集,和一个csv文件,图像在训练集中,图像的标签在csv文件里,那么如何将图片和它的标签去捆绑,因为训练图像的流程就是拿图像训练得出预测值,和它标签进行损失计算。
首先观察csv文件:

在这里插入图片描述

训练集:
在这里插入图片描述

csv文件中给出了每张图片的标签值,那么要做的就是按照csv文件里的标签值,将图片复制到另一个文件夹中,进行分类,属于同一品中的狗放到同一文件夹中,然后用内置API ImageFolder 去自动设置标签。具体原理如下

在这里插入图片描述
左面是已经将训练集分类好的新训练集,将同一种类的图片归置到一起,那么ImageFolder会将每个文件夹中的照片赋值为相同的标签值,从0开始,例如第一个文件夹kuvasz 里的照片的标签全部赋值为0,下一个文件夹kerry_blue_terrier 标签赋值为1 ,它这种标签是自动生成的,不需要人为的加

那么要做的第一步,读取csv文件,创建一个字典,保证每张图片能够准确划分到属于它的类(文件夹)中,因为训练集中的图片要按照字典查找它的标签才能复制到它对应的文件夹中。

import pandas as pd 
def read_train_csv():df=pd.read_csv("/kaggle/input/dog-breed-identification/labels.csv")    id=df.iloc[0:,0].values         #读取每张图片的id,也就是训练集图片名称,从第一行开始到最后一行,第一列,想要从pandas数据转化为列表,必须后缀.valuesbreed=df.iloc[0:,1].values      #读取第二行标签值return dict(zip(id,breed))      #将图片id和其对应的标签值捆绑,这里并不是图片,而是图片名称,图片要通过这个字典查询它应该放哪个文件夹中

定义复制函数

import shutil
import os
def copy_dir(data_dir,target_dir):       #源地址和目标地址os.makedirs(target_dir,exist_ok=True)        #如果目标地址不存在,先创建shutil.copy(data_dir,target_dir)             #复制

定义分类函数,将训练集分类,将图片按照上面的字典进行分类

#这里源文件地址是 /kaggle/input/dog-breed-identification/train
#目的文件地址是output中 :/kaggle/working/traindef train_to_data(data_dir,target_dir):    #训练集的地址,目标地址dict=read_train_csv()                  #用上面的读取csv文件函数返回训练集的字典for data in os.listdir(data_dir):      #将放训练集图片的文件夹迭代一张一张拿出来读label=dict.get(data.split('.')[0])  #因为我们用os读取出来是照片名称,格式为000bec180eb18c7604dcecc8fe0dba07.jpg,我们要前半部分作为value,去字典中查找key,那么查出来该img的labelfname=os.path.join(data_dir,data)   #获取该图片的地址copy_dir(fname,os.path.join(target_dir,label))   #将图片复制到对应的文件夹中,文件名称就是label
train_to_data("/kaggle/input/dog-breed-identification/train","/kaggle/working/train")  #进行数据分类#转移测试集,因为我们最后要预测测试集,所以也要把测试集封装成数据集,才能放到神经网络里面训练,否则光秃秃的测试集没法放进网络框架,和上面的一样
#但是将测试集都放到unknow文件中,这样ImageFolder会将其直接封装为标签值为0的数据集,因为我们要预测它标签值,所以这里赋值为多少都无所谓
for test_data in os.listdir("/kaggle/input/dog-breed-identification/test/"):copy_dir(os.path.join("/kaggle/input/dog-breed-identification/test",test_data),"/kaggle/working/test/unknow")

训练集图片分类完成后,那么就开始制作训练数据集了

#首先进行图像处理,数据增强,所有图像识别必须要做的,因为该数据集每张的图片大小不同,所以要统一图片像素大小import torchvision
train_transform=torchvision.transforms.Compose([torchvision.transforms.RandomResizedCrop(224,scale=(0.08,1.0),ratio=(3.0/4.0,4.0/3.0)),       #设置裁剪出来的像素大小为224torchvision.transforms.RandomHorizontalFlip(),    #随机进行水平翻转torchvision.transforms.ColorJitter(brightness=0.4,contrast=0.4,saturation=0.4),                              #调图像的色彩度                                                torchvision.transforms.ToTensor(),               #必须有,将图像变为tensor向量,否则没法放进网络中运行,将维度[224,224,3] 变为 [3,224,224]torchvision.transforms.Normalize([0.485,0.456,0.406],  [0.229,0.224,0.225])     #将图像数据标准化,减小计算量
])#对测试集进行图像处理  ,只需要改变尺寸,标准化数据就够了,因为只需预测
test_transform=torchvision.transforms.Compose([     torchvision.transforms.Resize(256),torchvision.transforms.CenterCrop(224),torchvision.transforms.ToTensor(),torchvision.transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])#制作数据集,ImageFolder的原理上面已经说过,但是切记ImageFolder的文件地址必须是你分类数据集的上一级!,例如分好类后在文件夹/train/下
#那么ImageFolder的文件地址就只能到train/为止,因为ImageFolder是按照文件夹的名称赋值标签值的,它要看文件夹的名称,不能直接定位到具体某一类的文件夹上
from torch.utils.data import DataLoader
train_mid_data=torchvision.datasets.ImageFolder('/kaggle/working/train/',transform=train_transform)       #ImageFolder可以自动将对应文件夹中的图片进行标签赋值  但是切记,文件地址必须为上一级,否则会出错!
train_data=DataLoader(train_mid_data,batch_size=32,drop_last=True,shuffle=True)               #数据集制作,32个为一组,打乱数据集顺序,不能让网络挨次训练某一类型数据#制作测试集数据,方便后面直接扔到网络模型中预测
test_mid_data=torchvision.datasets.ImageFolder('/kaggle/working/test/',transform=test_transform)
test_data=DataLoader(test_mid_data,batch_size=32)    

以上就是完整的数据集制作流程,具体的图像数据集制作可以看下面这篇文章

PyTorch数据集制作

网络模型搭建

这里做了三种网络的对比,第一种是 ResNet残差网络,第二种是LeNet网络
,第三种GoolgeNet网络,对比了性能,第三种最好
第三种使用的是inception模块 ,inception具体的原理是用不同的卷积维度,对同一张图片进行卷积,然后将不同卷积后的结果结合起来形成完整的一个结果。
在这里插入图片描述

完整的一个GoogleNet模型如下图:
在这里插入图片描述

实现很简单:

from torch import nn
from torch.nn import functional as F
class inception(nn.Module):def __init__(self,inchannels,c1,c2,c3,c4):super().__init__()self.p1_1=nn.Conv2d(inchannels,c1,kernel_size=1)self.p2_1=nn.Conv2d(inchannels,c2[0],kernel_size=1)self.p2_2=nn.Conv2d(c2[0],c2[1],kernel_size=3,padding=1)self.p3_1=nn.Conv2d(inchannels,c3[0],kernel_size=1)self.p3_2=nn.Conv2d(c3[0],c3[1],kernel_size=5,padding=2)self.p4_1=nn.MaxPool2d(kernel_size=3,padding=1,stride=1)self.p4_2=nn.Conv2d(inchannels,c4,kernel_size=1)def forward(self,x):x1=F.relu(self.p1_1(x))x2=F.relu(self.p2_2(F.relu(self.p2_1(x))))x3=F.relu(self.p3_2(F.relu(self.p3_1(x))))x4=F.relu(self.p4_2(F.relu(self.p4_1(x))))return torch.cat((x1,x2,x3,x4),dim=1)b1=nn.Sequential(nn.Conv2d(in_channels=3,out_channels=64,kernel_size=7,stride=2,padding=3),nn.ReLU(),nn.MaxPool2d(kernel_size=3,stride=2,padding=1))
b2=nn.Sequential(nn.Conv2d(64,64,kernel_size=1),nn.ReLU(),nn.Conv2d(64,192,kernel_size=3,padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=3,stride=2,padding=1))
b3=nn.Sequential(inception(192,64,(96,128),(16,32),32),inception(256,128,(128,192),(32,96),64),nn.MaxPool2d(kernel_size=3,stride=2,padding=1))
b4=nn.Sequential(inception(480,192,(96,208),(16,48),64),inception(512,160,(112,224),(24,64),64),inception(512,128,(128,256),(24,64),64),inception(512,112,(144,288),(32,64),64),inception(528,256,(160,320),(32,128),128),nn.MaxPool2d(kernel_size=3,stride=2,padding=1))
b5=nn.Sequential(inception(832,256,(160,320),(32,128),128),inception(832,384,(192,384),(48,128),128),nn.AdaptiveAvgPool2d((1,1)),nn.Flatten())#得到神经网络模型,上面模型是可以直接复制用的
def get_net():net=nn.Sequential(b1,b2,b3,b4,b5,nn.Linear(1024,120))return net

下面是一个简单模型框架也可以选择:

from torch import nn
from torch.nn import functional as F
class net(nn.Module):def __init__(self):super().__init__()#224 224 3self.conv1=nn.Conv2d(in_channels=3,out_channels=64,kernel_size=3,padding=1)self.bn1=nn.BatchNorm2d(64)self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)#112 112 64self.conv2=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)self.bn2=nn.BatchNorm2d(128)self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)#56 56 128self.conv3=nn.Conv2d(in_channels=128,out_channels=256,kernel_size=3,padding=1)self.bn3=nn.BatchNorm2d(256)self.pool3=nn.MaxPool2d(kernel_size=2,stride=2)#28 28 256self.conv4=nn.Conv2d(in_channels=256,out_channels=512,kernel_size=3,padding=1)self.bn4=nn.BatchNorm2d(512)self.pool4=nn.MaxPool2d(kernel_size=2,stride=2)#14 14 512self.conv5=nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,padding=1)self.bn5=nn.BatchNorm2d(512)self.pool5=nn.MaxPool2d(kernel_size=2,stride=2)#7 7 512self.Linear1=nn.Linear(in_features=7*7*512,out_features=240)self.Linear2=nn.Linear(in_features=240,out_features=120)def forward(self,x):x=F.relu(self.pool1(self.bn1(self.conv1(x))))x=F.relu(self.pool2(self.bn2(self.conv2(x))))x=F.relu(self.pool3(self.bn3(self.conv3(x))))x=F.relu(self.pool4(self.bn4(self.conv4(x))))x=F.relu(self.pool5(self.bn5(self.conv5(x))))x=x.flatten(start_dim=1)x=F.relu(self.Linear1(x))x=self.Linear2(x)return xdef get_net():net=net()return net

做训练函数

import matplotlib.pyplot as plt
# 将程序放到GPU上跑,否则默认cpu会卡死
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')             net=get_net().to(device)     #将模型放到GPU上,必须把数据也放到相同GPU上才能运行def train(net,train_data,epoch_num,lr,wd):#这里只是用了一个简单的Adam梯度下降算法,这篇文章只是一个基础构建,可以在此基础上改进optimer=torch.optim.Adamax(net.parameters(),lr=lr,weight_decay=wd)     num_batches=len(train_data)     #用来后面的损失函数计算,得到单个图片的损失值loss_function=nn.CrossEntropyLoss()   #损失函数loss_value=[]                         #记录损失值,用来画图,将该列表直接放到plt中就能画for epoch in range(epoch_num):       #进行大循环epoch_loss=0                     #每一次大循环都要重置损失值for img,label in train_data:   img=img.to(device)           #将数据都放在GPU上label=label.to(device)optimer.zero_grad()          #一系列训练模板y=net(img)loss=loss_function(y,label)epoch_loss+=loss.item()loss.backward()optimer.step()loss_value.append(epoch_loss/(num_batches*32))#画损失函数的图plt.plot(np.squeeze(loss_value))plt.ylabel('cost')plt.xlabel('iterations (per tens)')plt.show()
train(net,train_data,50,6e-5,5e-4)    #开始训练,后面俩参数都可以自己调

在这里插入图片描述

其实训练的结果不是太好,损失值还是太大,可以通过调学习率去调节,这里只是用的一个最基本的参数值

进行预测测试集

前面已经将测试集数据已经做好了,直接放模型里预测,去观察题中给的需要提交的csv文件格式,可以知道需要提交的并不是你要预测这张图片属于哪种狗子,而是这张图片属于每一类狗子的概率,这里就必须要用softmax函数了,具体原理可以上网差,他会将所有情况的概率总和变为1,然后每一类的概率就是看其在这1中占比多少。

preds=[]
for i,_ in test_data:out_put=torch.nn.functional.softmax(net(i.to(device)),dim=1)    #将预测值进行softmax处理preds.extend(out_put.cpu().detach().numpy())    #将得到的预测值变为numpy数组,因为只有numpy才能存到pandas文件中 
ids=sorted(os.listdir("/kaggle/working/test/unknow"))    #将测试集的顺序按id排序,因为提交的格式id就是按大小排序的
with open("/kaggle/working/submission.csv",'w') as f:     #制作csv文件f.write('id,'+','.join(train_mid_data.classes)+'\n')     #先将标题标签做好for i,output in zip(ids,preds):   f.write(i.split('.')[0]+','+','.join([str(num) for num in output])+'\n')    #将每一个对应的id和预测的结果加入到文件中,其实这里逗号,csv文件都会识别,将其作为分割符号,所以在csv文件中也不会看见逗号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544740.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【2024W32】肖恩技术周刊(第 10 期):太阳神鸟

周刊内容: 对一周内阅读的资讯或技术内容精品(个人向)进行总结,分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率,每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

LeetCode 刷题基础Ⅰ -- 基础语法

c 基础语法,LeetCode 刷题用 学习网站一、顺序结构基本数据类型① 整型 int② 长整型 long③ 浮点型 double④类型转换 输入输出① getchar 吸收回车符② 数学函数③ 最大值的定义 二、选择结构① switch 三、数组① 初始化② 输入③ 方法 四、结构体① 自定义结构体…

UE5地图白屏/过曝/非常亮の解决方法

今天遇到一个问题 , 新建项目 , 打开虚幻第三人称地图的默认关卡 , 发现白屏 , 啥也看不见 猜测可能是虚幻编辑器的bug , 造成白屏的原因应该是场景过曝了 记录一下解决方案 第一种解决方法 找到场景中的 后期处理体积 (PostProcessVolume) 直接删掉 或者找到 细节面板中 -…

【Transformers基础入门篇5】基础组件之Datasets

文章目录 一、简介二、Datasets基本使用2.1 加载在线数据集(load_dataset)2.2 加载数据集某一项任务(load_dataset)2.3 按照数据集划分进行加载(load_dataset)2.4 查看数据集(index and slice&a…

数据库课程 CMU15-445 2023 Fall Project-2 Extendible Hash Index

0 实验结果 tips:完成项目的前提不需要一定看视频 1 数据结构:扩展哈希 解释下这张图: 图中header的最大深度2,directory最大深度2,桶的容量2。 最开始的时候只有一个header。 插入第一个数据,假设这个数据对应的哈希…

洛汗2保姆级辅助教程攻略:VMOS云手机辅助升级打怪!

在《洛汗2》中,玩家将进入一个充满魔幻色彩的西方世界,体验多种族文明的兴衰与冒险。为了更好地享受这款由普雷威(Playwith)开发的角色扮演动作手游,使用VMOS云手机将是一个明智的选择。VMOS云手机专为游戏打造了定制版…

基于SSM的“在线CRM管理系统”的设计与实现(源码+数据库+文档+开题报告)

基于SSM的“在线CRM管理系统”的设计与实现(源码数据库文档开题报告) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 总体功能模块图 登录页面 后台管理页面 产品信息页面 客…

JSP(Java Server Pages)基础使用二

简单练习在jsp页面上输出出乘法口诀表 既然大家都是来看这种代码的人了&#xff0c;那么这种输出乘法口诀表的这种简单算法肯定是难不住大家了&#xff0c;所以这次主要是来说jsp的使用格式问题。 <%--Created by IntelliJ IDEA.User: ***Date: 2024/7/18Time: 11:26To ch…

consul注册中心与容器自动发现实战

consul简介 Consul 是 HashiCorp 公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案&#xff0c;不再需要依赖其它工具&#xff08;比如 ZooKeeper 等&#xff0…

拾色器的取色的演示

前言 今天&#xff0c;有一个新新的程序员问我&#xff0c;如何确定图片中我们需要选定的颜色范围。一开始&#xff0c;我感到对这个问题很不屑。后来&#xff0c;想了想&#xff0c;还是对她说&#xff0c;你可以参考一下“拾色器”。 后来&#xff0c;我想关于拾色器&#…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

C语言 typedef - C语言零基础入门教程

目录 一.typedef 简介 二.typedef 实战 1.typedef 定义基本数据变量 2.typedef 定义结构体 A.常规定义结构体B.typedef 定义结构体C.结构体使用 typedef 和不使用 typedef 区别 3.typedef 定义函数指针 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础…

【2024W33】肖恩技术周刊(第 11 期):猴哥,我好急啊!

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

YOLOv9改进 | 特征融合篇,YOLOv9添加iAFF(多尺度通道注意力模块),二次创新RepNCSPELAN4结构,提升小目标检测能力

摘要 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。虽然它通常通过简单的操作(如求和或拼接)来实现,但这种方式可能并不是最佳选择。在这项工作中,提出了一种统一且通用的方案,即注意力特征融合(Attentional Feature Fusion),适用于…

C++ std::any升级为SafeAny

std::any测试 #include <any>class A { public:int8_t a; };int main(int argc, char* argv[]) {std::any num((int8_t)42);auto a std::any_cast<A>(num);return 0; }异常&#xff1a; 0x00007FFA9385CD29 处(位于 test.exe 中)有未经处理的异常: Microsoft C 异…

网络威慑战略带来的影响

文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…

AI大模型行业应用:企业如何走出一条智能化蜕变之路?

随着chatGPT的横空问世&#xff0c;我们对于人工智能在日常生活中的应用场景逐渐了解&#xff0c;无论是搜索、问答、文生图还是文生视频都出现了很多创意&#xff0c;甚至AI还可以做诗&#xff0c;输入一条指令&#xff0c;就可以让它当场赋诗一首。人工智能的发展&#xff0c…

五种方式帮你提升独立站销售额

想要提升独立站利润&#xff0c;一种方式就是降低你的单个购买用户成本&#xff0c;购买用户一方面是来源于广告引流&#xff0c;另一方面是自然流量和老用户复购&#xff0c;但许多新的独立站后者来源都是非常少的&#xff0c;比较依赖广告引流&#xff0c;当我们广告的单个用…

Splunk、Snort在入侵检测中的应用

前期准备 splunk环境验证 splunk相关命令 查看服务端采集了哪些客户端的日志&#xff1a; ./bin/splunk list deploy-clients Deployment client: CF787A85-1BF8-4460-9FA9-469FEEB95BCD applications: {_server_app_39.30: {action: Install, archive: /home/splunk/var/ru…

ChatGPT 诞生663天后,奥特曼罕见发表预言长文力推超级智能:时间不多了,还有不会使用chatgpt4请看文章开头?

还不知道怎么订阅chatgpt4.0和最新的大模型&#xff0c;可以看这里 &#xff1a;WildCard官方平台订阅chatgpt 今天&#xff0c;OpenAI 公司 CEO 山姆奥特曼在一篇题为《智能时代》的最新个人博文中&#xff0c;概述了自己对于 AI 驱动的技术进步与全球繁荣未来的愿景。这篇文…