在HMAX模型的C2层之后使用osusvm进行人脸识别

我已经完成了原始HMAX模型的计算,并在C2层获得了结果。现在我还有一个调整层,换句话说,就是要使用osusvm。

在我的项目中,我有两个目录。一个包含训练图像,另一个包含测试图像。

参考资料: lennon310在训练图像和测试图像中的回答

首先,我想向您展示我在C2层的成果(当然,这些结果应该是向量)。请注意,我在S2层只提取了2个原型(在我的项目中我使用了256个原型,但在本问题中,假设我只使用了2个原型),以及四种原型大小:[4 8 12 16]。因此,对于每张图像,我们会得到8个C2单元(2个原型 x 4个补丁大小 = 8)。

C2res{1}:对于六张训练图像:

0.0088    0.0098    0.0030    0.0067    0.0063    0.0057    0.0300    0.0315    0.0251    0.0211    0.0295    0.0248           0.1042    0.1843    0.1151    0.1166    0.0668    0.1134            0.3380    0.2529    0.3709    0.2886    0.3938    0.3078           0.2535    0.3255    0.3564    0.2196    0.1681    0.2827          3.9902    5.3475    4.5504    4.9500    6.7440    4.4033          0.8520    0.8740    0.7209    0.7705    0.4303    0.7687       6.3131    7.2560    7.9412    7.1929    9.8789    6.6764 

C2res{2}:对于两张测试图像:

0.0080    0.01320.0240    0.00010.1007    0.22140.3055    0.02490.2989    0.34834.6946    4.27620.7048    1.27916.7595    4.7728

其次,我下载了osu-svm的matlab工具箱,并添加了其路径:

addpath(genpath('./osu-svm/')); %在这里添加您自己的osusvm路径 useSVM = 1; %如果您没有安装osusvm,您可以将其设置为0,这样分类器将使用NN分类器        %注意:对于这些特征,NN不是一个很好的分类器

然后我使用了下面的代码:

%简单的分类代码XTrain = [C2res{1}]; %训练样本作为列 XTest =  [C2res{2}]; %训练集的标签ytrain = [ones(size(C2res{1},2),1)];%测试样本作为列ytest = [ones(size(C2res{2},2),1)]; %测试集的真实标签if useSVM  Model = CLSosusvm(XTrain,ytrain);  %训练  [ry,rw] = CLSosusvmC(XTest,Model); %预测新标签else %使用最近邻分类器  Model = CLSnn(XTrain, ytrain); %训练  [ry,rw] = CLSnnC(XTest,Model); %预测新标签end  successrate = mean(ytest==ry) %一个简单的分类得分

上面的代码是否正确?为什么我总是得到successrate=1?我认为在某些地方我做错了。请帮帮我。如果这是正确的,还有没有其他计算方法?我可以使用什么来代替successrate,以便获得更好的结果?

注意:

函数CLSosusvm是:

function Model = CLSosusvm(Xtrain,Ytrain,sPARAMS);%function Model = CLSosusvm(Xtrain,Ytrain,sPARAMS);%%构建一个SVM分类器%这只是osu svm的一个包装函数%它要求osu svm(http://www.ece.osu.edu/~maj/osu_svm/)已安装并包含在路径中%X包含数据点作为列,即X是nfeatures \times nexamples%y是一个包含所有标签的列向量。y是nexamples \times 1%sPARAMS是一个参数结构:%sPARAMS.KERNEL指定内核类型%sPARAMS.C指定正则化常数%sPARAMS.GAMMA, sPARAMS.DEGREE是内核函数的参数%Model包含由osu svm返回的SVM模型的参数Ytrain = Ytrain';if nargin<3  SETPARAMS = 1;elseif isempty(sPARAMS)  SETPARAMS = 1;else  SETPARAMS = 0;endif SETPARAMS  sPARAMS.KERNEL = 0;  sPARAMS.C = 1;endswitch sPARAMS.KERNEL,  case 0,    [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ...    LinearSVC(Xtrain, Ytrain, sPARAMS.C);  case 1,    [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ...    PolySVC(Xtrain, Ytrain, sPARAMS.DEGREE, sPARAMS.C, 1,0);  case 2,    [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ...    PolySVC(Xtrain, Ytrain, sPARAMS.DEGREE, sPARAMS.C, 1,sPARAMS.COEF);  case 3,    [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ...    RbfSVC(Xtrain, Ytrain, sPARAMS.GAMMA, sPARAMS.C);    endModel.AlphaY = AlphaY;Model.SVs = SVs;Model.Bias = Bias;Model.Parameters = Parameters;Model.nSV = nSV;Model.nLabel = nLabel;Model.sPARAMS = sPARAMS;

函数CLSosusvmC是:

function [Labels, DecisionValue]= CLSosusvmC(Samples, Model);%function [Labels, DecisionValue]= CLSosusvmC(Samples, Model);%%osu svm分类的包装函数%Samples包含要分类的数据点作为列,即它是nfeatures \times nexamples%Model是由CLSosusvm返回的模型%Labels是预测的标签%DecisionValue是模型分配给点的数值(Labels = sign(DecisionValue))[Labels, DecisionValue]= SVMClass(Samples, Model.AlphaY, ...                                  Model.SVs, Model.Bias, ...                  Model.Parameters, Model.nSV, Model.nLabel);Labels = Labels';DecisionValue = DecisionValue';

回答:

你的代码在我看来是正确的。

由于你只有2张测试图像,可能的成功率将限于0、0.5、1。并且有25%的概率达到100%的准确率([0 1],[1 0],[1 1],[0 0])。你可以打乱数据,并多次重新选择8张中的2张作为测试,然后观察准确率。

还可以尝试添加更多图像到训练和测试样本中。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注