matlab 使用预训练神经网络和SVM进行苹果分级(带图形界面)支持其他物品图片分级或者分类

目录

数据集:

实验代码:alexnet版

如果你的matlab不是正版,先看这里:

数据集结构:

训练代码:

训练结果:

 图形界面:

界面展示:

其他: 

 输出结果:


        实验思路是使用预训练神经网络对图片进行特征提取,然后再使用SVM对得到的特征进行处理。

        写完后试过基于形态学分类,可能是数据集的原因,用了面积、周长、最小外接矩形的长和宽、离心率、灰度均值、HSV均值,方差等作为特征,结果并不理想。

        用的matlab2021a,老师那要的(没法发安装包,只能线下找我)低版本不确定能用。

数据集:

自己搞得,不太行,还是建议你用其他的网上数据集

实验代码:alexnet版

如果你的matlab不是正版,先看这里:

如果你的matlab不是正版,无法下载Deep Learning Toolbox Model for AlexNet Network来获得已经训练好的神经网络可以去官网下载,或者在我这花1积分下载Deep Learning Toolbox Model for AlexNet Network - File Exchange - MATLAB CentralDownload and share free MATLAB code, including functions, models, apps, support packages and toolboxeshttps://ww2.mathworks.cn/matlabcentral/fileexchange/59133-deep-learning-toolbox-model-for-alexnet-network?s_tid=ta_fx_results

如果是在b站上下载的2022版有可能会崩溃,提前做好心理准备(偶然现象) 

下载完后(如果是压缩包的话先解压),将安装包拖进matlab的工作目录

 然后双击工作目录里的这个安装包来运行它,会弹出这个界面

按提示操作

 输入完毕后验证电子邮件

 设置密码

 就开始下载了

 下载完就能用已经训练好的alexnet了

数据集结构:

数据集下载        我这个数据集很一般,建议从网上找数据集

 

 apple数据集,里面的每个文件夹是一个类别(名字随便写,不过最好不是中文),图片是哪一种就放在那个文件夹里

训练代码:

file是数据集所在文件夹

训练完会有提示,让你选择保存不保存数据集

报错说alexnet什么的看上面-------如果你的matlab不是正版

clc;
clear;
file = 'D:/apple';
% 读取file中所有图片,以文件夹名作为标签
appleData = imageDatastore(file, 'IncludeSubfolders', true, 'LabelSource', 'foldernames')
% 调整大小适应后来的AlexNet模型输入
appleData.ReadFcn = @(x) imresize(imread(x), [227 227]);
% 划分测试集训练集,会打乱
[trainImds, testImds] = splitEachLabel(appleData, 0.8, 'randomized');
net = alexnet;% 加载AlexNet模型
% 特征提取
% 使用activations函数对训练集和测试集的图像进行特征提取
% 输出第七层的特征
featuresTrain = activations(net, trainImds, 'fc7', 'OutputAs', 'rows');
featuresTest = activations(net, testImds, 'fc7', 'OutputAs', 'rows');
fprintf('开始训练');
% 训练SVM,fitcecoc任数训练SVM分类器
svmModel = fitcecoc(featuresTrain,trainImds.Labels);
% 在测试集计算准确率
fprintf('预测值:');
predictedLabels = predict(svmModel, featuresTest);
fprintf('真实值:');
testImds.Labels
fprintf('正确率:');
accuracy = mean(predictedLabels == testImds.Labels)
x = input('是否保存svmModel已训练模型(y/n)',"s") ;
if(x=='y')
    save svm_Model svmModel
    fprintf('模型已保存到svm_Model.mat')
end

训练结果:


appleData = 

  ImageDatastore - 属性:

                       Files: {
                              'D:\apple\1\1.jpeg';
                              'D:\apple\1\1.jpg';
                              'D:\apple\1\10.jpg'
                               ... and 197 more
                              }
                     Folders: {
                              'D:\apple'
                              }
                      Labels: [1; 1; 1 ... and 197 more categorical]
    AlternateFileSystemRoots: {}
                    ReadSize: 1
      SupportedOutputFormats: ["png"    "jpg"    "jpeg"    "tif"    "tiff"]
         DefaultOutputFormat: "png"
                     ReadFcn: @readDatastoreImage

开始训练预测值:真实值:
ans = 

  41×1 categorical 数组

     1 
     1 
     1 
     1 
     1 
     1 
     1 
     1 
     1 
     1 
     1 
     1 
     1 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     2 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 
     3 

正确率:
accuracy =

    0.9512

是否保存svmModel已训练模型(y/n)y
模型已保存到svm_Model.mat>> 

 图形界面:

用matlab自带的设计app做的

 我主要就写了一个按钮的回调,一定要记着保存SVM模型后再用,没做读取错误报错。

