基于minsit数据集的图像分类任务|CNN简单应用项目

Github地址

Image-classification-task-based-on-minsit-dataseticon-default.png?t=N5K3https://github.com/Yufccode/CollegeWorks/tree/main/ImageProcessing/Image-classification-task-based-on-minsit-dataset

README

摘要

本次实验报告用两种方式完成了基于minst数据集完成了图像的分类任务

第一种方式采用课件所讲述的差值法对训练集里的每一张图片进行了预测,并最后得出总体的测试acc,由于只是简单采用差值法对图片进行预测,没有作其他的操作,因此acc只达到了16.8%

第二种方式采用了深度学习,2d卷积神经网络的方式进行图像分类。acc达到了0.98267

实验内容及目的

实验内容为通过差值法和2dCNN的方法,对每一类1000张,共10类的minsit数据集作分类任务。实验目的是为:掌握Matlab图片导入、分析和操作的方式。

实验相关原理描述

差值法的原理:

本质上是矩阵之间的相似性,相似度最大的即为预测类别,其中公式如所示

similarity = \frac{\alpha }{\begin{Vmatrix} (matrix1-matrix2) \end{Vmatrix}} \quad (\alpha \in R)

该模型不需要进行训练,在测试的时候,每一张图片所对应的矩阵与哪一个带有标签的矩阵相似度最大即可,则该图片的预测结果即位对应的标签值。

 2dCNN法的原理:

通过2d卷积神经网络,让学习器学习minst数据集图像特征,最后根据学习到的特征进行分类的预测。

CNN网络模型图如图所示:

实验过程

差值法

在数据处理方面,在使用差值法进行图像分类时,我利用了Python语言对所有图片进行打标签工作,以便于Matlab程序读取每一张图片及其相对应的标签,代码如下:

import pandas as pd
import os
import numpy as npcsv_path = r'/Users/demac/我的文件/SYSU/4. 2022第二学期/图像处理实验/实验一/图像实验一/number_recognize/Data.csv'
df = pd.read_csv(csv_path)
arr = np.array(df)
arr = arr.tolist()
f = open(r'/Users/demac/我的文件/SYSU/4. 2022第二学期/图像处理实验/实验一/图像实验一/number_recognize/Data.txt', 'w')for cur_label in range(0, 10):for root, dirs, files in os.walk(fr"/Users/demac/我的文件/SYSU/4. 2022第二学期/图像处理实验/实验一/图像实验一/number_recognize/train_dataset/{cur_label}"):for file in files:# 获取文件路径path = os.path.join(root, file)# f.write(path + '\n')new_row = [path, cur_label]arr.append(new_row)arr = np.array(arr)
df = pd.DataFrame(arr)
df.to_csv(csv_path)
print()

分类代码如下: 

clear all;
opts = delimitedTextImportOptions("NumVariables", 3);% 指定范围和分隔符
opts.DataLines = [2, Inf];
opts.Delimiter = ",";% 指定列名称和类型
opts.VariableNames = ["VarName1", "VarName2", "VarName3"];
opts.VariableTypes = ["double", "string", "double"];% 指定文件级属性
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";% 指定变量属性
opts = setvaropts(opts, "VarName2", "WhitespaceRule", "preserve");
opts = setvaropts(opts, "VarName2", "EmptyFieldRule", "auto");
opts = setvaropts(opts, ["VarName1", "VarName3"], "ThousandsSeparator", ",");% 导入数据
Data = readtable("Data.csv", opts)% 数据预处理
clear opts
array = table2array(Data);
% 此时array里面存的就是路径和标签
% 在所有数据中取出9张作为label比对图片
img_model = {};
idx = 1;
for i = 1:9img_model{i} = imread(array(idx,2)); idx = idx+1000;
end
% img_model已经处理好了
开始test
correct = 0;
for i = 1:length(array)true = array(i,3);img = imread(array(i,2));pred_idx = -1;min_err = 100000;for j = 1:length(img_model)error = count_err(img_model{j},img);if(error < min_err)min_err = error;pred_idx = j - 1;endendif pred_idx == -1disp("error");endif pred_idx == str2num(true)% 代表预测正确correct = correct + 1;end
end
disp(correct);
disp("最终的准确率为: " + num2str(correct/length(array)));function error = count_err(img1,img2)error = norm(double(img1) - double(img2));
end

2dCNN

clear all;
DatasetPath = fullfile(['/Users/demac/我的文件/SYSU/' ...'4. 2022第二学期/图像处理实验/实验一/图像实验一/number_recognize/train_dataset/']);
imds = imageDatastore(DatasetPath, ...'IncludeSubfolders',true, ...'LabelSource','foldernames');
每个类别有1000张图片,取700张进行train,300张进行test
train_size = 700;
[imdsTrain,imdsValidation] = splitEachLabel(imds,train_size,'randomized');
% 定义神经网络的forward
inplane = [28,28,1]; % 图像输入大小
numClasses = 10; %10分类任务
layers = [imageInputLayer(inplane)convolution2dLayer(5,20) % 卷积层batchNormalizationLayer % 归一层reluLayer % 激活函数fullyConnectedLayer(numClasses) % 全链接层softmaxLayerclassificationLayer];
% train
options = trainingOptions("sgdm", ..."MaxEpochs",5, ..."ValidationData",imdsValidation, ..."ValidationFrequency",30, ..."Verbose",false, ..."Plots",'training-progress'); % 最后输出训练过程的趋势
net = trainNetwork(imdsTrain,layers,options); % 构建网络
% test
Pred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
acc = mean(Pred == YValidation);
disp("acc: " + num2str(acc));

