深度学习的鸟类图像分类系统
使用pyqt设计可视化的界面 pytorch 框架 如何构建基于深度学习的鸟类图像分类系统文章目录使用pyqt设计可视化的界面 pytorch 框架 如何构建基于深度学习的鸟类图像分类系统1. 数据预处理2. 模型定义与训练3. 测试集评估4. PyQt5界面设计1. 导入必要的库2. 数据预处理和加载3. 模型定义4. 训练模型5. 绘制损失曲线以下文字及代码仅供参考学习。框架pytorch****数据集525 物种 84635 列 2625 测试 2625 验证图像 224X224X3 jpg模型ResNet18,ResNet34,ResNet50,ResNet101,ResNet152,VGG11,VGG13,VGG16,VGG19,MobileNet_v2,Inception_v3,共11种模型预实现目标所需软件深度学习框架pytorch界面使用pyqt设计了可视化的界面框架pytorch****1基于深度学习的鸟类图像分类系统涉及数据预处理、模型训练、评估和可视化界面设计等多个步骤。以下是详细的代码实现包括PyTorch模型训练和PyQt5界面设计。1. 数据预处理首先对数据进行预处理包括数据加载、数据增强等。importtorchfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoader# 定义数据变换data_transforms{train:transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]),val:transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]),}# 加载数据集data_dirpath_to_your_datasetimage_datasets{x:datasets.ImageFolder(os.path.join(data_dir,x),data_transforms[x])forxin[train,val]}dataloaders{x:DataLoader(image_datasets[x],batch_size32,shuffleTrue,num_workers4)forxin[train,val]}dataset_sizes{x:len(image_datasets[x])forxin[train,val]}class_namesimage_datasets[train].classes2. 模型定义与训练接下来定义并训练多个模型。importtorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportmodelsdeftrain_model(model,criterion,optimizer,scheduler,num_epochs50):best_acc0.0forepochinrange(num_epochs):print(fEpoch{epoch}/{num_epochs-1})print(-*10)# Each epoch has a training and validation phaseforphasein[train,val]:ifphasetrain:model.train()# Set model to training modeelse:model.eval()# Set model to evaluate moderunning_loss0.0running_corrects0# Iterate over data.forinputs,labelsindataloaders[phase]:inputsinputs.to(device)labelslabels.to(device)# zero the parameter gradientsoptimizer.zero_grad()# forward# track history if only in trainwithtorch.set_grad_enabled(phasetrain):outputsmodel(inputs)_,predstorch.max(outputs,1)losscriterion(outputs,labels)# backward optimize only if in training phaseifphasetrain:loss.backward()optimizer.step()# statisticsrunning_lossloss.item()*inputs.size(0)running_correctstorch.sum(predslabels.data)ifphasetrain:scheduler.step()epoch_lossrunning_loss/dataset_sizes[phase]epoch_accrunning_corrects.double()/dataset_sizes[phase]print(f{phase}Loss:{epoch_loss:.4f}Acc:{epoch_acc:.4f})# deep copy the modelifphasevalandepoch_accbest_acc:best_accepoch_acc best_model_wtscopy.deepcopy(model.state_dict())print(fBest val Acc:{best_acc:4f})# load best model weightsmodel.load_state_dict(best_model_wts)returnmodel devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)models_list[models.resnet18(pretrainedTrue),models.resnet34(pretrainedTrue),models.resnet50(pretrainedTrue),models.resnet101(pretrainedTrue),models.resnet152(pretrainedTrue),models.vgg11(pretrainedTrue),models.vgg13(pretrainedTrue),models.vgg16(pretrainedTrue),models.vgg19(pretrainedTrue),models.mobilenet_v2(pretrainedTrue),models.inception_v3(pretrainedTrue)]formodelinmodels_list:num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,len(class_names))modelmodel.to(device)criterionnn.CrossEntropyLoss()optimizeroptim.SGD(model.parameters(),lr0.001,momentum0.9)scheduleroptim.lr_scheduler.StepLR(optimizer,step_size7,gamma0.1)modeltrain_model(model,criterion,optimizer,scheduler,num_epochs50)3. 测试集评估在测试集上评估每个模型并将结果保存到CSV文件中。importcsvdeftest_model(model,dataloader,class_names):model.eval()results[]withtorch.no_grad():forinputs,labelsindataloader:inputsinputs.to(device)labelslabels.to(device)outputsmodel(inputs)_,predstorch.max(outputs,1)forpred,labelinzip(preds,labels):results.append([class_names[pred],class_names[label]])returnresults test_dataloaderDataLoader(datasets.ImageFolder(os.path.join(data_dir,test),data_transforms[val]),batch_size32,shuffleFalse,num_workers4)withopen(results.csv,w,newline)asfile:writercsv.writer(file)writer.writerow([Predicted Class,True Class])formodelinmodels_list:resultstest_model(model,test_dataloader,class_names)writer.writerows(results)4. PyQt5界面设计使用PyQt5设计一个简单的GUI界面。importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QWidget,QFileDialog,QProgressBar,QTableWidget,QTableWidgetItemfromPyQt5.QtGuiimportQPixmapimportcv2classBirdClassificationApp(QMainWindow):def__init__(self):super().__init__()self.initUI()definitUI(self):self.setWindowTitle(基于卷积神经网络的鸟类图像分类)self.setGeometry(100,100,800,600)self.image_labelQLabel(self)self.image_label.setGeometry(20,20,300,300)self.model_labelQLabel(已加载模型: ResNet34,self)self.model_label.move(350,20)self.result_labelQLabel(预测结果: ABBOTTS BOOBY,self)self.result_label.move(350,50)self.load_image_buttonQPushButton(加载图像,self)self.load_image_button.move(350,100)self.load_image_button.clicked.connect(self.load_image)self.load_folder_buttonQPushButton(加载文件夹,self)self.load_folder_button.move(350,130)self.load_folder_button.clicked.connect(self.load_folder)self.classify_buttonQPushButton(开始分类,self)self.classify_button.move(350,160)self.classify_button.clicked.connect(self.classify_image)self.clear_buttonQPushButton(清除结果,self)self.clear_button.move(350,190)self.clear_button.clicked.connect(self.clear_results)self.progress_barQProgressBar(self)self.progress_bar.setGeometry(20,350,760,20)self.table_widgetQTableWidget(self)self.table_widget.setGeometry(20,400,760,180)self.table_widget.setColumnCount(2)self.table_widget.setHorizontalHeaderLabels([预测类别,数量])self.show()defload_image(self):optionsQFileDialog.Options()file_name,_QFileDialog.getOpenFileName(self,选择图片,,Images (*.png *.xpm *.jpg *.bmp);;All Files (*),optionsoptions)iffile_name:pixmapQPixmap(file_name)self.image_label.setPixmap(pixmap.scaled(300,300))defload_folder(self):folder_pathQFileDialog.getExistingDirectory(self,选择文件夹)iffolder_path:print(fSelected folder:{folder_path})defclassify_image(self):# 这里添加分类逻辑self.progress_bar.setValue(100)self.table_widget.setItem(0,0,QTableWidgetItem(ABBOTTS BOOBY))self.table_widget.setItem(0,1,QTableWidgetItem(1))defclear_results(self):self.image_label.clear()self.table_widget.clearContents()self.table_widget.setRowCount(0)if__name____main__:appQApplication(sys.argv)exBirdClassificationApp()sys.exit(app.exec_())如图所示的训练和验证损失曲线完整的代码来定义模型、数据加载器、训练循环以及绘制损失曲线。使用PyTorch和Matplotlib实现这一过程的详细代码。1. 导入必要的库importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportmodels,transforms,datasetsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotasplt2. 数据预处理和加载# 定义数据变换data_transforms{train:transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]),val:transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]),}# 加载数据集data_dirpath_to_your_datasetimage_datasets{x:datasets.ImageFolder(os.path.join(data_dir,x),data_transforms[x])forxin[train,val]}dataloaders{x:DataLoader(image_datasets[x],batch_size32,shuffleTrue,num_workers4)forxin[train,val]}dataset_sizes{x:len(image_datasets[x])forxin[train,val]}class_namesimage_datasets[train].classes3. 模型定义devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)modelmodels.mobilenet_v2(pretrainedTrue)num_ftrsmodel.classifier[1].in_features model.classifier[1]nn.Linear(num_ftrs,len(class_names))modelmodel.to(device)criterionnn.CrossEntropyLoss()optimizeroptim.SGD(model.parameters(),lr0.001,momentum0.9)scheduleroptim.lr_scheduler.StepLR(optimizer,step_size7,gamma0.1)4. 训练模型deftrain_model(model,criterion,optimizer,scheduler,num_epochs50):train_loss_history[]val_loss_history[]best_model_wtscopy.deepcopy(model.state_dict())best_acc0.0forepochinrange(num_epochs):print(fEpoch{epoch}/{num_epochs-1})print(-*10)# Each epoch has a training and validation phaseforphasein[train,val]:ifphasetrain:model.train()# Set model to training modeelse:model.eval()# Set model to evaluate moderunning_loss0.0running_corrects0# Iterate over data.forinputs,labelsindataloaders[phase]:inputsinputs.to(device)labelslabels.to(device)# zero the parameter gradientsoptimizer.zero_grad()# forward# track history if only in trainwithtorch.set_grad_enabled(phasetrain):outputsmodel(inputs)_,predstorch.max(outputs,1)losscriterion(outputs,labels)# backward optimize only if in training phaseifphasetrain:loss.backward()optimizer.step()# statisticsrunning_lossloss.item()*inputs.size(0)running_correctstorch.sum(predslabels.data)ifphasetrain:scheduler.step()epoch_lossrunning_loss/dataset_sizes[phase]epoch_accrunning_corrects.double()/dataset_sizes[phase]print(f{phase}Loss:{epoch_loss:.4f}Acc:{epoch_acc:.4f})ifphasetrain:train_loss_history.append(epoch_loss)else:val_loss_history.append(epoch_loss)# deep copy the modelifphasevalandepoch_accbest_acc:best_accepoch_acc best_model_wtscopy.deepcopy(model.state_dict())print(fBest val Acc:{best_acc:4f})# load best model weightsmodel.load_state_dict(best_model_wts)returnmodel,train_loss_history,val_loss_history model,train_loss_history,val_loss_historytrain_model(model,criterion,optimizer,scheduler,num_epochs50)5. 绘制损失曲线plt.figure(figsize(10,6))plt.plot(train_loss_history,labelTrain Loss)plt.plot(val_loss_history,labelValidation Loss)plt.title(mobilenet_v2 - Loss)plt.xlabel(Epoch)plt.ylabel(Loss)plt.legend()plt.show()以上代码将完成模型的训练并绘制出与图片中类似的训练和验证损失曲线。请确保替换path_to_your_dataset为你的实际数据集路径。代码示例仅供参考学习。

