基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

   更多目标检测和图像分类识别项目可看我主页其他文章

功能演示:

基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili

(一)简介

基于卷积神经网络的蔬菜识别系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的模型权重,模型训练记录,ui界面和各种模型指标图表等。

该项目有两个可选模型:resnet50和mobilenet,两个模型都在项目中;GUI界面由tkinter设计和实现。此项目可在windowns、linux(ubuntu, centos)、mac系统下运行。

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

windows保姆级的pycharm+anaconda搭建python虚拟环境_windows启动python虚拟环境-CSDN博客

在Linux系统(Ubuntn, Centos)用pycharm+anaconda搭建python虚拟环境_linux pycharm-CSDN博客

(二)项目介绍

1. 项目结构

​​​​

该项目可以使用已经训练好的模型权重,也可以自己重新训练,自己训练也比较简单

以训练resnet50模型为例:

第一步:修改model_resnet50.py的数据集路径,模型名称、模型训练的轮数

​ 

第二步:模型训练和验证,即直接运行model_resnet50.py文件

第三步:使用模型,即运行gui_chinese.py文件即可通过GUI界面来展示模型效果

2. 数据结构

​​​​​

部分数据展示: 

​​​​

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

​​​​

4.模型训练和验证的一些指标及效果
​​​​​1)模型训练和验证的准确率曲线,损失曲线

​​​​​2)热力图

​​3)准确率、精确率、召回率、F1值

4)模型训练和验证记录

​​

(三)代码

由于篇幅有限,只展示核心代码

    def main(self, epochs):# 记录训练过程log_file_name = './results/resnet50训练和验证过程.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()  # 创建模型# 修改全连接层的输出维度in_channel = model.fc.in_featuresmodel.fc = nn.Linear(in_channel, len(class_names))# 模型结构可视化x = torch.randn(16, 3, 224, 224)  # 随机生成一个输入# 模型结构保存路径model_visual_path = 'results/resnet50_visual.onnx'# 将 pytorch 模型以 onnx 格式导出并保存torch.onnx.export(model, x, model_visual_path)  # netron.start(model_visual_path)  # 浏览器会自动打开网络结构# 将模型放入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.0for epoch in range(0, epochs):# 下面是模型训练model.train()running_loss = 0.0train_acc = 0.0train_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()  # 累加损失running_loss += train_loss.item()# 每行最大值的索引predict_y = torch.max(outputs, dim=1)[1]  # torch.eq()进行逐元素的比较,若相同位置的两个元素相同,则返回True;若不同,返回Falsetrain_acc += torch.eq(predict_y, labels.to(self.device)).sum().item()# 更新进度条train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,epochs,train_loss)# 下面是模型验证# 不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化model.eval()# accumulate accurate number / epochval_acc = 0.0  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;若不同,返回Falseval_acc += torch.eq(predict_y, val_labels.to(self.device)).sum().item()train_loss = running_loss / train_stepstrain_accurate = train_acc / train_numtest_loss = testing_loss / val_stepsval_accurate = val_acc / val_numtrain_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_accuratetorch.save(model.state_dict(), self.model_name)# 记录结束时间end_time = time()run_time = end_time - begin_timeprint('该循环程序运行时间:', run_time, "s")# 绘制模型训练过程图self.show_loss_acc(train_loss_history, train_acc_history,test_loss_history, test_acc_history)# 画热力图test_real_labels, test_pre_labels = self.heatmaps(model, validate_loader, class_names)# 计算混淆矩阵self.calculate_confusion_matrix(test_real_labels, test_pre_labels, class_names)

​​​​​(四)总结

以上即为整个项目的介绍,整个项目主要包括以下内容:完整的程序代码文件、训练好的模型、数据集、UI界面和各种模型指标图表等。

项目运行过程如出现问题,请及时交流!

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

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

相关文章

基于ElementPlus的table组件封装

前言 我们在使用UI库编写页面的时候,特别是账务系统,需要用到表格的情况会比较多,如果我们每次都是复制一遍UI库中的demo然后进行调整,这样造成的结果是多次引入 Table 组件,而且从前端开发规范来讲,不符合…

Android14 SystemUI 启动流程(1)

