基于卷积神经网络的大米品种分类系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

news2025/2/24 20:48:25

 功能演示:

大米品种分类系统,基于vgg16,resnet50卷积神经网络(pytorch框架)_哔哩哔哩_bilibili

(一)简介

基于卷积神经网络的大米品种分类系统是在pytorch框架下实现的,系统中有两个模型可选resnet50模型和VGG16模型,这两个模型可用于模型效果对比。该系统涉及的技术栈有,UI界面:python + pyqt5,前端界面:python flask + vue  

该项目是在pycharm和anaconda搭建的虚拟环境执行,pycharm和anaconda安装和配置可观看教程:


超详细的pycharm+anaconda搭建python虚拟环境_pycharm配置anaconda虚拟环境-CSDN博客

pycharm+anaconda搭建python虚拟环境_哔哩哔哩_bilibili

(二)项目介绍

1. pycharm打开项目界面如下

2. 数据集 

3.GUI界面(技术栈:pyqt5+python) 

4.前端界面(技术栈:python+flask)

5. 核心代码 
class MainProcess:
    def __init__(self, train_path, test_path, model_name):
        self.train_path = train_path
        self.test_path = test_path
        self.model_name = model_name
        self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
 
        def main(self, epochs):
        # 记录训练过程
        log_file_name = './results/vgg16训练和验证过程.txt'
        # 记录正常的 print 信息
        sys.stdout = Logger(log_file_name)
 
        print("using {} device.".format(self.device))
        # 开始训练,记录开始时间
        begin_time = time()
        # 加载数据
        train_loader, validate_loader, class_names, train_num, val_num = self.data_load()
        print("class_names: ", class_names)
        train_steps = len(train_loader)
        val_steps = len(validate_loader)
        # 加载模型
        model = self.model_load()  # 创建模型
 
        # 网络结构可视化
        x = torch.randn(16, 3, 224, 224)  # 随机生成一个输入
        model_visual_path = 'results/vgg16_visual.onnx'  # 模型结构保存路径
        torch.onnx.export(model, x, model_visual_path)  # 将 pytorch 模型以 onnx 格式导出并保存
        # netron.start(model_visual_path)  # 浏览器会自动打开网络结构
 
        # load pretrain weights
        # download url: https://download.pytorch.org/models/vgg16-397923af.pth
        model_weight_path = "models/vgg16-pre.pth"
        assert os.path.exists(model_weight_path), "file {} does not exist.".format(model_weight_path)
        model.load_state_dict(torch.load(model_weight_path, map_location='cpu'))
 
        # 更改Vgg16模型的最后一层
        model.classifier[-1] = nn.Linear(4096, len(class_names), bias=True)
 
        # 将模型放入GPU中
        model.to(self.device)
        # 定义损失函数
        loss_function = nn.CrossEntropyLoss()
        # 定义优化器
        params = [p for p in model.parameters() if p.requires_grad]
        optimizer = optim.Adam(params=params, lr=0.0001)
 
        train_loss_history, train_acc_history = [], []
        test_loss_history, test_acc_history = [], []
        best_acc = 0.0
 
        for epoch in range(0, epochs):
            # 下面是模型训练
            model.train()
            running_loss = 0.0
            train_acc = 0.0
            train_bar = tqdm(train_loader, file=sys.stdout)
            # 进来一个batch的数据,计算一次梯度,更新一次网络
            for step, data in enumerate(train_bar):
                images, labels = data  # 获取图像及对应的真实标签
                optimizer.zero_grad()  # 清空过往梯度
                outputs = model(images.to(self.device))  # 得到预测的标签
                train_loss = loss_function(outputs, labels.to(self.device))  # 计算损失
                train_loss.backward()  # 反向传播,计算当前梯度
                optimizer.step()  # 根据梯度更新网络参数
 
                # print statistics
                running_loss += train_loss.item()
                predict_y = torch.max(outputs, dim=1)[1]  # 每行最大值的索引
                # torch.eq()进行逐元素的比较,若相同位置的两个元素相同,则返回True;若不同,返回False
                train_acc += torch.eq(predict_y, labels.to(self.device)).sum().item()
                train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,
                                                                         epochs,
                                                                         train_loss)
            # 下面是模型验证
            model.eval()  # 不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化
            val_acc = 0.0  # accumulate accurate number / epoch
            testing_loss = 0.0
            with torch.no_grad():  # 张量的计算过程中无需计算梯度
                val_bar = tqdm(validate_loader, file=sys.stdout)
                for val_data in val_bar:
                    val_images, val_labels = val_data
                    outputs = model(val_images.to(self.device))
 
                    val_loss = loss_function(outputs, val_labels.to(self.device))  # 计算损失
                    testing_loss += val_loss.item()
 
                    predict_y = torch.max(outputs, dim=1)[1]  # 每行最大值的索引
                    # torch.eq()进行逐元素的比较,若相同位置的两个元素相同,则返回True;若不同,返回False
                    val_acc += torch.eq(predict_y, val_labels.to(self.device)).sum().item()
 
            train_loss = running_loss / train_steps
            train_accurate = train_acc / train_num
            test_loss = testing_loss / val_steps
            val_accurate = val_acc / val_num
 
            train_loss_history.append(train_loss)
            train_acc_history.append(train_accurate)
            test_loss_history.append(test_loss)
            test_acc_history.append(val_accurate)
 
            print('[epoch %d] train_loss: %.3f  val_accuracy: %.3f' %
                  (epoch + 1, train_loss, val_accurate))
            if val_accurate > best_acc:
                best_acc = val_accurate
                torch.save(model.state_dict(), self.model_name)
 
        # 记录结束时间
        end_time = time()
        run_time = end_time - begin_time
        print('该循环程序运行时间:', run_time, "s")
        # 绘制模型训练过程图
        self.show_loss_acc(train_loss_history, train_acc_history,
                           test_loss_history, test_acc_history)
        # 画热力图
        self.heatmaps(model, validate_loader, class_names)