相关新闻

《Rust程序设计》学习笔记四

《Rust程序设计》学习笔记四

^^ 《榴芒客服系统》是我们工作室开发的在线客服系统,欢迎下载试用: https://blog.csdn.net/look4liming/article/details/164755808https://blog.csdn.net/look4liming/article/details/164755808 《Rust程序设计》学习笔记四 截止到目前为止&#xff0…

2026/10/9 8:53:59 阅读更多 →
FDE实践:都在接DeepSeek、WorkBuddy,券商AI最终靠什么拉开差距?

FDE实践:都在接DeepSeek、WorkBuddy,券商AI最终靠什么拉开差距?

10月7日,腾讯WorkBuddy开放平台正式上线,广发证券成为首家入驻该生态专区的券商机构,双方联合发布“广发证券”Buddy应用专区,首批上线12项自研Skill与9项专家能力;10月7日,阿里千问开放平台上线十余款金融…

2026/10/9 8:54:59 阅读更多 →
UniMate 性能基准实测:单卡生成 60 帧骨骼动画的耗时与显存占用指南

UniMate 性能基准实测:单卡生成 60 帧骨骼动画的耗时与显存占用指南

UniMate 性能基准实测:单卡生成 60 帧骨骼动画的耗时与显存占用指南 【免费下载链接】UniMate [SIGGRAPH Asia 2026] UniMate: One Unified Model to Animate Diverse Skeletons 项目地址: https://gitcode.com/GitHub_Trending/un/UniMate UniMate&#xff…

