当前位置: 首页 > news >正文

基于Pytorch框架的深度学习MobileViT神经网络鸟类识别分类系统源码

 第一步:准备数据

25种鸟类数据:self.class_indict = ["非洲冠鹤", "灰顶火雀", "信天翁", "亚历山大鹦鹉", "褐胸反嘴鹬", "美洲麻鳽", "美洲骨顶", "美洲金翅雀", "美洲隼", "美洲鹨", "美洲红尾鸟", "美洲蛇鸟", "安式蜂鸟", "蚁鸟", "阿拉里皮娇鹟", "朱鹮", "白头鵰", "巴厘岛八哥", "摩金莺", "蕉林莺", "带斑阔嘴鸟", "斑尾塍鹬", "仓鸮", "燕子", "横斑蓬头䴕"]

,总共有3800张图片,每个文件夹单独放一种数据

第二步:搭建模型

本文选择一个MobileViT网络,其原理介绍如下:

        MobileViT是一种基于ViT(Vision Transformer)架构的轻量级视觉模型,旨在适用于移动设备和嵌入式系统。ViT是一种非常成功的深度学习模型,用于图像分类和其他计算机视觉任务,但通常需要大量的计算资源和参数。MobileViT的目标是在保持高性能的同时,减少模型的大小和计算需求,以便在移动设备上运行,据作者介绍,这是第一次基于轻量级CNN网络性能的轻量级ViT工作,性能SOTA。性能优于MobileNetV3、CrossviT等网络。

Vision Transformer结构
下图是MobileViT论文中绘制的Standard visual Transformer。首先将输入的图片划分成N个Patch,然后通过线性变化将每个Patch映射到一维向量中(Token),接着加上位置偏置信息(可学习参数),再通过一系列Transformer Block,最后通过一个全连接层得到最终预测输出。

MobileViT结构

上面展示是标准视觉ViT模型,下面来看下本次介绍的重点:Mobile-ViT网路结构,如下图所示:

第三步:训练代码

1)损失函数为:交叉熵损失函数

2)训练代码:

