1.將圖片分為測試和驗證集合,分別為train_images和test_image


2.代碼編寫(HOG思想不做介紹,網上太多)
1)訓練部分代碼:training.m
%% 該函數是使用HOG來提取test_images下圖片的特征的,代碼編寫參考matlab官方文檔
%% 1.獲取圖片以及相關的分類
currentPath = pwd; % 獲得當前的工作目錄
imdsTrain = imageDatastore(fullfile(pwd,'train_images'),...
'IncludeSubfolders',true,...
'LabelSource','foldernames'); % 載入圖片集合
%% 2 對訓練集中的每張圖像進行hog特征提取
% 預處理圖像,主要是得到features特征大小,此大小與圖像大小和Hog特征參數相關
imageSize = [256,256];% 對所有圖像進行此尺寸的縮放
image1 = readimage(imdsTrain,1);
scaleImage = imresize(image1,imageSize);
features = extractHOGFeatures(scaleImage,'CellSize',[4,4]);
% 提示信息
disp('開始訓練數據...');
% 對所有訓練圖像進行特征提取
numImages = length(imdsTrain.Files);
featuresTrain = zeros(numImages,size(features,2),'single'); % featuresTrain為單精度
for i = 1:numImages
imageTrain = readimage(imdsTrain,i);
imageTrain = imresize(imageTrain,imageSize);
featuresTrain(i,:) = extractHOGFeatures(imageTrain,'CellSize',[4,4]);
end
% 所有訓練圖像標簽
trainLabels = imdsTrain.Labels;
% 開始svm多分類訓練,注意:fitcsvm用於二分類,fitcecoc用於多分類,1 VS 1方法
classifer = fitcecoc(featuresTrain,trainLabels);
save classifer
% 提示信息
disp('訓練階段結束!!!');
2)分類部分代碼:classify.m
%% 該函數用來對圖片進項分類 HOG + SVM
%% 1.讀入待分類的圖片集合
currentPath = pwd;
imdsTest = imageDatastore(fullfile(pwd,'test_image'));
%% 2.分類,預測並顯示預測效果圖
% 載入分類器
load classifer
numTest = length(imdsTest.Files);
% correctCount:正確圖片張數
correctCount = 0;
for i = 1:numTest
testImage = readimage(imdsTest,i); % imdsTest.readimage(1)
scaleTestImage = imresize(testImage,imageSize);
featureTest = extractHOGFeatures(scaleTestImage,'CellSize',[4,4]);
[predictIndex,score] = predict(classifer,featureTest);
figure;imshow(imresize(testImage,[256,256]));
imgName = imdsTest.Files(i);
tt = regexp(imgName,'\','split');
cellLength = cellfun('length',tt);
tt2 = char(tt{1}(1,cellLength));
% 統計正確率
if strfind(tt2,char(predictIndex))==1
correctCount = correctCount+1;
end
title(['分類結果: ',tt2,'--',char(predictIndex)]);
fprintf('%s === %s \n',tt2,char(predictIndex));
end
% 顯示正確率
fprintf('分類結束,正確了為:%.1f%%\n',correctCount * 100.0 / numTest);
