使用HOG實現動物分類:matlab版本

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);
相關文章
相關標籤/搜索