classdef apple < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure          matlab.ui.Figure
        EditField_2       matlab.ui.control.EditField
        EditField_2Label  matlab.ui.control.Label
        EditField         matlab.ui.control.EditField
        Label             matlab.ui.control.Label
        Image             matlab.ui.control.Image
        Button            matlab.ui.control.Button
    end

    

    % Callbacks that handle component events
    methods (Access = private)

        % Button pushed function: Button
        function ButtonPushed(app, event)
            global svmModel net;% 模型
            % 如果没有模型,加载模型
            if(exist('svmModel','var')&&exist('net','var'))
                net = alexnet;% 加载AlexNet模型
                load svm_Model svmModel% 加载已训练模型
            end
            
            % 打开文件对话框 禁止多选
            [file,path]=uigetfile('*.*',' Multiselect ' ,'off');
            if(file==0) % 没读文件
                return
            end
            % 更改路径文本
            file = [path,file];
            app.EditField.Value = file;
            app.Image.ImageSource = imread(file);% 更改图像显示
            % 创建需要读取特征的数据
            appleData =  imageDatastore(file);
            % 调整大小适应后来的AlexNet模型输入
            appleData.ReadFcn = @(x) imresize(imread(x), [227 227]);
            appleData = activations(net, appleData, 'fc7', 'OutputAs', 'rows');
            Labels = predict(svmModel, appleData);
            app.EditField_2.Value = string(Labels);
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 415 393];
            app.UIFigure.Name = 'MATLAB App';

            % Create Button
            app.Button = uibutton(app.UIFigure, 'push');
            app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
            app.Button.FontSize = 20;
            app.Button.Position = [36 21 100 34];
            app.Button.Text = '选择文件';

            % Create Image
            app.Image = uiimage(app.UIFigure);
            app.Image.Position = [86 134 237 237];

            % Create Label
            app.Label = uilabel(app.UIFigure);
            app.Label.HorizontalAlignment = 'right';
            app.Label.FontSize = 20;
            app.Label.Position = [23 68 125 26];
            app.Label.Text = '图片文件路径';

            % Create EditField
            app.EditField = uieditfield(app.UIFigure, 'text');
            app.EditField.Editable = 'off';
            app.EditField.Position = [157 61 230 36];

            % Create EditField_2Label
            app.EditField_2Label = uilabel(app.UIFigure);
            app.EditField_2Label.HorizontalAlignment = 'right';
            app.EditField_2Label.FontSize = 20;
            app.EditField_2Label.Position = [209 22 65 26];
            app.EditField_2Label.Text = '级别:';

            % Create EditField_2
            app.EditField_2 = uieditfield(app.UIFigure, 'text');
            app.EditField_2.Editable = 'off';
            app.EditField_2.Position = [273 23 50 24];

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = apple

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end

界面展示:

其他: 

如果觉着一个网络不好的话,这里还有一种操作:

或者你们还可以使用 Adaboost

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。

这几个网络都可以再之前的官网下载

clc;
clear;
file = 'D:/apple';
% 读取file中所有图片,以文件夹名作为标签
appleData = imageDatastore(file, 'IncludeSubfolders', true, 'LabelSource', 'foldernames')
% 调整大小适应后来的AlexNet模型输入
appleData.ReadFcn = @(x) imresize(imread(x), [227 227]);
% 划分测试集训练集,会打乱
[trainImds, testImds] = splitEachLabel(appleData, 0.8, 'randomized');
fprintf("\n开始加载预训练模型");
net1 = alexnet;% 加载预训练模型
net2 = vgg16;
net3 = resnet18;
% 特征提取
% 使用activations函数对训练集和测试集的图像进行特征提取
% alexnet,他有8层神经网络,
% 其中前5层是卷积层,后3层是全连接层。其中fc7层是全连接层的第2个,它包含4096个神经元
% 该层可以提取图像的高级语义特征,这些特征已经经过多次卷积和池化操作,
% 能够捕捉到图像的基本形状和纹理信息,同时又不会过于抽象
% 输出第七层的特征,按行输出,
fprintf("\n开始使用预训练模型提取特征");
featuresTrain1 = activations(net1, trainImds, 'fc7', 'OutputAs', 'channels');
featuresTrain2 = activations(net2, trainImds, 'fc7', 'OutputAs', 'channels');
featuresTrain3 = activations(net3, trainImds, 'pool5', 'OutputAs', 'channels');
fprintf("\n已经提取训练集特征提取特征");
featuresTest1 = activations(net1, testImds, 'fc7', 'OutputAs', 'channels');
featuresTest2 = activations(net2, testImds, 'fc7', 'OutputAs', 'channels');
featuresTest3 = activations(net3, testImds, 'pool5', 'OutputAs', 'channels');
fprintf("\n已经提取测试集特征提取特征");
featuresTrain1 = reshape(featuresTrain1, [], size(featuresTrain1, 4))';
featuresTrain2 = reshape(featuresTrain2, [], size(featuresTrain2, 4))';
featuresTrain3 = reshape(featuresTrain3, [], size(featuresTrain3, 4))';
featuresTest1 = reshape(featuresTest1, [], size(featuresTest1, 4))';
featuresTest2 = reshape(featuresTest2, [], size(featuresTest2, 4))';
featuresTest3 = reshape(featuresTest3, [], size(featuresTest3, 4))';
fprintf('\n开始训练');
% 训练SVM,fitcecoc任数训练SVM分类器
svmModel_1 = fitcecoc(featuresTrain1,trainImds.Labels);
svmModel_2 = fitcecoc(featuresTrain2,trainImds.Labels);
svmModel_3 = fitcecoc(featuresTrain3,trainImds.Labels);
% 在测试集计算准确率
predictedLabels1 = predict(svmModel_1, featuresTest1);
predictedLabels2 = predict(svmModel_2, featuresTest2);
predictedLabels3 = predict(svmModel_3, featuresTest3);
fprintf('alexnet 正确率:');
mean(predictedLabels1 == testImds.Labels)
fprintf('vgg16 正确率:');
mean(predictedLabels2 == testImds.Labels)
fprintf('resnet18 正确率:');
mean(predictedLabels3 == testImds.Labels)
% 返回一组数据中出现最频繁的元素
predictedLabels = mode([predictedLabels1, predictedLabels2, predictedLabels3], 2);
% 计算投票分类正确率
fprintf('投票正确率:');
accuracy = mean(predictedLabels == testImds.Labels)

