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

news2024/11/24 8:58:08

在这里插入图片描述


文章目录

  • 前言
  • 🎓一、数据集准备
  • 🎓二、模型训练
    • 🍀🍀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);
end

if ~exist(valDir, 'dir')
    mkdir(valDir);
end

if ~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:16
    subplot(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.coloradmin.cn/o/2239337.html

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

相关文章

马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察

一、AI 爆发重塑数据中心格局 随着AI 技术的迅猛发展,尤其是大模型的崛起,其对数据中心产生了极为深远的影响。大模型以其数以亿计甚至更多的参数和对海量数据的处理需求,成为了 AI 发展的核心驱动力之一,同时也为数据中心带来了…

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具,已经深度融入我们的工作和生活。随着物联网技术的快速发展,以及人们对PC性能要求的逐步提高,AI PC成为了行业发展的重要趋势。 11月7-8日,骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

Unity资源打包Addressable资源保存在项目中

怎么打包先看“Unity资源打包Addressable AA包” 其中遗留一个问题,下载下来的资源被保存在C盘中了,可不可以保存在项目中呢?可以。 新建了一个项目,路径与“Unity资源打包Addressable AA包”都不相同了 1.创建资源缓存路径 在…

postman变量和脚本功能介绍

1、基本概念——global、collection、environment 在postman中,为了更好的管理各类变量、测试环境以及脚本等,创建了一些概念,包括:globals、collection、environment。其实在postman中,最上层还有一个Workspaces的概…

为什么汽车电源正在用 48V 取代 12V

欧姆定律也有利于 48 伏电源 假设您需要为汽车的起动电机供电。可能存在以下静态和动态特征: 电源电压:12V 额定电流:40A 额定功率:480W 标称平均阻抗:0.3Ω 浪涌电流:150A 浪涌功率:1,8…

【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\…

酷炫的鼠标移入效果(附源码!!)

预览效果 源码(htmljs部分) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

PHP和Python脚本的性能监测方案

目录 1. 说明 2. PHP脚本性能监测方案 2.1 安装xdebug 2.2 配置xdebug.ini 2.3 命令行与VS Code中使用 - 命令行 - VS Code 2.4 QCacheGrind 浏览 3. Python脚本性能监测方案 3.1 命令行 4. 工具 5.参考 1. 说明 获取我们的脚本程序运行时的指标&#xff0c;对分析…

【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进

文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…

hive中windows子句的使用

概述 1&#xff0c;windows子句是对窗口的结果做更细粒度的划分 2、windows子句中有两种方式 rows &#xff1a;按照相邻的几行进行开窗 range&#xff1a;按照某个值的范围进行开窗 使用方式 (rows | range) between (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING…

GPT4的下一代Orion已经降速了?

嘿&#xff0c;大家好&#xff0c;我是小索奇&#xff01;说起AI&#xff0c;相信不少人都和我一样&#xff0c;总感觉这玩意儿发展得就像装了火箭&#xff0c;快得让人眼花缭乱。咱们从GPT-3到GPT-4&#xff0c;一路哇哦着过来&#xff0c;天天惊叹它越来越聪明&#xff0c;越…

【LinuxC编程】06 - 守护进程,线程

进程组和会话 概念和特性 进程组&#xff0c;也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念&#xff0c;是为了简化对多个进程的管…

探索 Python 图像处理的瑞士军刀:Pillow 库

文章目录 探索 Python 图像处理的瑞士军刀&#xff1a;Pillow 库第一部分&#xff1a;背景介绍第二部分&#xff1a;Pillow库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单的库函数使用方法第五部分&#xff1a;结合场景使用库第…

【数据结构 | C++】字符串关键字的散列映射

字符串关键字的散列映射 给定一系列由大写英文字母组成的字符串关键字和素数P&#xff0c;用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数&#xff0c;每个字符占5位&#xff1b;再用除留余数法将整数映射到长度为P的散列表中。 例如将字符串AZDEG插入长…

游戏引擎学习第五天

这节貌似没讲什么 视频参考:https://www.bilibili.com/video/BV1Gmm2Y5EwE/ uint8 *A somewhere in memory; uint8 *B somewhere in memory;//BEFORE WE GOT TO HERE int Y *B; // whatever was actually there before the 5 *A 5; int X *B; // 5 //Obviously! Y and …

Linux——基础指令2 + 权限

目录 1.zip/unzip 2.tar 3.bc 4.uname –r 5.重要的几个热键 6.扩展命令 7.shell命令以及运行原理 8.Linux权限的理解 关于权限的三个问题&#xff1a; 1.目录权限 2.缺省权限 3.粘滞位 1.zip/unzip 打包、压缩&#xff1a;使用特定的算法&#xff0c;文件进行合…

摄像机视频分析软件下载LiteAIServer视频智能分析软件抖动检测的技术实现

在现代社会中&#xff0c;视频监控系统扮演着至关重要的角色&#xff0c;其可靠性和有效性在很大程度上取决于视频质量。然而&#xff0c;由于多种因素&#xff0c;如摄像机安装不当、外部环境振动或视频信号传输的不稳定&#xff0c;视频画面常常出现抖动问题&#xff0c;这不…

Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法

类型转换 传统方法astype使用value_counts统计通过apply替换并使用astype转换 pd.to_numericx对连续变量进行转化⭐参数&#xff1a;返回值&#xff1a;示例代码&#xff1a; isnull不会检查空字符串 数据准备 有一组数据信息如下&#xff0c;其中主要将TotalCharges、MonthlyC…

Fish Agent V0.13B:Fish Audio的语音处理新突破,AI语音助手的未来已来!

近日&#xff0c;Fish Audio公司发布了一款全新的语音处理模型——Fish Agent V0.13B&#xff0c;这款模型以其高效、精确的语音生成和处理能力&#xff0c;尤其是在模拟或克隆不同声音方面的表现&#xff0c;引起了广泛关注。这不仅意味着我们在拥有一个声音自然、反应迅速的A…

稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Geometry-Aware Attenuation Learning forSparse-View CBCT Reconstruction 稀疏视角CBCT重建的几何感知衰减学习 01 文献速递介绍 稀疏视角锥形束计算机断层扫描&#xff08;CBCT&#xff09;重建的几何感知学习方法 锥形束计算机断层扫描&#xff08;CBCT&a…