import os
import argparseimport torch
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformsfrom my_dataset import MyDataSet
from model import mobile_vit_xx_small as create_model
from utils import read_split_data, train_one_epoch, evaluatedef main(args):device = torch.device(args.device if torch.cuda.is_available() else "cpu")if os.path.exists("./weights") is False:os.makedirs("./weights")tb_writer = SummaryWriter()train_images_path, train_images_label, val_images_path, val_images_label = read_split_data(args.data_path)img_size = 224data_transform = {"train": transforms.Compose([transforms.RandomResizedCrop(img_size),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),"val": transforms.Compose([transforms.Resize(int(img_size * 1.143)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}# 实例化训练数据集train_dataset = MyDataSet(images_path=train_images_path,images_class=train_images_label,transform=data_transform["train"])# 实例化验证数据集val_dataset = MyDataSet(images_path=val_images_path,images_class=val_images_label,transform=data_transform["val"])batch_size = args.batch_sizenw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8])  # number of workersprint('Using {} dataloader workers every process'.format(nw))train_loader = torch.utils.data.DataLoader(train_dataset,batch_size=batch_size,shuffle=True,pin_memory=True,num_workers=nw,collate_fn=train_dataset.collate_fn)val_loader = torch.utils.data.DataLoader(val_dataset,batch_size=batch_size,shuffle=False,pin_memory=True,num_workers=nw,collate_fn=val_dataset.collate_fn)model = create_model(num_classes=args.num_classes).to(device)if args.weights != "":assert os.path.exists(args.weights), "weights file: '{}' not exist.".format(args.weights)weights_dict = torch.load(args.weights, map_location=device)weights_dict = weights_dict["model"] if "model" in weights_dict else weights_dict# 删除有关分类类别的权重for k in list(weights_dict.keys()):if "classifier" in k:del weights_dict[k]print(model.load_state_dict(weights_dict, strict=False))if args.freeze_layers:for name, para in model.named_parameters():# 除head外,其他权重全部冻结if "classifier" not in name:para.requires_grad_(False)else:print("training {}".format(name))pg = [p for p in model.parameters() if p.requires_grad]optimizer = optim.AdamW(pg, lr=args.lr, weight_decay=1E-2)best_acc = 0.for epoch in range(args.epochs):# traintrain_loss, train_acc = train_one_epoch(model=model,optimizer=optimizer,data_loader=train_loader,device=device,epoch=epoch)# validateval_loss, val_acc = evaluate(model=model,data_loader=val_loader,device=device,epoch=epoch)tags = ["train_loss", "train_acc", "val_loss", "val_acc", "learning_rate"]tb_writer.add_scalar(tags[0], train_loss, epoch)tb_writer.add_scalar(tags[1], train_acc, epoch)tb_writer.add_scalar(tags[2], val_loss, epoch)tb_writer.add_scalar(tags[3], val_acc, epoch)tb_writer.add_scalar(tags[4], optimizer.param_groups[0]["lr"], epoch)if val_acc > best_acc:best_acc = val_acctorch.save(model.state_dict(), "./weights/best_model.pth")torch.save(model.state_dict(), "./weights/latest_model.pth")if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--num_classes', type=int, default=25)parser.add_argument('--epochs', type=int, default=100)parser.add_argument('--batch-size', type=int, default=4)parser.add_argument('--lr', type=float, default=0.0002)# 数据集所在根目录# https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgzparser.add_argument('--data-path', type=str,default=r"G:\demo\data\Bird_Dataset\birds\train")# 预训练权重路径,如果不想载入就设置为空字符parser.add_argument('--weights', type=str, default='./mobilevit_xxs.pt',help='initial weights path')# 是否冻结权重parser.add_argument('--freeze-layers', type=bool, default=False)parser.add_argument('--device', default='cuda:0', help='device id (i.e. 0 or 0,1 or cpu)')opt = parser.parse_args()main(opt)

第四步:统计正确率

第五步:搭建GUI界面

第六步:整个工程的内容

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

代码的下载路径(新窗口打开链接):基于Pytorch框架的深度学习MobileViT神经网络鸟类识别分类系统源码

有问题可以私信或者留言,有问必答

相关文章:

  • 【AI落地工程技术】-SSE协议
  • 【多线程】进程与线程
  • 计算机毕业设计Hadoop+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据
  • WPF/C#:程序关闭的三种模式
  • 探索Dagster:现代数据编排的利器
  • Opus从入门到精通(一)简介
  • 深层网络:层数多真的更好吗?
  • 解锁ChatGPT:从原理探索到GPT-2的中文实践及性能优化
  • 【安装笔记-20240612-Linux-内网穿透服务之cpolar极点云】
  • Android 10.0 framework层禁止扫描5g wifi功能实现
  • Jtti:ubuntu文件系统根目录磁盘空间不足怎么办
  • 6月11号作业
  • 【数据结构】二叉树:一场关于节点与遍历的艺术之旅
  • 代码随想录算法训练营第36天(py)| 贪心 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 解决SpringBoot在使用AOP切片时DATE类型出现Argument is not assignable to ‘lombok.Data‘ 的问题
  • Bytom交易说明(账户管理模式)
  • CAP 一致性协议及应用解析
  • gulp 教程
  • k8s如何管理Pod
  • Logstash 参考指南(目录)
  • Nacos系列:Nacos的Java SDK使用
  • Python实现BT种子转化为磁力链接【实战】
  • React16时代,该用什么姿势写 React ?
  • Sass Day-01
  • swift基础之_对象 实例方法 对象方法。
  • windows下使用nginx调试简介
  • 第十八天-企业应用架构模式-基本模式
  • 分类模型——Logistics Regression
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 爬虫模拟登陆 SegmentFault
  • 前端攻城师
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 听说你叫Java(二)–Servlet请求
  • 问题之ssh中Host key verification failed的解决
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # 达梦数据库知识点
  • #QT(一种朴素的计算器实现方法)
  • #vue3 实现前端下载excel文件模板功能
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)字符分类函数
  • (一)认识微服务
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Micro Framework初体验(二)
  • .NetCore项目nginx发布
  • .Net环境下的缓存技术介绍
  • .NET命令行(CLI)常用命令
  • /proc/vmstat 详解
  • @Mapper作用
  • @TableLogic注解说明,以及对增删改查的影响
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [.NET]桃源网络硬盘 v7.4
  • [17]JAVAEE-HTTP协议
  • [APUE]进程关系(下)
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息