x = input('是否保存已训练模型(y/n)',"s") ;
if(x=='y')
    save svm_Model_3 svmModel_1 svmModel_2 svmModel_3
    fprintf('模型已保存到 svm_Model_3.mat')
end

 输出结果:

这个1就很晃眼,大概率不是真的。


appleData = 

  ImageDatastore - 属性:

                       Files: {
                              'D:\apple\1\1.jpeg';
                              'D:\apple\1\1.jpg';
                              'D:\apple\1\10.jpg'
                               ... and 197 more
                              }
                     Folders: {
                              'D:\apple'
                              }
                      Labels: [1; 1; 1 ... and 197 more categorical]
    AlternateFileSystemRoots: {}
                    ReadSize: 1
      SupportedOutputFormats: ["png"    "jpg"    "jpeg"    "tif"    "tiff"]
         DefaultOutputFormat: "png"
                     ReadFcn: @readDatastoreImage


开始加载预训练模型
开始使用预训练模型提取特征
已经提取训练集特征提取特征
已经提取测试集特征提取特征
开始训练alexnet 正确率:
ans =

    0.9512

vgg16 正确率:
ans =

    0.9024

resnet18 正确率:
ans =

    0.9512

投票正确率:
accuracy =

     1

是否保存已训练模型(y/n)y
模型已保存到 svm_Model_3.mat>> 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansible练习

部署ansible练习 开始之前先使用student用户登录 登录命令&#xff1a;ssh studentworkstation 在workstation上运行lab deploy-review start命令&#xff0c;此脚本将确保受管主机在网络上访问。 然后开始验证控制节点上是否安装了ansible软件包&#xff0c;在运行anisble -…

centos磁盘扩容

解释 PE - 物理块&#xff08;Physical Extent&#xff09; 硬盘上有很多实际物理存在的存储块PV - 物理卷 &#xff08;Physical Volume&#xff09; 物理卷处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘(相当于单独做一个分区)&…

GPT模型训练实践(2)-Transformer模型工作机制

Transformer 的结构如下&#xff0c;主要由编码器-解码器组成&#xff0c;因为其不需要大量标注数据训练和天然支持并行计算的接口&#xff0c;正在全面取代CNN和RNN&#xff1a; 扩展阅读&#xff1a;What Is a Transformer Model? ​ ​ 其中 编码器中包含自注意力层和前馈…

LabVIEW 图像处理功能

设置成像系统并采集图像后&#xff0c;您可以分析和处理图像&#xff0c;以提取有关被检测对象的有价值信息。 内容 图像分析图像处理斑点分析机器视觉 图像分析 影像分析结合了基于影像像素的灰度强度计算统计数据和测量的技术。您可以使用影像分析功能来确定影像质量是否足以…

Java单例模式

Java单例模式 1、概念2、代码实现方案饿汉式实现:懒汉式实现:饿汉式PK懒汉式&#xff1a; 3、单例模式的特点及适用场景优点&#xff1a;缺点&#xff1a;适用场景&#xff1a; 4、关于单例模式的常见问题4.1 public static SingletonOne getlnstance(){}A.该方法为什么用静态的…

