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

news2024/11/15 5:22:32

目录

数据集:

实验代码: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>> 

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

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

相关文章

代码规范

一 、代码规范 程序员写代码&#xff0c;不仅仅是实现功能 1. 名称 在Python开发过程中会创建文件夹/文件/变量等&#xff0c;这些在命名有一些潜规则&#xff08;编写代码时也要注意pep8规范&#xff09;。 文件夹&#xff0c;小写 & 小写下划线连接&#xff0c;例如&a…

jmeter 在linux服务器中执行性能测试、监听服务器资源指标

jmeter监控服务器资源 资源准备jmeter安装&#xff08;Windows 版&#xff09;jmeter安装&#xff08;linux 版&#xff09;ServerAgent安装&#xff08;linux 版&#xff09;配置脚本并执行测试 资源准备 下载apache-jmeter-5.5文件;下载ServerAgent-2.2.3文件; jmeter安装&…

ZooKeeper的集群部署和启动与关闭

ZooKeeper是一个分布式应用程序协调服务。一个ZooKeeper集群可以存在多个Follower和Observer服务器&#xff0c;但只允许存在一台Leader服务器。如果Leader服务器宕机&#xff0c;那么ZooKeeper集群的其它服务器会投票选举出一个新的Leader服务器&#xff0c;为防止投票数不过半…

2023最新社交圈子即时聊天通信小程序+前端UNIAPP

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;阅读文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 2023最新多端社交圈子系统源码 | 陌生人社交…

[openeuler]Yocto embedded 联合sig例会 (2022-12-15)

Yocto & embedded 联合sig例会 (2022-12-15)_哔哩哔哩_bilibili

【C/C++】详解 函数重载和应用

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【零基础学JS - 11 】javaScript中的if..else表达式

&#x1f468;‍&#x1f4bb; 作者简介&#xff1a;程序员半夏 , 一名全栈程序员&#xff0c;擅长使用各种编程语言和框架&#xff0c;如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…

[操作系统]4.文件管理

因为复习时间来不及了 还是老规矩,知识点覆盖不完全,具体内容请参考黑书,知识脉络来自王道操作系统 关于文件操作系统 1.文件系统基础 (1)文件的定义 文件时操作系统中的重要概念,是以计算机硬盘为基础载体存储在假期上的信息的集合 (2)文件的属性 文件的属性可以理解为文…

json-server 详解

这几天在写react的前端项目,想着后端接口没有,在网上也找不到比较合适的接口,所以在github和npm上翻了许久关于前端简单生成后端接口的工具,终于被找到了这个神仙工具json-server JSON-Server 是一个 Node 模块&#xff0c;运行 Express 服务器&#xff0c;你可以指定一个 jso…

CENTOS上的网络安全工具(二十四)Windows下的Hadoop+Spark编程环境构建

前面我们搭建了hadoop集群&#xff0c;spark集群&#xff0c;也利用容器构建了spark的编程环境。但是一般来说&#xff0c;就并行计算程序的开发&#xff0c;一刚开始一般是在单机上的&#xff0c;比如hadoop的single node。但是老师弄个容器或虚拟机用vscode远程访问式开发&am…

APM代码阅读(一):串口驱动

文章目录 前言一、AP_RangeFinder_TeraRanger_Serial.h二、AP_RangeFinder_TeraRanger_Serial.cpp三、AP_RangeFinder.cppinitdetect_instance_add_backendupdate 四、 AP_RangeFinder_Backend_Serial.cpp 前言 APM 4.2.3 以测距传感器的串口驱动为例进行阅读 其他的传感驱动都…

【Applied Algebra】扩域(Galois域)上的乘加法表构造

【Applied Algebra】扩域(Galois域)上的乘法表构造 在之前的文章里,我们讨论了扩域上(Galois域)的计算及其实现,但是侧重的是扩域中元素之间运算的细节实现,而如果想描述整个域的结构,就需要构造乘法表和加法表;实现仍然是基于c和符号计算库GiNaC; 运算表及其设计 考虑 F p n …

Zookeeper 基础知识汇总

一、zookeeper 概述 中文教程&#xff1a;https://www.docs4dev.com/docs/zh/zookeeper/r3.5.6/reference/zookeeperOver.html 1.1 概述 ZooKeeper 是⼀种分布式协调服务&#xff0c;⽤于管理⼤型主机。在分布式环境中协调和管理服务是 ⼀个复杂的过程。ZooKeeper 通过其简单的…

网内计算:可编程数据平面和技术特定应用综述

网内计算&#xff1a;可编程数据平面和技术特定应用综述 摘要——与云计算相比&#xff0c;边缘计算提供了更靠近终端设备的处理&#xff0c;降低了用户体验的延迟。最新的In-Network Computing范例采用可编程网络元素在数据达到边缘或云服务器之前计算&#xff0c;促进了常见…

Linux性能分析之perf(1)基础知识总结

Linux(09)之perf(1)基础知识总结 Author&#xff1a;Onceday Date&#xff1a;2023年1月31日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Tutorial - Perf Wiki (kernel.org) linux性能分析工具专题-perf&#xff08;事件采样&#xff0c;全面性能分析&#x…

时钟树综合跑不下去,怎么破?

吾爱IC社区第二十一期IC训练营正式开始招募啦&#xff08;5月21号开营&#xff09;&#xff01;不知不觉小编的IC后端训练营课程已经举办21期了。每一期的报名时间也就1-3天&#xff0c;而且几乎每期都是爆满的情况。这背后的逻辑很简单。大家都信任吾爱IC社区这个品牌&#xf…

做副业的我很迷茫,但ChatGPT却治好了我——AI从业者被AI模型治愈的故事

迷茫&#xff0c;无非就是不知道自己要做什么&#xff0c;没有目标&#xff0c;没有方向。 当有一个明确的目标时&#xff0c;往往干劲十足。但做副业过程中&#xff0c;最大的问题往往就是 不知道自己该干什么。 干什么&#xff1f;怎么干&#xff1f;干到什么程度&#xff1f…

通过部署Java工程学习Jenkins

今天来学习Jenkins部署应用&#xff0c;在工作中一般都是提交代码到git之后&#xff0c;通过自动打包的功能形成jar包&#xff0c;然后运行jar包。服务器自动从git拉取最新代码进行打jar包的这个过程就通过Jenkins来进行。 Jenkins官网地址 首先我们可以看一下官网的版本 我们…

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…

Vue中如何进行状态持久化(LocalStorage、SessionStorage)

Vue中如何进行状态持久化&#xff08;LocalStorage、SessionStorage&#xff09;&#xff1f; 在Vue应用中&#xff0c;通常需要将一些状态进行持久化&#xff0c;以便在用户关闭浏览器或刷新页面后&#xff0c;仍能保留之前的状态。常见的持久化方式包括LocalStorage和Sessio…