数据集组成
- test_image 测试数据
- train_image 训练数据
包含 5 个类别,分别为飞机、蝴蝶、相机、剪刀和太阳花
SVM 和 HOG 特征实现图像分类
%% 目标:用 HOG 特征对图像进行多分类,svm训练
%% 构建数据集(训练和测试)
imdsTrain = imageDatastore('H:\DataSet\ausr\svm_images\train_images',...
'IncludeSubfolders',true,...
'LabelSource','foldernames');
imdsTest = imageDatastore('H:\DataSet\ausr\svm_images\test_image');
%% 显示训练集图片的标签 Labels 和数量 Count
Train_disp = countEachLabel(imdsTrain);
disp(Train_disp);
%% 对训练集中的每张图像进行 HOG 特征提取,测试图像一样
%% 预处理图像,主要是得到 features 特征大小,此大小与图像大小和 Hog 特征参数相关
imageSize = [256,256]; % 对图像进行此尺寸的缩放
image1 = readimage(imdsTrain,1); % 先拿一张图片看看HOG特征
scaleImage = imresize(image1,imageSize); % 缩放该图片
%% 显示提取了 HOG 特征的该图片
[features, visualization] = extractHOGFeatures(scaleImage);
imshow(scaleImage);
hold on;
plot(visualization)
% 对所有训练图像进行特征提取
numImages = length(imdsTrain.Files); % 得到训练集文件的图片个数
% 创建存储各图像特征的矩阵,featuresTrain为单精度
featuresTrain = zeros(numImages,size(features,2),'single');
% 对训练集中的每个图像进行处理
for i = 1:numImages
% 读取图片
imageTrain = readimage(imdsTrain,i);
% 对图片进行缩放
imageTrain = imresize(imageTrain,imageSize);
% 提取HOG特征,存储在矩阵的每一行
featuresTrain(i,:) = extractHOGFeatures(imageTrain);
end
%% 取出所有训练图像的标签
trainLabels = imdsTrain.Labels;
%% 开始 SVM 多分类训练,fitcsvm用于二分类,fitcecoc用于多分类
classifer = fitcecoc(featuresTrain,trainLabels);
%% 对测试数据进行分类并显示分类结果图
numTest = length(imdsTest.Files); % 获取测试集图片数量
%% 对每张测试图片进行预测
for i = 1:numTest
% 读取测试图片
testImage = readimage(imdsTest,i);
% 缩放测试图片大小
scaleTestImage = imresize(testImage,imageSize);
% 提取特征
featureTest = extractHOGFeatures(scaleTestImage);
% 预测
[predictIndex,score] = predict(classifer,featureTest);
figure;
imshow(testImage);
title(['predictImage: ',char(predictIndex)]);
end
训练集标签和数量的统计结果:
>> disp(Train_disp);
Label Count
_________ _____
airplanes 48
butterfly 48
camera 53
scissors 36
sunflower 46
提取到的 HOG 特征
初步了解特征的选区是否合适,不适合可以调节 extractHOGFeatures 里的参数,比如 cellsize,blocksize,bins等。
参考:extractHOGFeature
测试数据分类结果
只列出几项最终的分类结果: