news 2026/4/15 18:14:51

基于深度学习网络的美食识别系统matlab仿真及带GUI界面

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习网络的美食识别系统matlab仿真及带GUI界面

基于深度学习网络的美食识别系统matlab仿真,带GUI界面

最近在折腾一个好玩的项目——用Matlab搞了个能识别美食的深度学习系统。这玩意儿不仅支持常见的炸鸡披萨寿司分类,还带了个能拖拽图片的GUI界面,实测发现对着外卖拍张照准确率居然有八成以上。咱们这就来拆解这个有意思的小工具。

先说说数据这事儿。我从Food-101数据集里挑了炸鸡、寿司、披萨三类各1000张图片,用Matlab的imageDatastructure直接撸了个数据管道:

imds = imageDatastore('food_dataset',... 'IncludeSubfolders',true,... 'LabelSource','foldernames'); [trainImgs,testImgs] = splitEachLabel(imds,0.8,'randomized');

这里有个坑要注意,文件夹命名必须和类别名称完全一致。曾经因为文件夹名多了个下划线,让模型把"pizza"认成新类别,排查了俩小时才发现问题。

网络结构方面,咱们整了个轻量化的CNN。考虑到美食图片颜色特征重要,第一层卷积核特意设大了点:

layers = [ imageInputLayer([224 224 3]) convolution2dLayer(7,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(5,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(3) softmaxLayer classificationLayer];

这个结构在GTX 1060上跑起来,迭代一次大概3秒左右。如果显卡不太行的话,可以把32改成16,亲测准确率只会掉2个点左右。

训练参数设置是门玄学。经过多次尝试,下面这个配置收敛最快:

options = trainingOptions('sgdm',... 'InitialLearnRate',0.001,... 'MaxEpochs',15,... 'Shuffle','every-epoch',... 'ValidationData',testImgs,... 'VerboseFrequency',50);

注意学习率千万别超过0.005,否则直接梯度爆炸。有次手抖多按个零,loss值直接飙到NaN,训练了个寂寞。

GUI界面用App Designer拖控件搞定。核心是那个"识别"按钮的回调函数:

function RecognizeButtonPushed(app, ~) img = imread(app.ImagePath); % 读取用户上传的图片 processedImg = imresize(img,[224 224]); % 强制统一尺寸 label = classify(app.net, processedImg); % 调用训练好的模型 app.PredictionLabel.Text = char(label); % 显示结果 % 显示概率分布 scores = predict(app.net, processedImg); bar(app.UIAxes, scores); app.UIAxes.XTickLabels = {'炸鸡','寿司','披萨'}; end

这里有个骚操作——预测时不仅显示类别,还把置信度用柱状图画出来。实测发现当三个类别概率都在0.3左右时,多半是拍到混合食材了。

测试时遇到个搞笑情况:拿康师傅红烧牛肉面的包装图测试,系统坚定地认为是披萨。后来发现是因为包装上的大块牛肉和芝士颜色接近披萨,这启示我们需要加入更多"非实物"的训练样本。

要提升准确率,可以试试这几个trick:

  1. 在数据增强里加上随机遮挡
augmenter = imageDataAugmenter('RandXlation',[-20 20],... 'RandYReflection',true);
  1. 改用迁移学习,加载预训练的ResNet50:
net = resnet50; lgraph = layerGraph(net); newFCLayer = fullyConnectedLayer(3,'Name','new_fc'); lgraph = replaceLayer(lgraph,'fc1000',newFCLayer);
  1. 加入温度作为特征(比如热成像图),不过这个需要特殊传感器支持

现在的系统还有个彩蛋:连续识别出三次炸鸡后,界面会自动弹出"热量警告"的弹窗。毕竟做技术的,也得关心用户健康不是?(笑)

完整代码已经打包放在Github上,需要的小伙伴可以直接clone下来试试。下次打算加入语音播报功能,让AI用东北话报菜名,那画面想想就有意思...

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 8:38:26

浅谈:算法中的斐波那契数(三)

方法二:记忆化自底向上的方法自底向上通过迭代计算斐波那契数的子问题并存储已计算的值,通过已计算的值进行计算。减少递归带来的重复计算。算法:如果 N 小于等于 1,则返回 N。迭代 N,将计算出的答案存储在数组中。使用…

作者头像 李华
网站建设 2026/4/15 6:19:20

37、Unix系统中的进程管理与调度

Unix系统中的进程管理与调度 1. 进程会计(Process Accounting) Unix系统支持进程会计功能,但为了减轻管理日志文件的负担,该功能通常会被禁用。当启用此功能后,每个进程完成时,内核会将一个紧凑的二进制记录写入与系统相关的会计文件,如 /var/adm/pacct 或 /var/ac…

作者头像 李华
网站建设 2026/4/15 10:07:29

拖拽式运动控制画板:工控行业图形化、可二次开发编程框架

拖拽流程式运动控制画板 工控行业,图形化,可视化控件编程框架,可进行二次开发,多页签文档,可停靠布局,拖拽画板,控件框架, 支持如下 可定制开发价格另议 可视化逻辑编辑区。 多页签文…

作者头像 李华
网站建设 2026/4/8 19:06:50

40、深入探索Shell:下载、版本与初始化全解析

深入探索Shell:下载、版本与初始化全解析 1. 下载信息 在构建特定的Shell环境时,首先需要获取相应的源代码。以下为你详细介绍bash和ksh93的下载与构建过程。 1.1 bash bash可从自由软件基金会GNU项目的FTP服务器获取。截至目前,当前版本为3.0。你可以使用 wget 命令来…

作者头像 李华
网站建设 2026/4/12 11:54:13

有效应力计算

煤矿开挖区的三维渗流仿真 煤矿开挖区模型。 计算了渗流速度场以及结构的应力场煤矿开挖区的三维渗流仿真是个挺有意思的活。咱们今天聊点硬核的,直接上代码。先说说模型构建,这玩意儿得考虑煤层裂隙网络。用Python的pyvista库处理地质数据挺顺手&#x…

作者头像 李华