網上看到關於用opencv對圖像進行分類的不少,這次用MATLAB做了些嘗試,圖像數據集為:點擊打開鏈接,http://blog.csdn.net/jcy1009015337/article/details/53763484 另外opencv版本的為:點擊打開鏈接,http://blog.csdn.net/always2015/article/details/47107129
廢話就不說,直接上代碼(適合MATLAB 2016b版本及以上),代碼有相應注釋。
我訓練的圖像在磁盤上位置如下,包含5個類別,省去了前人制作txt存儲圖像路徑的過程:
測試圖像分布為:
%% 用hog特征對圖像進行多分類,svm訓練,1 VS 1
%% 1 數據集,包括訓練的和測試的 (注意自己圖片存放路徑,附錄我給出示例下載圖片鏈接)
imdsTrain = imageDatastore('F:\svm_images\train_images',...
'IncludeSubfolders',true,...
'LabelSource','foldernames');
imdsTest = imageDatastore('F:\svm_images\test_image');
%% 顯示訓練的圖片種類Labels和數量Count
Train_disp = countEachLabel(imdsTrain);
disp(Train_disp);
%% 2 對訓練集中的每張圖像進行hog特征提取,測試圖像一樣
% 預處理圖像,主要是得到features特征大小,此大小與圖像大小和Hog特征參數相關
imageSize = [256,256];% 對所有圖像進行此尺寸的縮放
image1 = readimage(imdsTrain,1);
scaleImage = imresize(image1,imageSize);
[features, visualization] = extractHOGFeatures(scaleImage);
imshow(scaleImage);hold on; plot(visualization)
% 對所有訓練圖像進行特征提取
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);
end
% 所有訓練圖像標簽
trainLabels = imdsTrain.Labels;
% 開始svm多分類訓練,注意:fitcsvm用於二分類,fitcecoc用於多分類,1 VS 1方法
classifer = fitcecoc(featuresTrain,trainLabels);
%% 預測並顯示預測效果圖
numTest = length(imdsTest.Files);
for i = 1:numTest
testImage = readimage(imdsTest,i);
scaleTestImage = imresize(testImage,imageSize);
featureTest = extractHOGFeatures(scaleTestImage);
[predictIndex,score] = predict(classifer,featureTest);
figure;imshow(testImage);
title(['predictImage: ',char(predictIndex)]);
end
命令行對訓練集imdsTrain
統計輸出結果如下:
第一張圖像顯示的是提取到的HOG特征,這個主要可以初步了解下特征是否選擇的合適,不合適可以調節extractHOGFeatures里面的參數,如cellsize,blocksize,bins等,具體可以參考這個點擊打開鏈接 http://cn.mathworks.com/help/vision/ref/extracthogfeatures.html?searchHighlight=extractHOGFeatures&s_tid=doc_srchtitle。本程序選擇的默認參數,從圖1可以預覽到特征分別合適。
歡迎加入全國MATLAB愛好者qq群1:193984759,討論圖像處理,機器學習,深度學習,數學建模等MATLAB相關的技術!