2026/10/8 20:52:24 阅读更多 →

最新新闻

Java集合框架底层原理与性能优化:从ArrayList到HashMap

Java集合框架底层原理与性能优化:从ArrayList到HashMap

Java里的集合框架,很多开发者从学习第一天就开始用,ArrayList存数据、HashMap做缓存,写着写着就成了肌肉记忆。但真正问你几个问题——ArrayList扩容到底怎么扩的?HashMap在JDK 8里引入红黑树是为什么?遍历的时候删元素…

2026/10/10 6:35:57 阅读更多 →
USACO白银组真题解析:BFS、序列DP与边界陷阱

USACO白银组真题解析:BFS、序列DP与边界陷阱

2008年2月的USACO白银组,是很多早期选手在 usaco.org 或 POJ 上反复刷的一套题。那年白银组一共三道题:Meteor Shower(流星雨)、Eating Together(一起吃饭)、Dining Cows(奶牛排队)&…

2026/10/10 6:35:57 阅读更多 →
微软DCU英国法庭首战:从技术溯源到司法打击黑产链

微软DCU英国法庭首战:从技术溯源到司法打击黑产链

事情得从微软数字犯罪部门第一次以原告身份走进英国法院说起。对圈外人来说,这可能只是一条关于“网络黑产被告上法庭”的新闻;但对做安全运营的人来说,这条消息传递的信号其实非常重:科技巨头开始从“受害者保护者”的位置&#…

2026/10/10 6:35:57 阅读更多 →
开发团队如何评估链助手内测分发的实际价值

开发团队如何评估链助手内测分发的实际价值

开发团队如何评估链助手内测分发的实际价值在移动应用快速迭代的背景下,许多技术负责人和开发者开始关注链助手内测分发服务的性价比怎么样。其核心价值并非单纯体现在价格层面,而在于如何在降低部署成本与提升测试效率之间找到最佳平衡点。链助手通过简…

2026/10/10 6:35:57 阅读更多 →
PCA9422+STM32电源管理:从分立LDO到可编程策略

PCA9422+STM32电源管理:从分立LDO到可编程策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 6:35:57 阅读更多 →
nano代替vim:Linux新手与运维的终端编辑新选择

nano代替vim:Linux新手与运维的终端编辑新选择

1. 别再被vim劝退了:聊聊nano代替vim这件事先说说我自己的经历。刚接触Linux那会儿,我听到最多的一句话就是“你必须学会vim,因为你迟早要在终端里改配置”。于是我硬着头皮看了不少教程,记住了i进入插入模式、Esc退出、:wq保存&a…

2026/10/10 6:34:57 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →