基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

在这里插入图片描述


文章目录

  • 前言
  • 🎓一、数据集准备
  • 🎓二、模型训练
    • 🍀🍀1.初始化
    • 🍀🍀2.加载数据集
    • 🍀🍀3.划分数据集,并保存到新的文件夹
    • 🍀🍀4.可视化数据集
    • 🍀🍀5.模型构建
    • 🍀🍀6.数据增强
    • 🍀🍀7.设置训练参数
    • 🍀🍀8.训练与测试
  • 🎓三、模型测试
    • 🍀🍀1.初始化
    • 🍀🍀2.读取模型
    • 🍀🍀3.读取一张图片
    • 🍀🍀4.将图像调整为模型所需的输入尺寸
    • 🍀🍀5.预测
    • 🍀🍀6.条形图展示
  • 🎓四、界面设计与实现
  • 🎓五、源码下载


前言

饮食在人们的日常生活、营养与医疗建议以及运动员等专业人士的训练上起着越来越重要的作用。随着互联网的发展和医学的进步,人们普遍上传分享和记录的食物图像形成了非常多的数据库,为了改善饮食结构,塑造更健康的生活方式,分析食物的种类、热量和进食时间成为了营养学上非常重要的研究方法,本文的使用深度学习算法可以根据用户上传的食物图像自动分析食物种类。深度学习是机器学习领域的一个研究方向。深度学习通过对数据特征的学习将原始数据转化为计算机可以理解的抽象数据,根据学习到的特征,可以对原始数据进行检测或分类。深度学习有三个组成部分:架构、目标函数和学习规则。架构是模型中数据的连接规则,目标函数用于评估预测结果与真实结果的一致性,是评估深度学习模型输出结果的标准,学习规则是更新模型中参数的方式。制定合理高效的框架,目标函数和学习规则对提高深度学习模型的精度和效率至关重要。本文构建了一个不同类别的菜品或甜点食物数据集,数据集一共 4000 张,采用 ResNet-50 网络模型训练,接下来手把手教你训练、界面设计与实现。
源码不做任何修改,重点重点重点:为了代码运行不报错,安装 matlab 版本为 2021 及以上版本。
matlab安装教程大家可以参考这个教程: 手把手教你安装matlab软件
文章末尾获取源码+数据集+界面。
在这里插入图片描述


🎓一、数据集准备

训练前准备好数据集,可以是开源的,自己采集的都行,每一个文件夹包含一个食物,命名规则是英文的,我这里准备 10 个类别,大家根据自己需要准备自己所需的数据集就行
在这里插入图片描述
在这里插入图片描述


🎓二、模型训练

编写训练脚本,下面一步一步构建

🍀🍀1.初始化

方便运行脚本时无需手动调整路径:

clear
clc
rng default  
mpath = matlab.desktop.editor.getActiveFilename; 
[pathstr,~]=fileparts(mpath);
cd(pathstr); 

🍀🍀2.加载数据集

加载数据集,并统计每个类别的图像数量

