1. 程式人生 > >使用BOF實現動物分類:matlab版本

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

tlab 階段 可能 ict 獲取圖片 eat 函數 datastore tco

1.訓練集測試集劃分(同上一篇)

2.代碼部分

1)訓練部分代碼:training.m

%% 該函數是使用Bag of Features來提取test_images下圖片的特征的,代碼編寫參考matlab官方文檔 
% 內部采用k-means訓練,可能需要點時間
%% 1.獲取圖片以及相關的分類

currentPath = pwd;  % 獲得當前的工作目錄

imds = imageDatastore(fullfile(pwd,‘train_images‘),...  
    ‘IncludeSubfolders‘,true,...  
    ‘LabelSource‘,‘foldernames‘);   % 載入圖片集合

tbl = countEachLabel(imds);
% 2.預處理:每一類的圖片要一樣多
minSetCount = min(tbl{:,2});
imds = splitEachLabel(imds, minSetCount, ‘randomize‘);

% 提示信息
disp(‘開始訓練數據...‘);

%3. 劃分測試集合和訓練集合
[trainingSet, validationSet] = splitEachLabel(imds, 0.9, ‘randomize‘);

% 4.訓練包
bag = bagOfFeatures(trainingSet);
categoryClassifier = trainImageCategoryClassifier(trainingSet, bag);

% 5.計算可能性
confMatrix = evaluate(categoryClassifier, trainingSet);
mean(diag(confMatrix));

save categoryClassifier
% 提示信息
disp(‘訓練階段結束!!!‘);

  

2)測試部分代碼classify.m

%% 該函數用來對圖片進項分類 BOF + SVM

%% 1.讀入待分類的圖片集合
currentPath = pwd;
imdsTest = imageDatastore(fullfile(pwd,‘test_image‘)); 

%% 2.分類,預測並顯示預測效果圖  
% 載入分類器
load categoryClassifier

numTest = length(imdsTest.Files);  
% correctCount:正確圖片張數
correctCount = 0;
fprintf(‘開始分類......\n‘);
for i = 1:numTest  
    testImage = readimage(imdsTest,i);  %  imdsTest.readimage(1)
    [labelIdx, scores] = predict(categoryClassifier, testImage); 
    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(categoryClassifier.Labels(labelIdx)))==1
        correctCount = correctCount+1;
    end
    fprintf(‘%s == %s\n‘,tt2,char(categoryClassifier.Labels(labelIdx)));
    title([‘分類結果: ‘,tt2,‘--‘,char(categoryClassifier.Labels(labelIdx))]); 
    
end 
% 顯示正確率
fprintf(‘分類結束,正確了為:%.1f%%\n‘,correctCount * 100.0 / numTest);

  

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