【MATLAB第95期】#源码分享 | 基于MATLAB的卷积神经网络CNN图像分类源代码分享(含两个案例)

news2024/11/19 23:13:44

【MATLAB第95期】#源码分享 | 基于MATLAB的卷积神经网络CNN图像分类源代码分享(含两个案例)

一、案例一

1、背景介绍

目的:训练和测试卷积神经网络,以检测钻头三种类型。
深度学习(DL)是机器学习的一个子集,它使用受神经网络启发的架构来进行预测。卷积神经网络(CNN)是一种DL模型,它在学习图像等二维数据中的模式方面是有效的。钻头类型的图像用于训练分类器,以识别钻头类型。
本练习演示使用图像分类来区分照片中的对象。尽管应用于位类型,但相同的方法和代码可以用于任何类型或数量的对象。此示例可以通过将训练和测试照片包含在使用对象类型命名的文件夹中进行修改。该代码自动将文件夹的名称作为照片标签,用于训练分类器。

在这里插入图片描述
图像数据包含两个文件夹,一个测试文件夹和一个训练文件夹,其子目录包含三种钻头类型。图像位于每个子目录中。

照片被导入到MATLAB中。第一步是将图像处理成一种格式,
1)使数据对模型可读,
2)为模型学习提供更多的训练材料。例如,train_processor变量对数据进行缩放,使其可以成为模型的特征(输入),但也可以获取每个图像并对其进行扩充,使模型可以从同一图片的多个变化中学习。它可以水平翻转、旋转和移动钻头,等等,以确保模型从钻头的形状而不是方向或大小中学习。
数据中样本数量有限,总共约有60个。由于缺乏数据,可以将使用测试数据作为验证数据,以便训练更好的神经网络。

2、代码展示

%数据处理
train_processor = imageDataAugmenter( ...
    'RandScale', [.8 1.2], ...
    'RandXReflection', true, ...
    'RandRotation', [-45, 145], ...
    'RandXShear', [0 45], ...
    'RandYShear', [0 45], ...
    'RandXTranslation', [-5 5], ...
    'RandYTranslation', [-5 5], ...
    'RandYReflection', true);
test_processor = imageDataAugmenter('RandScale', [0.8 1.2]);

% 导入数据
train = imageDatastore('train\', 'IncludeSubfolders',true, ...
    'LabelSource','foldernames','ReadFcn',@imread);
train_preprocess = augmentedImageDatastore([255,255],train, 'DataAugmentation', train_processor);
test = imageDatastore('test\', 'IncludeSubfolders', true,...
    'LabelSource', 'foldernames', 'ReadFcn', @imread);
test = augmentedImageDatastore([255,255],test, 'DataAugmentation', test_processor);
%imageDatastore函数创建一个对象来管理图像文件的集合。

构建神经网络

更改训练时期的数量和其他选项以修改训练神经网络。要知道,训练阶段越多,训练过程所需的时间就越长。基于数据集的大小、网络的大小和所选择的超参数,网络的训练时间可能会变化。

num_training_epochs = 20;
%基于上述值构建神经网络

layers=[imageInputLayer([255 255 3]);%指定输入数据的尺寸
convolution2dLayer([3 3],20); %20个大小为3x3的过滤器应用于输入数据
reluLayer();%ReLU将负值设置为零并保持正值不变
maxPooling2dLayer([22]);%最大池化通过在每个2x2区域内选择最大值来减少空间维度
fullyConnectedLayer(3);%创建一个包含3个神经元的完全连接层
softmaxLayer();%将输出值转换为概率分布
classificationLayer();%根据概率分配分类
];

options=trainingOptions("adam",...%使用adam优化器作为优化算法
'InitialLearnRate',0.001,...%设置初始学习率
'SquaredGradientDecayFactor',0.99,...%将平方梯度项设置为在每个时间步长衰减1%(防止过度波动)
'MaxEpochs',num_training_epochs,...%设置分类器遍历整个数据集的最大次数
'MiniBatchSize',24,...%设置要拆分为24个较小批量的数据
'Verbose',true,...%显示培训期间的培训进度
   'ValidationData',test, ...
    'Plots',"training-progress");
[net,~] = trainNetwork(train_preprocess, layers, options);

