Ввод кодов PCA, использование для распознавания PalmPrint

Я новичок в Матлабе. Я пытаюсь применить функцию PCA (URL-адрес указан ниже) в моей программе распознавания отпечатков ладоней для создания собственных ладоней. Мои изображения в оттенках серого отпечатка ладони имеют размер 450 * 400. Прежде чем использовать его, я пытался изучить эти коды и добавить некоторые коды, чтобы сохранить собственный вектор в виде файла .mat. Некоторые из % комментариев добавлены мной для моего понимания.

После нескольких дней изучения я так и не смог получить ответы. Я решил обратиться за помощью. У меня есть несколько вопросов относительно этого PCA.m.

СПС.м

  1. Какой ввод "опций" должен быть? из «PCA (данные, детали, параметры)» (это целое число для уменьшенного размера? Я пытался выяснить, где передается значение «параметров», но все еще не смог получить ответ. msgbox «h & h2 ", заключается в проверке того, что коды выполняются до тех пор, пока где. Я пытался использовать целое число 10, но размер обработки PCA.m составляет 400 * 400.)

  2. «Собственный вектор», который я сохраняю как файл «.mat», готов к выполнению классификатора евклидовых расстояний с другим собственным вектором? (Я думаю, что собственный вектор равен собственному пальцу, как и при распознавании лиц, собственным лицам. Я пытался преобразовать матрицу собственного вектора обратно в изображение, но изображение после процесса PCA черное и много точек на нем)

мойСВД.м

  1. В этой функции можно изменить два значения: MAX_MATRIX_SIZE, установленное на 1600, и EIGVECTOR_RATIO, установленное на 0,1%. Могу ли я узнать, что эти значения повлияют на результаты? (Я пытался поиграть со значениями, но не вижу разницы. Размер изображения отпечатка моей ладони установлен на 450 * 400, поэтому Max_matrix_size должен быть установлен на 180 000?)

** Надеюсь, вы, ребята, понимаете, о чем я прошу, помогите, спасибо, ребята (=

Исходная версия: http://www.cad.zju.edu.cn/home/dengcai/Data/code/PCA.m

mySVD: http://www.cad.zju.edu.cn/home/dengcai/Data/code/mySVD.m

% Edited Version by me
function [eigvector, eigvalue] = PCA(data,details,options)
%PCA    Principal Component Analysis
%
%   Usage:
%       [eigvector, eigvalue] = PCA(data, options)
%       [eigvector, eigvalue] = PCA(data)
%
%             Input:
%               data       - Data matrix. Each row vector of fea is a data point.
%                            fea = finite element analysis ?????
%     options.ReducedDim   - The dimensionality of the reduced subspace. If 0,
%                         all the dimensions will be kept.
%                         Default is 0.
%
%             Output:
%               eigvector - Each column is an embedding function, for a new
%                           data point (row vector) x,  y = x*eigvector
%                           will be the embedding result of x.
%               eigvalue  - The sorted eigvalue of PCA eigen-problem.
%
%   Examples:
%           fea = rand(7,10);
%           options=[]; %store an empty matrix in options
%           options.ReducedDim=4;
%           [eigvector,eigvalue] = PCA(fea,4);
%           Y = fea*eigvector;
%
%   version 3.0 --Dec/2011
%   version 2.2 --Feb/2009
%   version 2.1 --June/2007
%   version 2.0 --May/2007
%   version 1.1 --Feb/2006
%   version 1.0 --April/2004
%
%   Written by Deng Cai (dengcai AT gmail.com)
%

if (~exist('options','var'))

%A = exist('name','kind')
% var = Checks only for variables.
%http://www.mathworks.com/help/matlab/matlab_prog/symbol-reference.html#bsv2dx9-1
%The tilde "~" character is used in comparing arrays for unequal values, 
%finding the logical NOT of an array, 
%and as a placeholder for an input or output argument you want to omit from a function call. 

    options = [];
end

h2 = msgbox('not yet');

ReducedDim = 0;
if isfield(options,'ReducedDim')
%tf = isfield(S, 'fieldname')

h2 = msgbox('checked');

    ReducedDim = options.ReducedDim;
end

[nSmp,nFea] = size(data);
if (ReducedDim > nFea) || (ReducedDim <=0)
    ReducedDim = nFea;
end


if issparse(data)
    data = full(data);
end
sampleMean = mean(data,1);
data = (data - repmat(sampleMean,nSmp,1));

[eigvector, eigvalue] = mySVD(data',ReducedDim);
eigvalue = full(diag(eigvalue)).^2;

if isfield(options,'PCARatio')
    sumEig = sum(eigvalue);
    sumEig = sumEig*options.PCARatio;
    sumNow = 0;
    for idx = 1:length(eigvalue)
        sumNow = sumNow + eigvalue(idx);
        if sumNow >= sumEig
            break;
        end
    end

    eigvector = eigvector(:,1:idx);

end

%dt get from C# program, user ID and name
evFolder = 'ev\';
userIDName = details; %get ID and Name
userIDNameWE = strcat(userIDName,'\');%get ID and Name with extension
filePath = fullfile('C:\Users\***\Desktop\Data Collection\');
userIDNameFolder = strcat(filePath,userIDNameWE); %ID and Name folder
userIDNameEVFolder = strcat(userIDNameFolder,evFolder);%EV folder in ID and Name Folder
userIDNameEVFile = strcat(userIDNameEVFolder,userIDName); % EV file with ID and Name

if ~exist(userIDNameEVFolder, 'dir')
    mkdir(userIDNameEVFolder);
end

newFile =  strcat(userIDNameEVFile,'_1');
searchMat = strcat(newFile,'.mat');
if exist(searchMat, 'file') 
        filePattern = strcat(userIDNameEVFile,'_');

        D = dir([userIDNameEVFolder, '*.mat']);
        Num = length(D(not([D.isdir])))

        Num=Num+1;
        fileName = [filePattern,num2str(Num)];

    save(fileName,'eigvector');

else
     newFile =  strcat(userIDNameEVFile,'_1');
     save(newFile,'eigvector');
end

person David Chia    schedule 07.08.2013    source источник
comment
Если вам нравится опубликовать изображение собственного вектора. Я думаю, что, возможно, вам нужно каким-то образом масштабировать изображение, чтобы представить его в оттенках серого, так как может возникнуть проблема с ограниченным диапазоном 0–255.   -  person Buck Thorn    schedule 07.08.2013


Ответы (1)


Вы передаете параметры в структуре, например:

options.ReducedDim = 2;

or

 options.PCARatio =0.4;

Параметр ReducedDim выбирает количество измерений, которые вы хотите использовать для представления окончательной проекции исходной матрицы. Например, если вы выберете option.ReducedDim = 2, вы будете использовать только два собственных вектора с наибольшими собственными значениями (два основных компонента) для представления ваших данных (фактически PCA вернет два собственных вектора с наибольшими собственными значениями).

Вместо этого PCARatio позволяет вам выбрать количество измерений в качестве первых собственных векторов с наибольшими собственными значениями, которые составляют долю PCARatio от общей суммы собственных значений.

В mySVD.m я бы не стал увеличивать значения по умолчанию, если только вы не ожидаете, что для описания вашего набора данных потребуется более 1600 собственных векторов. Думаю можно смело оставить значения по умолчанию.

person Buck Thorn    schedule 07.08.2013