实验结果

差值法

差值法分类最后的acc为:0.1676

2dCNN法

2dCNN法最后得到的acc为:0.98267

训练收敛过程如下图所示:

总结

通过两个处理方法的实验,我们发现,差值法并不能很好的完成minist数据集的10分类任务。与此同时,卷积神经网络是一种很好的分类方法,对于98.27%的准确率,我们还可以通过调整网络前向传播,如增加注意力机制等模块等方式继续提高分类的准确度。

附件

main.mlx 差值法分类任务代码源文件

main2.mlx 卷积神经网络分类任务代码源文件

main.pdf和main2.pdf 实时脚本输出pdf文件

label.py 打标签Python源文件

final.jpg 神经网络模型结构图

train.png 神经网络训练过程图

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

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

相关文章

深度解读AIGC存储解决方案

5月26日&#xff0c;2023数据基础设施技术峰会在苏州举办&#xff0c;腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用&#xff0c;通过对AIGC业务流程和场景的提炼&#xff0c;从内容生成、内容审核和内容智理三要素介绍了如何智能的存储和…

RabbitMQ之发布确认

RabbitMQ发布确认 1 发布确认原理2 发布确认的策略2.1 开启发布确认的方法2.2 单个确认发布 2.3 批量确认发布2.4 异步确认发布2.5 如何处理异步未确认消息2.6 以上3种确认速度对比 1 发布确认原理 生产者将信道设置为 confirm 模式&#xff0c;一旦信道进入 confirm 模式&…

2021 RoboCom 世界机器人开发者大赛-高职组(初赛)

编程题得分&#xff1a;100 总分&#xff1a;100 目录 7-1 机器人打招呼 (5分) 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 7-2 人脸识别 (10分) 输入格式&#xff1a; 输出格式&#xff1a; 输入样例 1&#xff1a; 输…

开始编写Python程序之Python小工具:word转pdf、压缩文件、解压文件、jpg转png

1、下载Python编译器 PyCharm官网下载地址对于个人编程&#xff0c;下载免费版的Community即可 2、创建一个Python项目 Python的最佳实现是为每个项目创建virtualenv。为此&#xff0c;请展开Project Interpreter&#xff1a;New Virtualenv Environment节点&#xff0c;然后…

AI视觉赢未来|深眸科技出席元宇宙装备展,“智与质”实现双重升级

6月29日&#xff0c;2023昆山元宇宙国际装备展在昆山国际会展中心圆满落幕&#xff0c;此次展会不仅为我们呈现最先进的元宇宙装备、最前沿的元宇宙技术、最潮流的元宇宙应用&#xff0c;还为工业元宇宙的发展蓄势赋能。 浙江深眸科技有限公司&#xff08;以下简称深眸科技&am…

MATLAB基础篇(下)

本文为MATLAB基础篇&#xff08;上&#xff09;的后续。 二、 MATLAB基本语法 7、基本绘图方法 Ⅰ、 MATLAB绘图的一般步骤 对数轴进行采样对采样点计算相应的函数值, 得到平面(或空间)上的点的数据运用绘图命令将数据进行图形化显示 x-1:0.01:1; %对数轴进行采样ysin(1./x);…

MySQL数据库架构

MySql数据库架构 网络连接层&#xff1a;提供与mysql服务器建立连接的支持&#xff0c;负责连接管理、授权认证、安全等。 核心服务层&#xff1a;主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和查询缓存六个部分。 存储引擎层&#xff1a;负责Mysql中数据…

React V6实现类似与vue的eventBus

功能背景 想要实现类似于vue的eventBus的功能&#xff0c;由一个组件通知其他一个或多个组件。应用场景&#xff1a;比如一个可视化大屏的界面&#xff0c;当筛选条件变化的时候&#xff0c;要同时通知到大屏中所有图表一起变化。&#xff08;当然使用store也是可以的&#xff…

【NX】NX二次开发设置对象高亮和颜色模板实现

在NX二次开发当中&#xff0c;我们经常需要高亮一个或者多个对象&#xff0c;或者设置对象的颜色方便实现&#xff0c;直接调用函数稍微显得麻烦&#xff0c;尤其是当我们需要处理的对象是容器的时候&#xff0c;于是我写了几个简单的模板实现&#xff0c;方便调试。 //author&…

docker 教程笔记,win11

1、如何执行container 当git clone一个带Dockerfile的项目时&#xff0c;先打开终端&#xff0c;跳转到该项目文件夹。 使用如下命令构建镜像image docker build -t project_name . 注&#xff1a; project_name为该项目名&#xff0c;后面必须要有空格和点。 执行完毕后&#…

mutate使用(日志过滤)

1.前言 mutate 过滤器是Logstash中的一个常用过滤器&#xff0c;用于对事件中的字段进行修改、重命名、删除和添加操作。它提供了多种操作选项&#xff0c;如替换字段值、添加新字段、删除字段、重命名字段等。mutate 过滤器可以在事件流水线的任何阶段使用&#xff0c;且不需…

vue 移动端开发vw适配方案rem适配方案 + vant框架 + unocss|tailwindcss

写在前面的话&#xff1a;看了这篇文章&#xff0c;有些东西名词啥的不懂的&#xff0c;或者有疑问的推荐百度&#xff0c;因为写的太多真的显得很啰嗦&#xff01; 1.移动端开发适配 目前移动端适配&#xff0c;在市面上主流适配方案无非就两种&#xff0c;rem方案和vw方案。…