www.gusucode.com > IPCV_Eval_Kit_R2019a_0ce6858工具箱matlab程序源码 > IPCV_Eval_Kit_R2019a_0ce6858/code/demo_files/I5_04_1_myHOGDigitClassification_SVM_R2016a.m

    %% HOG (Histogram of Oriented Gradient) 摿挜検 偲
%  SVM (Support Vector Machine) classifier 傪巊偭偨乮2僋儔僗暘椶乯丄庤彂偒悢帤偺幆暿
clear;clc;close all;imtool close all

%% 僩儗乕僯儞僌夋憸偺弨旛
% 僩儗乕僯儞僌夋憸乮101枃x10暥帤庬乯偲僥僗僩夋憸乮12枃x10暥帤庬乯傊偺愨懳僷僗傪愝掕
pathData = [toolboxdir('vision'), '\visiondata\digits']
trainSet = imageDatastore([pathData,'\synthetic'  ], 'LabelSource','foldernames', 'IncludeSubfolders',true)
testSet  = imageDatastore([pathData,'\handwritten'], 'LabelSource','foldernames', 'IncludeSubfolders',true);

%% 僩儗乕僯儞僌夋憸椺偺昞帵:堦枃偺傒乮悢帤  2偺妛廗梡丗4枃栚乯    read偼1枃偺夋憸偺傒撉崬傔傞
figure;imshow(readimage(trainSet, 206));

%% 僩儗乕僯儞僌梡pos夋憸偺昞帵
figure;montage(trainSet.Files(trainSet.Labels == '2'), 'Size', [ 6 17]);title('pos夋憸','FontSize',14); % pos夋憸
%% 僩儗乕僯儞僌梡neg夋憸偺昞帵
figure;montage(trainSet.Files(trainSet.Labels ~= '2'), 'Size', [23 40]);title('neg夋憸','FontSize',14); % neg夋憸
       
%% 慡僥僗僩夋憸傪儌儞僞乕僕儏昞帵 (12枃 x 10暥帤庬丗奺庤彂偒悢帤偐傜2傪幆暿)
figure; montage(testSet.Files, 'Size', [10,12]);

%% 慜張棟寢壥偺椺 (悢帤2偺椺)丗張棟偺幚峴丒昞帵
%    慜張棟梡乮帺摦擇抣壔乯偺娭悢丗僲僀僘彍嫀偟丄摿挜儀僋僩儖偺夵慞
exTrainImage  = readimage(trainSet, 206);     % 夋憸僒僀僘:16x16 pixels
img = imbinarize(rgb2gray(exTrainImage));

figure;
subplot(1,2,1); imshow(exTrainImage);
subplot(1,2,2); imshow(img);

%% HOG 摿挜検僷儔儊乕僞(CellSize)偺嵟揔壔 (夋憸僒僀僘:16x16 pixels)

