当前位置: 首页 > news >正文

运用深度学习模型实现图像的分类

利用MATLAB进行深度学习图像分类是一个强大且相对直观的过程,即使是初学者也能在它的帮助下快速构建和部署模型。

MATLAB深度学习图像分类的主要步骤和涉及的核心函数:

步骤 核心函数/工具 功能描述
数据准备与加载 imageDatastore 创建图像数据存储对象,自动从文件夹结构标签
splitEachLabel 按比例划分训练集、验证集和测试集
数据预处理与增强 augmentedImageDatastore 进行图像大小调整、归一化及数据增强(如旋转、翻转)
构建网络模型 从头构建 使用imageInputLayer, convolution2dLayer, reluLayer等逐层构建
迁移学习 使用googlenet, resnet50等加载预训练模型
配置训练选项 trainingOptions 设置优化器、学习率、迭代次数、验证数据等参数
训练模型 trainNetwork 使用训练数据训练网络
评估模型性能 classify 对测试集进行分类预测
confusionmat 计算分类准确率或混淆矩阵
使用模型预测 classify 对新的单张图像或图像集进行预测

数据准备与预处理

良好的数据是成功训练模型的基础。

  1. 组织数据:将图像按类别放入不同的子文件夹,文件夹名称即为类别标签。例如:

    dataset/train/cat/cat001.jpg...dog/dog001.jpg...validation/cat/...dog/...test/cat/...dog/...
    

    这种方式可以利用imageDatastore自动获取标签。

  2. 加载数据:使用 imageDatastore 加载图像数据。

    imds = imageDatastore('path/to/your/data', ...'IncludeSubfolders', true, ...'LabelSource', 'foldernames');
    
  3. 划分数据集:将数据划分为训练集、验证集和测试集。

    [imdsTrain, imdsValidation, imdsTest] = splitEachLabel(imds, 0.7, 0.15, 0.15, 'randomized');
    
  4. 数据预处理与增强:使用 augmentedImageDatastore 进行图像大小调整和增强,这有助于增加数据多样性,防止过拟合。

    imageSize = [224 224 3]; % 常见的网络输入大小,如ImageNet
    augimdsTrain = augmentedImageDatastore(imageSize, imdsTrain, ...'ColorPreprocessing', 'gray2rgb', ... % 如果原图是灰度图,转换为RGB三通道'DataAugmentation', imageDataAugmenter('RandRotation',[-20,20], ... % 随机旋转'RandXReflection', true, ... % 随机水平翻转'RandXTranslation',[-10 10], 'RandYTranslation',[-10 10])); % 随机平移
    

    对于验证集和测试集,通常只进行调整大小和归一化,不需要数据增强。

构建深度学习模型

你可以选择从头开始构建一个卷积神经网络(CNN),或者使用迁移学习利用预训练模型。

  • 从头构建CNN(适用于简单任务或数据量较小的情况):

    layers = [imageInputLayer([28 28 1]) % 输入层,指定图像大小convolution2dLayer(3, 8, 'Padding', 'same') % 卷积层batchNormalizationLayer   % 批归一化层reluLayer                 % ReLU激活层maxPooling2dLayer(2, 'Stride', 2) % 最大池化层convolution2dLayer(3, 16, 'Padding', 'same')batchNormalizationLayerreluLayerfullyConnectedLayer(10)   % 全连接层,输出节点数对应类别数softmaxLayer              % Softmax层classificationLayer];     % 分类层
    

    这是一个简单的例子,你可以根据需要增加卷积层、全连接层等。

  • 迁移学习(强烈推荐,尤其当你的数据量不是特别巨大时):

    net = googlenet; % 加载预训练的GoogLeNet模型,其他可选如resnet50, efficientnetb0等
    lgraph = layerGraph(net); % 获取网络层图
    % 修改最后的全连接层和分类层以适应你的类别数
    numClasses = numel(categories(imdsTrain.Labels));
    newFCLayer = fullyConnectedLayer(numClasses, 'Name', 'new_fc');
    newClassLayer = classificationLayer('Name', 'new_classoutput');
    lgraph = replaceLayer(lgraph, 'loss3-classifier', newFCLayer);
    lgraph = replaceLayer(lgraph, 'output', newClassLayer);
    % 设置训练选项,通常微调时使用较小的学习率
    options = trainingOptions('adam', ...'InitialLearnRate', 0.0001, ... % 微调时学习率通常设置较小... % 其他选项);
    

配置训练选项与训练模型

使用 trainingOptions 函数来配置训练参数。

options = trainingOptions('sgdm', ... % 优化算法,也可以是 'adam', 'rmsprop' 等'MaxEpochs', 10, ...              % 最大训练轮数'MiniBatchSize', 32, ...          % 小批量大小'InitialLearnRate', 0.001, ...    % 初始学习率'ValidationData', augimdsValidation, ... % 指定验证数据'ValidationFrequency', 50, ...    % 每隔多少迭代验证一次'Verbose', false, ...             % 是否在命令行窗口显示训练过程'Plots', 'training-progress');    % 显示训练进度图

