1)訓練部分代碼:training.mide
%% 該函數是使用LBP來提取test_images下圖片的特徵的,代碼編寫參考matlab官方文檔 %% 1.獲取圖片以及相關的分類 currentPath = pwd; % 得到當前的工做目錄 imdsTrain = imageDatastore(fullfile(pwd,'train_images'),... 'IncludeSubfolders',true,... 'LabelSource','foldernames'); % 載入圖片集合 %% 2 對訓練集中的每張圖像進行hog特徵提取,測試圖像同樣 % 預處理圖像,主要是獲得features特徵大小,此大小與圖像大小和Hog特徵參數相關 imageSize = [256,256];% 對全部圖像進行此尺寸的縮放 I = readimage(imdsTrain,1); I = imresize(I,imageSize); I = rgb2gray(I); lbpFeatures = extractLBPFeatures(I,'CellSize',[16 16],'Normalization','None'); numNeighbors = 8; % Upright = false; numBins = numNeighbors*(numNeighbors-1)+3; % numNeighbors+2; lbpCellHists = reshape(lbpFeatures,numBins,[]); lbpCellHists = bsxfun(@rdivide,lbpCellHists,sum(lbpCellHists)); lbpFeatures = reshape(lbpCellHists,1,[]); % 提示信息 disp('開始訓練數據...'); % 對全部訓練圖像進行特徵提取 numImages = length(imdsTrain.Files); featuresTrain = zeros(numImages,size(lbpFeatures,2),'single'); % featuresTrain爲單精度 for i = 1:numImages imageTrain = readimage(imdsTrain,i); imageTrain = imresize(imageTrain,imageSize); I = rgb2gray(imageTrain); lbpFeatures = extractLBPFeatures(I,'CellSize',[16 16],'Normalization','None'); % numNeighbors = 8; % numBins = numNeighbors*(numNeighbors-1)+3; lbpCellHists = reshape(lbpFeatures,numBins,[]); lbpCellHists = bsxfun(@rdivide,lbpCellHists,sum(lbpCellHists)); lbpFeatures = reshape(lbpCellHists,1,[]); featuresTrain(i,:) = lbpFeatures; end % 全部訓練圖像標籤 trainLabels = imdsTrain.Labels; % 開始svm多分類訓練,注意:fitcsvm用於二分類,fitcecoc用於多分類,1 VS 1方法 classifer = fitcecoc(featuresTrain,trainLabels); save classifer % 提示信息 disp('訓練階段結束!!!');
2)測試部分代碼:classify.m函數
%% 該函數用來對圖片進項分類 LBP + SVM %% 1.讀入待分類的圖片集合 currentPath = pwd; imdsTest = imageDatastore(fullfile(pwd,'test_image')); %% 2.分類,預測並顯示預測效果圖 % 載入分類器 load classifer correctCount = 0; %% 預測並顯示預測效果圖 numTest = length(imdsTest.Files); for i = 1:numTest testImage = readimage(imdsTest,i); % imdsTest.readimage(1) scaleTestImage = imresize(testImage,imageSize); I = rgb2gray(scaleTestImage); lbpFeatures = extractLBPFeatures(I,'CellSize',[16 16],'Normalization','None'); numNeighbors = 8; numBins = numNeighbors*(numNeighbors-1)+3; lbpCellHists = reshape(lbpFeatures,numBins,[]); lbpCellHists = bsxfun(@rdivide,lbpCellHists,sum(lbpCellHists)); featureTest = reshape(lbpCellHists,1,[]); [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);