【MATLAB项目实战】基于CNN_SVM的图像花卉识别

数据集:5类花卉
【MATLAB项目实战】基于CNN_SVM的图像花卉识别_第1张图片
简单来说 就是CNN做特征提取 SVM做分类
训练集:测试集=8:2
【MATLAB项目实战】基于CNN_SVM的图像花卉识别_第2张图片
代码中可以更换不同的CNN网络:AlexNet VGG16 VGG19 ResNet50

clc;
clear all;                 
%% 划分数据集
pwd='C:\Users\yuanyuan\Desktop\CNN_SVM\data'; % 路径
currentPath = pwd;  % 获得当前的工作目录
fprintf('加载数据...'); 
t = tic;

imds = imageDatastore(fullfile(pwd),'IncludeSubfolders',true,'LabelSource','foldernames');   % 载入所有图片集合
imds.ReadFcn = @readAndPreproc; % 和 alexnet 里输入图片大小一致 【227*227*3】
numImages = length(imds.Files); %图片总的张数
[imdsTrain,imdsTest] = splitEachLabel(imds, 0.8,'randomized');%每个类都按比例随机拆分数据集,训练集和测试集82,
YTrain=double(imdsTrain.Labels);

fprintf('完成 %.02f 秒\n', toc(t));

%% 加载预训练网络 (CNN) 
convnet = alexnet();
  
%% 层
convnet.Layers 

tbl = countEachLabel(imdsTrain) 
%% 提取特征 fc7 layer(vgg16,vgg19 fLayer is fc8)
fLayer = 'fc7'; %AlexNet 
%fLayer = 'fc8'; %VGG16 VGG19
% fLayer = 'fc1000'; % resnet50
trainingFeatures = activations(convnet, imdsTrain, fLayer, ...
             'MiniBatchSize', 32, 'OutputAs', 'rows');     

%% SVM训练
d = fitcecoc(trainingFeatures, YTrain); % 多分类svm用fitcecoc

%% 测试集相同处理 进行预测

testFeatures = activations(convnet, imdsTest, fLayer, ...
             'MiniBatchSize', 32, 'OutputAs', 'columns');  
                  
YPred = predict(d, testFeatures'); 

YTest=double(imdsTest.Labels);
accuracy = sum(YPred == YTest)/numel(YTest)
figure
confusionchart(YPred,YTest)

结果:

【MATLAB项目实战】基于CNN_SVM的图像花卉识别_第3张图片
效果还不错 比CNN跑得快还精准

代码(包括数据集):代码(包括数据集):

你可能感兴趣的:(项目实战MATLAB,支持向量机,matlab,cnn)