% HOG摿挜検偺拪弌 (曽岦偺Bin偼9偮)丂(Block僒僀僘偼2x2僙儖丄Block僆乕僶乕儔僢僾偼1僙儖)
%    僙儖枅偵丄奺Pixel偺僄僢僕曽岦偺僸僗僩僌儔儉傪嶌惉乮9曽岦乯
[hog_2x2, vis2x2] = extractHOGFeatures(img,'CellSize',[2 2]);  % 僙儖僒僀僘:2x2pixel丄僙儖悢:8x8丄block埵抲:7x7=49丄摿挜儀僋僩儖偺挿偝:9曽岦x(2x2僙儖/僽儘僢僋)x49=1764師尦
[hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',[4 4]);  % 僙儖僒僀僘:4x4pixel丄僙儖悢:4x4丄block埵抲:3x3= 9丄摿挜儀僋僩儖偺挿偝丗9曽岦x(2x2僙儖/僽儘僢僋)x 9= 324師尦
[hog_8x8, vis8x8] = extractHOGFeatures(img,'CellSize',[8 8]);  % 僙儖僒僀僘:8x8pixel丄僙儖悢:2x2丄block埵抲:1x1= 1丄摿挜儀僋僩儖偺挿偝丗9曽岦x(2x2僙儖/僽儘僢僋)   =  36師尦

% 奺僙儖枅偵丄拪弌偟偨僸僗僩僌儔儉偺昞帵乮儀僋僩儖偼丄"婸搙偺岡攝"偺悅慄乯乮僙儖偑戝偒偄偲丄柾條偺埵抲忣曬偑尭彮乯
figure; subplot(2,3,1:3); imshow(img);   % 尦夋憸
subplot(2,3,4); plot(vis2x2); 
title({'CellSize = [2 2]'; ['Feature length = ' num2str(length(hog_2x2))]});
subplot(2,3,5); plot(vis4x4); 
title({'CellSize = [4 4]'; ['Feature length = ' num2str(length(hog_4x4))]});
subplot(2,3,6); plot(vis8x8); 
title({'CellSize = [8 8]'; ['Feature length = ' num2str(length(hog_8x8))]});

%% 4x4偺僙儖僒僀僘傪巊梡 (324師尦儀僋僩儖)
cellSize = [4 4];
hogFeatureSize = length(hog_4x4);

%% [SVM暘椶婍偺妛廗] (悢帤偺2)丗fitcsvm() 娭悢傪巊梡
% trainingFeatures 傪奿擺偡傞攝楍傪偁傜偐偠傔嶌惉
trainingFeatures  = zeros(200,hogFeatureSize,'single');

% 慡妛廗梡夋憸(1010枃)偐傜HOG摿挜検傪拪弌 (Pos偲Neg嫟偵)
for i = 1:size(trainSet.Labels,1)
  img = readimage(trainSet, i);  %僩儗乕僯儞僌夋憸偺撉崬傒
  img = imbinarize(rgb2gray(img)); % 擇抣壔
  trainingFeatures(i,:) = extractHOGFeatures(img,'CellSize',cellSize); %摿挜検偺拪弌
end
trainingLabels = (trainSet.Labels == '2');   % 儔儀儖偺惗惉

% 僒億乕僩 儀僋僩儖 儅僔儞偺暘椶婍偺妛廗 
svmModel = fitcsvm(trainingFeatures, trainingLabels)

%svmModel = fitcsvm(trainingFeatures, trainingLabels, 'KernelFunction','polynomial', 'KernelOffset', 1, 'KernelScale','auto', 'Standardize','on')

%% [幆暿] 嶌惉偟偨暘椶婍偱庤彂偒悢帤(120枃)偐傜2傪幆暿\帵丗predict()
Ir = zeros([16,16,3,120], 'uint8');      % 寢壥傪奿擺偡傞攝楍
cntTrue = 0;
for i = 1:size(testSet.Labels,1)     % 奺悢帤偛偲偵12枃偺庤彂偒暥帤
  img = readimage(testSet, i);
  BW  = imbinarize(img);     % 2抣壔

  testFeatures = extractHOGFeatures(BW,'CellSize',cellSize);
  predictedLabels = predict(svmModel, testFeatures);           % testFeature 傪攝楍偵偟偰丄偁偲偱傑偲傔偰敾掕傕壜
  % 2偲擣幆偟偨傕偺偵愒娵傪憓擖
  if predictedLabels
    img = insertShape(img,'Circle',[8,8,4],'Color','red');
    cntTrue = cntTrue+1;
  end
    Ir(:,:,:,i)=img;
end

% 寢壥偺昞帵     悢帤'2'梡偺暘椶婍偱奺庤彂偒悢帤傪僥僗僩偟偨寢壥
figure;montage(Ir, 'Size', [10,12]);  title(['Correct Prediction: ' num2str(cntTrue)]);
%%












%% 暘椶妛廗婍傾僾儕働乕僔儑儞偺巊梡
dataTable = table(trainingFeatures, trainingLabels, 'VariableNames',{'features', 'label'});     % 1x324 偺摿挜儀僋僩儖 + 儔儀儖   偑丄200峴
openvar('dataTable');
classificationLearner
  % 怴婯僙僢僔儑儞 => 儚乕僋僗儁乕僗偐傜
  % 僨乕僞偺僀儞億乕僩丗(僨僼僅儖僩偺丄'楍傪曄悢偲偟偰巊梡' 傪慖戰)
  % 堦斣壓偑丄"墳摎"偵側偭偰偄傞偺傪妋擣
  %    梊應巕丗妛廗梡偺摿挜検乮峴:僨乕僞悢 x 楍:摿挜検 偺悢抣攝楍乯
  %    墳摎 丗 嫵巘僨乕僞乮categorical array, cell array of strings, character array, logical, or numeric 偺楍儀僋僩儖乯
  % 慄宍SVM傪慖戰偟 -> 妛廗儃僞儞
  % Confusion Matrix偺昞帵
  %   岎嵎専掕丗N屄偺僌儖乕僾偵暘妱偟丄#1傪庢傝彍偒#2~#N-1偺僌儖乕僾偱妛廗偟#1偱僥僗僩丄師偼#2傪庢傝彍偒丄丄丄丄丄傪孞傝曉偡
  %   儂乕儖僪傾僂僩専掕丗堦晹偺僨乕僞傪丄僥僗僩梡偺僨乕僞偲偟偰庢傝彍偄偨僨乕僞偱妛廗丗僥僗僩梡僨乕僞偵懳偟岆傝棪傪昡壙
  %   専掕側偟          丗慡偰偺妛廗僨乕僞偱妛廗丗梡偄偨慡偰偺妛廗僨乕僞偱岆傝棪傪寁嶼
  % ROC (receiver operating characteristic curve) 嬋慄昞帵
  
  % 儌僨儖偺僄僋僗億乕僩丗 trainedClassifier
  %      僐儞僷僋僩儌僨儖丗妛廗僨乕僞偼僄僋僗億乕僩偟側偄

  % SVM丗僨乕僞偺昗弨壔偺僨僼僅儖僩偑丄fitcsvm偼false丄暘椶妛廗婍偼true


%% [幆暿] 傾僾儕働乕僔儑儞偱嶌惉偟偨暘椶婍偱庤彂偒悢帤(120枃)偐傜2傪幆暿\帵丗
Ir = zeros([16,16,3,120], 'uint8');      % 寢壥傪奿擺偡傞攝楍
for i = 1:size(testSet.Labels,1)     % 奺悢帤偛偲偵12枃偺庤彂偒暥帤
  img = readimage(testSet, i);
  BW  = imbinarize(rgb2gray(img));     % 2抣壔

  features = extractHOGFeatures(BW,'CellSize',cellSize);
  predictedLabels = trainedClassifier.predictFcn(table(features));    % testFeature 傪攝楍偵偟偰丄偁偲偱傑偲傔偰敾掕傕壜
  % 2偲擣幆偟偨傕偺偵愒娵傪憓擖
  if predictedLabels
    img = insertShape(img,'Circle',[8,8,4],'Color','red');
  end
    Ir(:,:,:,i)=img;
end
% 寢壥偺昞帵     悢帤'2'梡偺暘椶婍偱奺庤彂偒悢帤傪僥僗僩偟偨寢壥
figure;montage(Ir, 'Size', [10,12]);
  

% ClassificationPartitionedModel 岎嵎専掕暘椶婍偺惗惉
CVSVMModel = crossval(svmModel);
classLoss = kfoldLoss(CVSVMModel)    % 昗杮奜岆敾暿棪傪悇掕偟傑偡丅
  
% Copyright 2013-2014 The MathWorks, Inc.
% 夋憸僨乕僞僙僢僩
% 僩儗乕僯儞僌夋憸丗insertText娭悢偱帺摦嶌惉 (廃埻偵暿偺悢帤桳傝)
% 僥僗僩夋憸丗庤彂偒偺夋憸傪巊梡