该系统可以训练自己的数据集,训练过程也比较简单,只需指定自己数据集中训练集和测试集的路径,训练后模型名称和指定训练的轮数即可 

训练结束后可输出以下结果:
a. 训练过程的损失曲线

 b. 模型训练过程记录,模型每一轮训练的损失和精度数值记录

c. 模型结构

模型评估可输出:
a. 混淆矩阵

b. 测试过程和精度数值

(三)资源获取方式

编码不易,源码有偿获取喔!

资源主要包括以下内容:完整的程序代码文件、训练好的模型、数据集、UI界面、前端界面。欢迎大家咨询! 

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

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

相关文章

Redis中的持久化

持久化 .RDB手动触发save命令bgsave命令 自动触发bgsave的具体流程RDB的处理保存压缩校验 RDB的优缺点 AOF命令写入文件同步重写机制启动时恢复数据 本章重点回顾 . RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发 手动触发…

电子积木方案开发商

东莞市酷得智能科技有限公司电子积木方案开发商 提供消费电子解决方案、提供IC技术支持,全国线上线下服务 积木小车底层驱动开发过程主要涉及到以下几个方面: 首先,需要对小车底盘结构、硬件、模块等有深入的了解。底盘承载着机器人定位、导…

nvm保姆级安装使用教程

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 开发环境篇 ✨特色专栏: M…

数据采集与整理:知识图谱的根基

数据采集与整理:知识图谱的根基 一、 引言 在今天的数据驱动的世界中,知识图谱已经成为了连接复杂信息的关键工具。它们不仅推动了人工智能的发展,还改变了我们管理和利用知识的方式。然而,任何优秀的知识图谱都离不开一个核心的…

武汉星起航:跨境电商领域的领航者,助力全球贸易新篇章

自2017年以来,武汉星起航一直专注于亚马逊自营店铺,积累了宝贵的经验。2020年正式成立后,公司以跨境电商为核心,致力于为合作伙伴提供深入的合作模式。武汉星起航凭借其卓越的服务和实战经验,已成功助力众多创业者实现…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长&#xff0c…

画图理解JVM相关内容

文章目录 1. JVM视角下,内存划分2. 类内存分布硬核详解1. 获取堆内存参数2. 扫描堆内存,定位实例3. 查看实例所在地址的数据4. 找到实例所指向的类信息的地址5. 查看class信息6. 结论 3. Java的对象创建流程4. 垃圾判别算法4.1 引用计数法4.2 可达性分析…