1.从SystemServer启动 private void run() {......// Start services.try {t.traceBegin("StartServices");startBootstrapServices(t);startCoreServices(t);startOtherServices(t);//从这里走startApexServices(t);// Only update the timeout after starting all …

红队老子养成记3 - 学会反弹shell的多种姿势,拿shell拿手软!!(全网最多姿势!)

大家好,我是Dest1ny! 今天还是讲redteam里比较重要的反弹shell! 不会反弹shell,那你如何拿控制权限! 今天满满干货,大家加油学! CLASS-1 正向连接与反向连接详解 1. 正向连接 正向连接是最常见的连接方…

单神经元建模:基于电导的模型[神经元结构、静息电位和等效电路]

文章目录 神经元结构、静息电位和等效电路神经元结构静息电位能斯特方程1. **描述浓度比的非线性关系**:2. **化学势与电势的关系**:3. **对称性**:4. **热力学与平衡**:总结: GHK方程Nernst方程和GHK方程的对比 等效电…

ChatGLM-6B大模型 + Bert预训练模型 + RAG实现知识库信息抽取(含完整代码)

‌ 目录 RAG技术 知识库准备 检索相关文本 生成问答 完整代码 本文将基于ChatGLM-6B大模型、Bert预训练模型和RAG完整金融知识库信息抽取任务。 RAG技术 RAG技术,即检索增强生成(Retrieval-Augmented Generation),是一种结合了检索和生成技术的模型。‌ 它通…

《仓库猎手模拟》风灵月影游戏辅助使用教程

《仓库猎手模拟》是一款休闲独立的模拟经营佳作,让玩家沉浸于经济管理的乐趣中,亲手利用工具探索仓库的每个角落,发掘并鉴定珍稀物品。借助修改器,玩家能更轻松地享受游戏过程,体验寻宝与经营的双重乐趣。 修改器安装&…

【C语言】文件操作(2)(文件缓冲区和随机读取函数)

文章目录 一、文件的随机读取函数1.fseek函数2.ftell函数3.rewind函数 二、文件读取结束的判断1.被错误使用的feof2.判断文件读取结束的方法3.判断文件结束的原因feofferror判断文件读取结束原因示例 三、文件缓冲区 一、文件的随机读取函数 在上一篇的文章中,我们讲…

Android10 recent键相关总结

目录 初始化流程 点击Recent键流程 RecentsActivity 显示流程 RecentsModel 获取数据管理类 RecentsActivity 布局 已处于Recent界面时 点击recent 空白区域 点击返回键 recent组件配置 Android10 Recent 功能由 System UI,Launcher共同实现。 初始化流程 …

如何克隆Git仓库的子目录:稀疏检出

一、环境 Git 2.34.1 二、前言 一般来说,我们在克隆git仓库的时候,都是一整个仓库都克隆出来的。如果假设现在有一个很大的仓库,仓库里有多个子项目,而我们只想克隆其中一个子项目的时候,应该怎么做呢? …

洛谷刷题 P1008 [NOIP1998 普及组] 三连击

题目链接:P1008 [NOIP1998 普及组] 三连击 思路 此题主要采取枚举的思想,但是直接暴力枚举会导致时间不够,因此我们先进行分析 因为要求三个三位数构成的比例是1:2:3,因此最小的那个数的百位只能在1、2、…

【Java后端】之 ThreadLocal 详解

想象一下,你有一个工具箱,里面放着各种工具。在多人共用这个工具箱的时候,很容易出现混乱,比如有人拿走了你的锤子,或者你找不到合适的螺丝刀。为了避免这种情况,最好的办法就是每个人都有自己独立的工具箱…

初识适配器模式

适配器模式 引入 生活中的例子:当我们使用手机充电时,充电器起到了转换器的作用,它将家用的220伏特电压转换成适合手机充电的5伏特电压。 适配器模式的三种类型 命名原则:适配器的命名应基于资源如何传递给适配器来进行。 类适配…

实验室信息化转型要注意哪些

在当今科技飞速发展的时代,实验室信息化转型已成为提升实验室效能和竞争力的关键举措。然而,这一转型过程并非一帆风顺,需要谨慎对待并注意以下几个重要方面。 一、明确需求与目标 在开启信息化转型之前,你必须深入了解实验室的…

第14篇:下一代网络与新兴技术

目录 引言 14.1 下一代网络(NGN)的定义与特点 14.2 IPv6协议的改进与未来应用 14.3 软件定义网络(SDN) 14.4 网络功能虚拟化(NFV) 14.5 量子通信网络 14.6 软件定义广域网(SD-WAN&#x…

xlsx xlsx-style-vite 实现前端根据element 表格导出excel且定制化样式 背景 列宽等

前言 先看下最终效果图吧,需要的可以参考我的实现方式 这是最终导出的表格文件 类似这种的,特定单元格需要额外标注,表头也有月份然后细分的,表格组件是这样的 注意 别使用xlsx-style 这个库,太多问题了,…

【C语言刷力扣】1768.交替合并字符串

题目: 解题思路: 将 word1 和 word2 元素依次添加至 ans 的后面。 时间复杂度: , n是word1的长度 m是word2的长度 空间复杂度: char* mergeAlternately(char* word1, char* word2) {int len1 strlen(word1);in…

供电电压和逻辑电压

供电电压和逻辑电压是电子电路中两个重要的电压概念,它们有不同的定义和应用。以下是它们之间的主要区别: 1. 定义 供电电压(Power Supply Voltage): 供电电压是用于给电路或设备提供电能的电压值。它是电源输出的电压…

【Linux】top命令查看CPU、内存使用率、解释

1. top 命令 top 是最常用的实时监控工具之一,可以显示 CPU 的总利用率以及各个进程的 CPU 使用情况。在Linux命令行直接输入top即可查看动态原始数据 top 在 top 命令的输出中,最上面的一行会显示 CPU 的使用情况: us(User&a…

写了十几年程序,今天才第一天知道什么是屎山代码

可以说,我确实没在工作中用过Javascript,因为我从未见过如此“厚颜无耻”的代码 我曾经也是学过2~3年,还是JQuery的年代,但应该确实没在实战中用过,否则我怎么会不记得写过这些屎山代码的??&…

图片怎么转文字?11种好用的方法!

如何快速将图片的文字提取出来,可以大量节省手打的时间,无论是截图,或者批量提取照片文字,都经常需要这个操作! 作为一名社畜,俺也经常用到各种图片转文字工具,今天通过测评12个主流的图片转文…