imgDir = fullfile("F:/BaiduNetdiskDownload/matlab_data/");
dataSet = imageDatastore(imgDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
trainSetDetail = countEachLabel(dataSet) % 训练数据

在这里插入图片描述

🍀🍀3.划分数据集,并保存到新的文件夹

划分比例根据自己需求进行划分就行,我训练集,验证集, 测试集按 6:2:2 比例划分
在这里插入图片描述

% 划分数据集
[trainData, valData, testData] = splitEachLabel(dataSet, 0.6, 0.2, 'randomize');% 创建保存图像的目录
trainDir = fullfile(pathstr, 'TrainingSet');
valDir = fullfile(pathstr, 'ValidationSet');
testDir = fullfile(pathstr, 'TestSet');if ~exist(trainDir, 'dir')mkdir(trainDir);
endif ~exist(valDir, 'dir')mkdir(valDir);
endif ~exist(testDir, 'dir')mkdir(testDir);
end% 复制训练数据集图像
for idx = 1:numel(trainData.Files)currentImgPath = trainData.Files{idx};[~, imgBaseName, imgExt] = fileparts(currentImgPath);destinationPath = fullfile(trainDir, [imgBaseName, imgExt]);copyfile(currentImgPath, destinationPath);
end% 复制验证数据集图像
for idx = 1:numel(valData.Files)currentImgPath = valData.Files{idx};[~, imgBaseName, imgExt] = fileparts(currentImgPath);destinationPath = fullfile(valDir, [imgBaseName, imgExt]);copyfile(currentImgPath, destinationPath);
end% 复制测试数据集图像
for idx = 1:numel(testData.Files)currentImgPath = testData.Files{idx};[~, imgBaseName, imgExt] = fileparts(currentImgPath);destinationPath = fullfile(testDir, [imgBaseName, imgExt]);copyfile(currentImgPath, destinationPath);
end

运行代码之后生成训练集,验证集, 测试集文件夹
在这里插入图片描述

🍀🍀4.可视化数据集

从训练图像数据集中随机抽取并显示 16 张图像进行查看

numTrainImages = numel(trainData.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16subplot(4,4,i)I = readimage(trainData,idx(i));imshow(I)title(trainData.Labels(idx(i)))
end

运行代码输出如下:
在这里插入图片描述

🍀🍀5.模型构建

我使用 resnet50 ,大家可以跟换其他模型

net = resnet50;
layers = net.Layers
inputSize = net.Layers(1).InputSize  % 网络输入尺寸

运行代码报错:
错误使用 resnet50resnet50 需要 Deep Learning Toolbox Model for ResNet-50 Network 支持包以使用预训练的权重。要安装此支持包,请使用附加功能资源管理器。要使用未训练的层,请使用resnet50(Weights,"none),这不需要支持包。在这里插入图片描述
解决方法:
双击我给的文件进行安装
在这里插入图片描述
没有邮箱自己注册一个,qq邮箱就行,之后登录就行
在这里插入图片描述
等待安装
在这里插入图片描述
在这里插入图片描述
之后重新运行,输出如下
在这里插入图片描述
下面代码的第一个 10 是全连接层的输出节点数量,意思就是数据集中的类别数量,因为我有 10 个类别,大概根据自己的数据集进行修改。‘WeightLearnRateFactor’,10 和 ‘BiasLearnRateFactor’,10 意思就是设置权重和偏置的学习率因子为 10。

lgraph = layerGraph(net); 
newLearnableLayer = fullyConnectedLayer(10, ...'Name','new_fc', ...'WeightLearnRateFactor',10, ...'BiasLearnRateFactor',10);lgraph = replaceLayer(lgraph,'fc1000',newLearnableLayer);
newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_fc1000',newClassLayer);

🍀🍀6.数据增强

为了提高模型的泛化能力,我们在训练过程中使用数据增强技术。数据增强可以通过对训练图像进行随机变换(例如翻转、平移等)来生成更多的训练样本。这有助于模型在面对不同视角、尺度和形态的图像时具有更好的泛化能力。在本例中,采用随机水平翻转以及随机平移的方法进行数据增强。此外,还需要处理灰度图像。由于预训练的 ResNet-50 模型期望输入为彩色图像,需要将灰度图像转换为伪彩色图像,使其可以被模型正确处理。

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...'RandXReflection',true, ...'RandXTranslation',pixelRange, ...'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),trainData, ...'DataAugmentation',imageAugmenter,'ColorPreprocessing','gray2rgb');
augimdsValidation = augmentedImageDatastore(inputSize(1:2),valData);
augimdsTest = augmentedImageDatastore(inputSize(1:2),testData);

🍀🍀7.设置训练参数

options = trainingOptions('sgdm', ...'MiniBatchSize',32, ...'MaxEpochs',15, ...'InitialLearnRate',1e-4, ...'Shuffle','every-epoch', ...'ValidationData',augimdsValidation, ...'ValidationFrequency',3, ...'Verbose', true, ...'Plots','training-progress');

参数解释:

  • 第一个设置优化器为 sgdm
  • MiniBatchSize,32:每次迭代时使用的批次大小为 32
  • MaxEpochs,15:最大训练轮数为 15
  • InitialLearnRate,1e-4:初始学习率为 1e-4
  • Shuffle,every-epoch:在每个 epoch 结束时打乱训练数据的顺序
  • ValidationData,augimdsValidation:指定用于验证的增强图像数据存储对象 augimdsValidation。
  • ValidationFrequency,3:每训练 3 次迭代就进行一次验证。
  • Verbose, true:在命令窗口显示训练过程的详细信息。
  • Plots,training-progress:显示一个实时图表,展示训练进度,包括训练和验证的损失、准确率等指标。

大家根据自己调整训练参数就行

🍀🍀8.训练与测试

开始运行和保存训练模型

model = trainNetwork(augimdsTrain,lgraph,options);
save('ResNet_4_classes.mat', 'model');

使用该模型对测试数据进行分类,并计算测试集上的准确率

[YPred,scores] = classify(model, augimdsTest);
YTest = imdsTest.Labels;
accuracy = mean(YPred == YTest)

训练过程,这是一个比较漫长的过程
在这里插入图片描述

🎓三、模型测试

编写测试代码

🍀🍀1.初始化

clear
clc
rng default  % 保证结果运行一致

🍀🍀2.读取模型

读取训练好的模型和获取标签名字

load('ResNet_3_classes.mat','model')
inputSize= model. Layers(1).InputSize
class_names = model. Layers(end).ClassNames ;
num_classes = numel(class_names) ;
disp(class_names(randperm(num_classes, 10)))

🍀🍀3.读取一张图片

Img = imread('11483.jpg');
figure
imshow(Img)

🍀🍀4.将图像调整为模型所需的输入尺寸

Img = imresize(Img, inputSize(1: 2));
figure
imshow(Img)

🍀🍀5.预测

将输出预测的类别和对应的置信度分数,显示在图像上方的标题中

[labels, scores] = classify(model, Img);
figure
imshow(Img)
title(string(labels)+","+ num2str(100*scores(class_names == labels),3)+"%");

运行结果如下:
在这里插入图片描述

🍀🍀6.条形图展示

[~,idx] = sort(scores, 'descend');
idx=idx(3:-1:1);
classNamesTop = model.Layers(end).ClassNames(idx);
scoresTop = scores(idx);
figure
%绘制条形图显示置信度值
mybar=barh(scoresTop);
xlim([0 1.1])
yticklabels(classNamesTop)
xtips = mybar(1) .YEndPoints + 0.02; 
ytips =mybar(1) .XEndPoints ;
labels = string(round(mybar(1).YData, 2));
text(xtips ,ytips ,labels, 'VerticalAlignment','middle')
title('指名前3的预测结果')
xlabel('置信度值')

运行如下:
在这里插入图片描述

🎓四、界面设计与实现

上传图片即可输出结果,可以更换自己模型,构建成自己的系统
在这里插入图片描述

在这里插入图片描述


🎓五、源码下载

下载链接: 源码+数据集+界面
关注我,带你不挂科!!!
在这里插入图片描述

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

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

相关文章

【webrtc】 RTP 中的 MID(Media Stream Identifier)

RTP 中的 MID(Media Stream Identifier) RID及其与MID的区别 cname与mid的对比【webrtc】CNAME 是rtprtcp中的Canonical Name(规范化名称) 同样都是RTP头部扩展: 基于mediasoup的最新的代码,学习,发现mid在创建RtpSendStream时是必须传递的参数: 例如 D:\XTRANS\soup\…

Node.Js+Knex+MySQL增删改查的简单示例(Typescript)

数据库: CREATE DATABASE MyDB; CREATE TABLE t_users (user_id int(11) NOT NULL,user_name varchar(10) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8; 项目结构: package.json如下,拷贝并替换你们本地的package.json后运行 npm install 命令安装所需要的依赖。…

【MATLAB代码】二维平面上的TDOA,使用加权最小二乘法,不限制锚点数量,代码可复制粘贴

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置。 订阅专栏后可以看到完整代码,复制到MATLAB空脚本上面即可直接运行。若需要单独下载,可通过下面的链接:https://download.cs…

python数据写入excel文件

主要思路:数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e , v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法,指定了 orient‘index’ 表示使用字典的键作为行索引,然…

【深度学习】LSTM、BiLSTM详解

文章目录 1. LSTM简介:2. LSTM结构图:3. 单层LSTM详解4. 双层LSTM详解5. BiLSTM6. Pytorch实现LSTM示例7. nn.LSTM参数详解 1. LSTM简介: LSTM是一种循环神经网络,它可以处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM通…

使用ookii-dialogs-wpf在WPF选择文件夹时能输入路径

在进行WPF开发时,System.Windows.Forms.FolderBrowserDialog的选择文件夹功能不支持输入路径: 希望能够获得下图所示的选择文件夹功能: 于是,通过NuGet中安装Ookii.Dialogs.Wpf包,并创建一个简单的工具类: …

【leetcode练习·二叉树】用「分解问题」思维解题 II

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 II | labuladong 的算法笔记] 技巧一 类似于判断镜像二叉树、翻转二叉树的问题,一般也可以用分解问题的思路,无非就是把整棵树的问题(原问题)分解成子树之间的问…

Qt 编写插件plugin,支持接口定义信号

https://blog.csdn.net/u014213012/article/details/122434193?spm1001.2014.3001.5506 本教程基于该链接的内容进行升级,在编写插件的基础上,支持接口类定义信号。 环境:Qt5.12.12 MSVC2017 一、创建项目 新建一个子项目便于程序管理【…

PaaS云原生:分布式集群中如何构建自动化压测工具

场景 测试环境中,压测常常依赖环境中的各种工具获取基础信息,而这些工具可能集中在某个中控机上,此时想打造的自动化工具的运行模式是: 通过中控机工具获取压测所需的基本信息在中控机部署压测工具,实际压测任务分发…

关于sass在Vue3中编写bem框架报错以及警告问题记录

在编写完bem框架后 在vite.config.ts文件进行预编译处理时,报错的错误 1. 处理方式:使用新版api, 如图: 2. 处理方式:使用 use 替换掉 import, 如图: 3. 处理方式:使用路径别名&am…

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪BD311R 发布时间: 2024-10-23 11:28:42 一、 产品图片: 二、 产品特性: 4G性能:支持2K超高清图传,数据传输不掉帧,更稳定。 独立北…

【前端】深入浅出的React.js详解

React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并维护。随着 React 的不断演进,官方文档也在不断更新和完善。本文将详细解读最新的 React 官方文档,涵盖核心概念、新特性、最佳实践等内容,帮助开发者更好地理解…

【Elasticsearch入门到落地】1、初识Elasticsearch

一、什么是Elasticsearch Elasticsearch(简称ES)是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。它使用Java编写,基于Apache Lucene来构建索引和提供搜索功能,是一个分布式、可扩展、近实…

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易👍👍👍 创建两个.c 一个.h 1:test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…

ORA-01092 ORA-14695 ORA-38301

文章目录 前言一、MAX_STRING_SIZE--12C 新特性扩展数据类型 varchar2(32767)二、恢复操作1.尝试恢复MAX_STRING_SIZE参数为默认值2.在upgrade模式下执行utl32k.sql 前言 今天客户发来一个内部测试库数据库启动截图报错,描述是“上午出现服务卡顿,然后重…

ODOO学习笔记(3):Odoo和Django的区别是什么?

Odoo和Django都是基于Python的开源框架,但它们的设计目标和用途有所不同: 设计目标和用途: Odoo:Odoo是一个企业资源规划(ERP)系统,它提供了一套完整的商业管理软件,包括会计、库存…

零基础玩转IPC之——海思平台实现P2P远程传输实验(基于TUTK,国科君正全志海思通用)

老规矩,先做实验测试。以本店Hi3516EV200\GK7205开发板为例,其他开发板操作类似。 将源码包p2p-h264.tgz放到虚拟机,解压,编译 tar -jxvf p2p-h264.tgz cd p2p-h264 make clean make 得到可执行文件p2p-h264 启动开发板&…

如何理解DDoS安全防护在企业安全防护中的作用

DDoS安全防护在安全防护中扮演着非常重要的角色。DDoS(分布式拒绝服务)攻击是一种常见的网络攻击,旨在通过向目标服务器发送大量请求,以消耗服务器资源并使其无法正常运行。理解DDoS安全防护的作用,可以从以下几个方面…

Python如何从HTML提取img标签下的src属性

目录 前提准备步骤1. 解析HTML内容2. 查找所有的img标签3. 提取src属性 完整代码 前提准备 在处理网页数据时,我们经常需要从HTML中提取特定的信息,比如图片的URL。 这通常通过获取img标签的src属性来实现。 在开始之前,你需要确保已经安装…

Redis主从复制(replication)

文章目录 是什么作用使用案例实操主从复制原理和工作流程slave启动,同步初请首次连接,全量复制心跳持续,保持通信进入平稳,增量复制从机下线,重连续传 复制的缺点 是什么 主从复制,master以写为主&#xf…