DRF:认证(单视图或全局设置认证方案和源码分析、设置多个认证方案、如何设置不允许匿名访问)

概念:request.user、request.auth、认证方案authentication_classes 官网原文: 验证始终在视图的最开始进行,在执行权限和限制检查之前以及允许任何其他代码继续执行之前。 request.user 属性通常被设置为contrib.auth 包中 User 类的一个…

数学知识--(欧拉函数,快速幂,扩展欧几里得算法)

本文用于记录个人算法竞赛学习,仅供参考 目录 一.欧拉函数 二.欧拉函数模板 三.用筛法求每个数的欧拉函数 四.快速幂 五.扩展欧几里得算法 六.用扩展欧几里得算法求线性同余方程 一.欧拉函数 即有一个数n, n通过质因数分解得到 通过欧拉函数有 证明&…

Java 程式 main 方法传参数

Java 程式运行时如果需要传递参数时,常用的方法有两种: 使用 Program Arguments 来传递值使用 VM Arguments 来传递值 1、使用 Program Arguments 来传递值 使用 Program Arguments 来传递值时,main 方法的写法如下: public st…

Linux 常用命令(持续更新中...)

1. ls 查看文件列表命令 语法: ls [-a -l -h] [Linux路径] -a -l -h 是可选的选项 (-h需配合-l命令一起使用)Linux路径是此命令可选的参数 ls #查看当前目录所有非隐藏文件(平铺方式显示) ls -a #查看当前目录下所有文件 …

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目,里面需要用到权限管理。这里说一下权限定义的大概,代码不多,主要讲原理和如何实现它。 一、权限管理的原理 权限…

Polardb MySQL 产品架构及特性

一、产品概述; 1、产品族 参考:https://edu.aliyun.com/course/3121700/lesson/341900000?spma2cwt.28120015.3121700.6.166d71c1wwp2px 2、polardb mysql架构优势 1)大容量高弹性:最大支持存储100T,最高超1000核CPU&#xff0…

55、美国德克萨斯大学奥斯汀分校、钱德拉家族电气与计算机工程系:通过迁移学习解决BCI个体差异性[不得不说,看技术还得是老美]

2024年2月5日跨被试最新文章: 德州州立大学奥斯汀分校研究团队最近的一项研究成果,通过非侵入式的脑机接口,可以让被试不需要任何校准就可以使用脑机接口设备,这意味着脑机接口具备了大规模被使用的潜力。 一般来说,…

哈希-字母异位词分组

字母异位词&#xff0c;词频一样&#xff0c;但是顺序不一样&#xff0c;可以进行排序&#xff0c;获取一个key&#xff0c;放在map中即可。 class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> ma…

彩虹聚合DNS管理系统v1.0全新发布

聚合DNS管理系统&#xff08;https://github.com/netcccyun/dnsmgr&#xff09;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的…

STM32CubeIDE基础学习-舵机控制实验

STM32CubeIDE基础学习-舵机控制实验 文章目录 STM32CubeIDE基础学习-舵机控制实验前言第1章 硬件介绍第2章 工程配置2.1 基础工程配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 SG90、MG996舵机在机器人领域用得非常多&#xff0c;因为舵机有内置控制电…

利用nginx-http-flv-module实现三种直播

目录 一、说明 二、目标 三、实现 四、直播地址 一、说明 此文在《流媒体服务器的搭建(支持hls)》《搭建nginx-http-flv-module直播系统》之后编写,很多详细内容需要参考它。 流媒体服务器的搭建(支持hls)

【面经】interrupt()、interrupted()和isInterrupted()的区别与使用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 interrupt方法 如果打断线程正在sleep&#xff0c;wait&#xff0c;join会导致被打断的线程抛出InterruptedException&#xff0c;并清除打断标记。如…

商标“五分法”,如何起名显著性更强通过率更高!

1976年在Abercrombie一案美国判例中提出的商标五分法&#xff0c; 基本上在全球范围内得到认可和共识&#xff0c;普推知产老杨平常检索时&#xff0c;我国一些专家相关的论文及专著和判例中也会经常涉及到。 商标五分法主要是把商标分成个五种类型&#xff0c; 通用的&#xf…