测试神经网络
随机抽取测试钻头并预测其类型。验证的准确性以及个别测试表明存在错误分类。

%随机抓取图片
btype = ["PDC", "Roller Cone", "Spoon"]; % possible output values
bbtype = ["PDC", "Roller_Cone", "Spoon"]; % possible output values
rng('shuffle');
i=randi(3);
j=randi(5);
b = btype(i);
bb = bbtype(i);
im = strcat(lower(strrep(strcat(bb,'_',num2str(j),'.jpg'),'',"")));
test_image_filepath = fullfile('./test',b,im);

% 读取图片
image_fp = test_image_filepath;
ime = imread(image_fp); % load image

%修改图像以适应神经网络
im = double(imresize(ime,[255 255]));


%显示带有预测的图像
true_value = regexp(image_fp, "(PDC)|(Roller Cone)|(Spoon)", 'match');
figure('Position', [0,0,1000,1000])
imshow(ime);

%创建标题字符串并显示标题
label = "True value: " + string(true_value{1}) + "\n" + "Predicted: " + string(net.classify(im));
label = compose(label);
bit_title = title(label);

%调整标题位置
titlePos = get(bit_title, 'Position'); 
titlePos(2) = -0.1; % Adjust the title
set(bit_title, 'Position', titlePos, 'FontSize', 8);

**加粗样式**

在这里插入图片描述
在这里插入图片描述

二、案例二

1、背景介绍

裂纹分类,替换钻头分类案例研究中的照片,以建立分类器来区分有裂纹(正)或无裂纹(负)的混凝土照片。

数据集被分为两个(负和正)裂纹图像文件夹用于图像分类。每个train文件夹有500个图像,总共1000个图像,具有227 x 227像素的RGB通道。测试文件夹具有来自完整图像集的100个图像,总共200个测试图像。同样,我们将使用测试数据作为验证数据来训练更好的神经网络。

在这里插入图片描述

2、代码展示

% 数据处理
train_processor = imageDataAugmenter( ...
    'RandScale', [.8 1.2], ...
    'RandXReflection', true, ...
    'RandRotation', [-45, 145], ...
    'RandXShear', [0 45], ...
    'RandYShear', [0 45], ...
    'RandXTranslation', [-5 5], ...
    'RandYTranslation', [-5 5], ...
    'RandYReflection', true);
test_processor = imageDataAugmenter('RandScale', [0.8 1.2]);

% 导入数据
train = imageDatastore('train\', 'IncludeSubFolders', true, ...
    'LabelSource','foldernames', 'ReadFcn',@imread);
train_preprocess_con = augmentedImageDatastore([128,128],train, 'DataAugmentation', train_processor);
test = imageDatastore('test\', 'IncludeSubfolders', true,...
    'LabelSource', 'foldernames', 'ReadFcn', @imread);
test = augmentedImageDatastore([128,128],test, 'DataAugmentation', test_processor);

构建神经网络
更改训练时期的数量和其他选项以修改训练神经网络。要知道,训练时期和神经网络层越多,训练过程所需的时间就越长。基于数据集的大小、网络的大小和所选择的超参数,网络的训练时间可能会变化。
num_conv_layers = 2;
layer_size = 16;
num_training_epochs = 5;
基于上述值构建神经网络
%为图层创建单元
layers = cell((num_conv_layers+1)*3+4,1);
layers{1} = imageInputLayer([128 128 3]);
layers{2} = convolution2dLayer([3 3],layer_size);
layers{3} = reluLayer();
layers{4} = maxPooling2dLayer([2 2]);

%基于num_conv_layers添加额外的卷积层
for i = 1:num_conv_layers-1 
    layers{i*3 + 2} = convolution2dLayer([3 3],layer_size);
    layers{i*3 + 3} = reluLayer();
    layers{i*3 + 4} = maxPooling2dLayer([2 2]);
end

%降低维度
layers{end-5} = flattenLayer();

layers{end-4} = fullyConnectedLayer(layer_size);
layers{end-3} = reluLayer();

%添加最终致密层
layers{end - 2} = fullyConnectedLayer(2);
layers{end - 1} = softmaxLayer();
layers{end} = classificationLayer();

%将单元格转换为常规数组
layers = [layers{:}];