使用 trainNetwork 函数开始训练模型。

net = trainNetwork(augimdsTrain, layers, options); % 对于从头训练
% 或者对于迁移学习
net = trainNetwork(augimdsTrain, lgraph, options);

训练过程中,MATLAB会显示一个进度图,你可以实时观察训练集和验证集上的准确率和损失变化。

评估模型性能与进行预测

训练完成后,需要在独立的测试集上评估模型的最终性能。

% 对测试集图像进行分类预测
[YPred, scores] = classify(net, augimdsTest);
YTest = imdsTest.Labels; % 获取测试集的真实标签% 计算准确率
accuracy = mean(YPred == YTest);
fprintf('Test Accuracy: %.2f%%\n', accuracy * 100);% 绘制混淆矩阵来分析各类别的分类情况
figure;
confusionchart(YTest, YPred);
title('Confusion Matrix for Test Data');

训练好的模型可以用来预测新的图像。

% 预测单张图像
img = imread('path/to/your/new_image.jpg');
imgResized = imresize(img, net.Layers(1).InputSize(1:2)); % 调整到网络输入大小
[label, score] = classify(net, imgResized);% 显示图像及预测结果
figure;
imshow(img);
title(['Predicted: ', char(label), ', Confidence: ', num2str(max(score)*100, '%.2f'), '%']);

参考代码 运用深度学习模型实现图像的分类 www.youwenfan.com/contentcnh/55199.html

实用技巧与注意事项

  • 数据是关键:数据质量、数量和多样性直接影响模型性能。数据增强是提升模型泛化能力的有效手段。
  • 从迁移学习开始:除非你有海量数据,否则从预训练模型(如GoogLeNet、ResNet、EfficientNet等)开始进行微调,通常比从头训练更快、效果更好。
  • 利用GPU加速:如果有GPU,MATLAB会自动尝试使用它来加速训练(需要Parallel Computing Toolbox)。
  • 超参数调优:学习率(InitialLearnRate)、批量大小(MiniBatchSize)、训练轮数(MaxEpochs)等都是重要的超参数,需要根据实际情况调整。可以使用MATLAB的Experiment Manager App来系统地进行超参数调优。
  • 理解过拟合:如果训练准确率很高但验证/测试准确率很低,模型很可能过拟合了。可以通过增加数据增强、添加Dropout层、使用L2正则化、减少模型复杂度或提前停止训练来缓解。
  • 可视化与解释性:使用Grad-CAM等工具可视化网络关注图像的那些区域,有助于理解模型决策的依据和调试模型。

进阶探索

当你掌握了基本流程后,还可以探索:

  • 使用深度网络设计器(Deep Network Designer)App:通过图形化界面拖拽方式设计、编辑和训练网络,非常适合初学者直观理解网络结构。
  • 其他计算机视觉任务:如目标检测(使用trainFasterRCNNObjectDetectortrainYOLOv2ObjectDetector)、语义分割等。
  • 模型部署:将训练好的模型部署到嵌入式设备、企业系统或生成代码。
http://www.wxhsa.cn/company.asp?id=6483

相关文章:

  • 设备ONVIF接入平台EasyCVR私有化视频平台级联到海康平台目录丢失根因定位
  • java 通过模板输出word
  • 【设计模式】单例模式 - 实践
  • ubuntu服务器docker容器启动java项目
  • 【2025最新】企业信息模糊搜索API设计与实践指南
  • 一键搞定本土认证难题,AnalyticDB版Supabase助力AI应用实现支付宝微信登录
  • sumifs根据条件求和
  • ubuntu服务器docker安装部署ngix
  • c++右值引用和移动语义
  • 彩笔运维勇闯机器学习--梯度下降法
  • 作业03
  • 项目管理软件产业革命:从工具升级到生产力范式转移
  • vs code运行Java遇到的输入问题
  • 关于数据跨境,你应该了解的合规难题有哪些?
  • 国内开发者如何选择代码管理平台?三大主流工具深度对比
  • doubletrouble wp复盘
  • VAR算法
  • mysql 万能恢复主从Slave_SQL_Running 是No
  • 刚刚 Java 25 炸裂发布!让 Java 再次伟大
  • go 语言结构和基础语法
  • 详细介绍:Linux--初识网络
  • lua程序调试方法
  • 维保信息查询
  • 人工智能学习路线学习资料整理
  • 软件设计师知识点总结(2023)上
  • 【运维自动化-标准运维】各类全局变量使用说明(中)
  • 提示词工程(Prompt Engineering)是不是“新时代的编程”?
  • python日志记录之logging模块
  • O - Color a Tree
  • 电脑时间改了,软件不能用了