python爬虫快速入门

Python有其简洁明了&#xff0c;功能强大的优势&#xff0c;特别是在网络爬虫的应用上。接下来&#xff0c;我将分享一个适合Python初学者的爬虫快速入门教程。 一、Python爬虫简介 网页爬虫&#xff0c;是一种自动从互联网上获取信息的程序。在Python语言中&#xff0c;requ…

【Qt】程序异常结束。The process was ended forcefully.(解决方法不一样哦)

环境 系统&#xff1a;win10 64bit Qt&#xff1a;5.14.1 编译器&#xff1a;MinGW 32-bit 问题 Qt工程编译正常&#xff0c;但无法调试&#xff0c;报错&#xff1a;程序异常结束。The process was ended forcefully. 步骤 已尝试网上方法仍然不行的&#xff0c;可以直接…

Visual studio 快捷键(个人记录加深印象)

1、CtrlK 后 Ctrlx 插入代码片段快捷键&#xff08;或 编辑”>“IntelliSense”>“插入代码片段&#xff09; 注&#xff08;摘抄&#xff09;&#xff1a;该列表包含用于创建类、构造函数、for 循环、if 或 switch 语句等的代码片段

硬件学习件Cadence day12 PCB设计中打地孔与地孔设计,PCB 后期处理,钻孔文件导出

1. 制作 过地孔的焊盘 &#xff08;两种方法&#xff09;&#xff08;又叫制作盲埋孔&#xff09; 1.1 制作热风焊盘 &#xff08;之前的教程有&#xff0c;现在只给数据&#xff09; 1.2 第一种 allegro 外部 焊盘软件制作 1.2.1 打开软件 1.2.2 制作焊盘&#xff0c;查看…

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…

【SQL应知应会】分析函数的点点滴滴(二)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数&#xff1a;…

图书推荐管理系统Python,基于Django和协同过滤算法等实现

一、介绍 图书推荐系统 / 图书管理系统&#xff0c;以Python作为开发语言&#xff0c;基于Django实现&#xff0c;使用协同过滤算法实现对登录用户的图书推荐。 二、效果展示 三、演示视频 视频代码&#xff1a;https://www.yuque.com/ziwu/yygu3z/gq555ph49m9fvrze 四、Dj…

http长连接与会话保持

"我们半推半就的人生&#xff0c;没有和你一样被眷顾的未来!" 一、Http长连接 (1) 为什么需要长连接 如上展示的是一个常规得并不能再常规的http服务&#xff0c;从本地拉取远端linux上的本地文件上传至浏览器上&#xff0c;经过浏览器的渲染展示成如今的样子。唔&a…

数学建模——曲线拟合

一、曲线拟合简介 1、曲线拟合问题的提法 已知一组数据&#xff08;二维&#xff09;&#xff0c;即平面上n个点 (xi,yi)(i1,2,…,n)&#xff0c; xi互不相同。寻求一个函数yf(x)&#xff0c;使得f(x)在某种准则下与所有的数据点最为接近&#xff0c;即拟合得最好。 2、…

Java Stream 流进行根据元素某一属性过滤计算其他属性实例

设计一个测试类Tuser package org.example;import com.alibaba.fastjson.annotation.JSONField;import java.io.Serializable;public class Tuser implements Serializable {//用户名private String name;//平台名称private String sys;//登录次数private int times;//一个合并…

H5学习期间 问题文档(更新中)

目录 一、html与css中让标签 二、css鼠标滑入显示div 三、git报错解决方案 四、ul>li中给h1标签设置行高 一、html与css中让标签<li>在同一行显示 li标签一行显示 效果展示&#xff1a; 代码块&#xff1a; <!DOCTYPE html> <html lang"en"…

python 深度学习 解决遇到的报错问题2

目录 一、解决报错UnicodeDecodeError: utf-8 codec cant decode byte 0xe3 in position 15: invalid continuation byte 二、解决ERROR: Could not build wheels for pycocotools, which is required to install pyproject.toml-based pro 三、解决OSError: [WinError 1314…

Redhat7.6安装mysql5.7

环境准备&#xff1a;硬盘剩余空间最少8G,内存剩余最少2G Mysql官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html 在Mysql官网下载列表中选择需要安装的版本: RedHat7.6安装MySQL5.7 安装之前&#xff0c;先要保证系统环境是干净的&#xff0c;不能存…

Mysql锁机制介绍

Mysql锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除传统的计算资源(如CPU、RAM、I/O等)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0…

docker部署rabbitmq

拉取镜像 我部署的是3.8版本的 docker pull rabbitmq:3.8 启动容器 docker run -d --hostname my-rabbit --name rabbitmq --restart always -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 --privilegedtrue rabbitmq:3.8 启…