options = trainingOptions("adam", ...
    SquaredGradientDecayFactor=0.99, ...
    InitialLearnRate=0.001, ...
    MaxEpochs=num_training_epochs, ...
    MiniBatchSize=32, ...
    Verbose=true,...
    Plots="training-progress",...
    ValidationData=test ...
    );

训练神经网络
(预计时间:5分钟)
[net,info] = trainNetwork(train_preprocess_con, layers, options);
测试神经网络
获取随机测试图像并预测类型。
btype = ["Positive", "Negative"]; % possible output values
rng('shuffle');
i=randi(2);
j=randi([19901,20000]);
b = btype(i);
im = strcat(lower(strrep(strcat(num2str(j),'.jpg'),'',"")));
test_image_filepath = fullfile('./test',b,im);
%显示图像
image_fp = test_image_filepath;
ime = imread(image_fp); % load image

%为神经网络修改图像
im = double(imresize(ime,[128 128]));

%显示带有预测的图像
true_value = regexp(image_fp, "(Positive)|(Negative)", 'match');
figure('Position', [0,0,1000,1000])
imshow(ime);

%创建标题字符串并显示标题
label =  "True value: " + string(true_value{1}) + "\n" + "Predicted: " + string(net.classify(im));
label = compose(label);
crack_title = title(label);

%调整标题位置
titlePos = get(crack_title, 'Position'); 
titlePos(2) = -0.1; % Adjust the title
set(crack_title, 'Position', titlePos, 'FontSize', 8);
验证的准确性以及个体测试表明存在许多错误分类。

在这里插入图片描述

三、总结分析

以下是一些可以提高此应用程序准确性的内容:
1、扩充数据集!这是最重要的一点,机器学习通常需要许多照片来代表分类器所看到的内容。在这一点上,没有足够的照片让模型学习每一种类型。
2、背景干扰。此集合中的大多数图像都已删除背景。为了训练分类器来识别字段中的类型,需要更多具有真实背景的照片。还可以添加合成背景。
3、超参数优化。为了制作最佳模型,必须选择最佳参数以最大限度地提高精度(超参数优化)。超参数可以通过控制变量进行调整,

四、代码获取

1.阅读首页置顶文章
2.关注CSDN
3.根据自动回复消息,回复“95期”以及相应指令,即可获取对应下载方式。

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

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

相关文章

Element table组件内容\n换行

漂亮的页面总是让人心旷神怡,层次清晰的页面让用户操作起来也是易于上手及展示。 如下的页面展示就是非常low的:用户根本阅读其中的数据。 在这个页面,根据用户填写过程生成多次填写记录,如果不进行层次性的展示,数据…

【C语言】学生管理系统

学生管理系统是一个用于管理学生信息、成绩、课程等数据的软件系统。在本文中,我们将使用C语言来实现一个简易的学生管理系统,包括学生信息的录入、显示、查询等功能。我们将使用文件来存储学生信息,以便实现持久化存储。 该学生管理…

JAVA 学习 面试(十一)常见设计模式

设计模式 ## 1、创建型模式 对象实例化的模式,创建型模式用于解耦对象的实例化过程。 单例模式:某个类智能有一个实例,提供一个全局的访问点。 工厂模式:一个工厂类根据传入的参量决定创建出哪一种产品类的实例。 抽象工厂模式&a…

Android学习之路(25) Theme和Style

1、官方详细解读 样式和主题背景 | Android 开发者 | Android Developers 2、应用场景 类似web设计中css样式。将应用设计的细节与界面的结构和行为分开。 样式style :应用于 单个 View 的外观。样式可以指定字体颜色、字号、背景颜色等属性 主题theme&…

OpenHarmony—不支持解构赋值

规则:arkts-no-destruct-assignment 级别:错误 ArkTS不支持解构赋值。可使用其他替代方法,例如,使用临时变量。 TypeScript let [one, two] [1, 2]; // 此处需要分号 [one, two] [two, one];let head, tail [head, ...tail]…

WordPress如何使用SQL实现一键关闭/开启评论功能(已有评论)

WordPress本人就自带评论功能,不过由于种种原因,有些站长不想开启评论功能,那么应该怎么实现一键关闭评论功能或开启评论功能呢?或者针对已有评论功能的文章进行一键关闭或开启评论功能应该怎么操作? 如果你使用的Wor…

