1)訓練部分代碼:training.mdom
%% 該函數是使用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);