每日一道面试题:Java中序列化与反序列化

写在开头 哈喽大家好,在高铁上码字的感觉是真不爽啊,小桌板又拥挤,旁边的小朋友也比较的吵闹,影响思绪,但这丝毫不影响咱学习的劲头!哈哈哈,在这喧哗的车厢中,思考着这样的一个问题…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程(源码解读) BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor: From java doc: BeanFactoryPostProcessor may interact with and modify bean defin…

MyBatis 如何整合 Druid 连接池?

Mybatis 如何整合 Druid 数据连接池呢&#xff1f;首先打开创建的 Maven 工程&#xff0c;找到 pom.xml 文件&#xff0c;添加 Druid 依赖。 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId&…

Mac思维导图软件XMind for mac 中文版

XMind for Mac是一款高效、易于使用的思维导图软件&#xff0c;能够帮助用户更好地组织思维和创意。无论您需要制作工作报告、演讲稿还是学习笔记&#xff0c;XMind都能够为您提供卓越的支持和帮助。 软件下载&#xff1a;XMind for mac 中文版下载 XMind for Mac具有直观的界面…

精通Python第18篇—数据之美:Pyecharts水球图绘制与交互的完整教程

Pyecharts水球图绘制与交互的完整教程 在数据可视化领域&#xff0c;Pyecharts是一个强大而灵活的工具&#xff0c;它能够以美观的方式呈现各种图表&#xff0c;其中之一就是炫酷水球图。水球图能够生动地展示数据的比例关系&#xff0c;给用户一种直观的感受。本文将深入介绍…

爬虫基础-计算机网络协议

一个数据的传输 这些设备的数据转发是通过协议来完成的&#xff0c;整个互联网可以说是完全由网络协议来维持的 不同的协议分工不同&#xff0c;比如ip协议确保了ip寻址&#xff0c;tcp协议确保了数据完整性 IP地址和URL ip地址 整个网络传输可以比作快递&#xff0c;数据就…

C51 单片机学习(一):基础外设

参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机&#xff08;Micro Controller Unit&#xff0c;简称 MCU&#xff09; 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处…

【Spark系列2】Spark编程模型RDD

RDD概述 RDD最初的概述来源于一片论文-伯克利实验室的Resilient Distributed Datasets&#xff1a;A Fault-Tolerant Abstraction for In-Memory Cluster Computing。这篇论文奠定了RDD基本功能的思想 RDD实际为Resilient Distribution Datasets的简称&#xff0c;意为弹性分…

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限&#xff0c;一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具&#xff0c;默认开启873端口 https://vulhub.org/#/envir…

Linux:共享内存

文章目录 System V共享内存的原理管理共享内存shmgetshmatshmdtshmctl 共享内存和管道实现进程间同步通信 前面介绍完了匿名管道和命名管道&#xff0c;那么本篇要引入的主题是共享内存 System V 作为进程通信部分的内容&#xff0c;共享内存必然有其存在的意义和价值&#x…

RabbitMQ快速实战

目录 什么是消息队列&#xff1f; 消息队列的优势 应用解耦 异步提速 削峰填谷 总结 主流MQ产品特点比较 Rabbitmq快速上手 创建用户admin Exchange和Queue Connection和Channel RabbitMQ中的核心概念总结 什么是消息队列&#xff1f; MQ全称Message Queue&#xf…

从零学习Linux操作系统 第二十二部分 企业域名解析服务的部署及安全优化

# 一、dns的主要信息 关于dns的名词解释&#xff1a;dns: domain name service(域名解析服务) 关于客户端: /etc/resolv.conf dns指向文件 A记录 ##ip地址叫做域名的Address 记录 SOA ##授权起始主机 关于服务端 bind安装包named服务名称/etc/named.conf主配置文件/var/na…

【深度学习:多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型

【深度学习&#xff1a;多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型 Meta 发布开源人工智能工具的历史分段任何模型DINOv2 什么是多模态学习&#xff1f;什么是嵌入&#xff1f;什么是 ImageBind&#xff1f;集成在 ImageBind 中的模式图像绑定架构特定模式编码器跨…

window下如何安装ffmpeg(跨平台多媒体处理工具)

ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具&#xff0c;可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具&#xff0c;可以在命令行下执行各种音视频处理操作&#xff0c;如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…