HMAX模型中C2层后使用osusvm识别人脸
Posted
技术标签:
【中文标题】HMAX模型中C2层后使用osusvm识别人脸【英文标题】:Use the osusvm to recognize faces after the C2 layer in HMAX model 【发布时间】:2014-01-22 13:59:52 【问题描述】:我实现了原始HMAX模型的计算,得到了C2层的结果。现在我仍然有调整层,换句话说,可以使用 osusvm。
在我的项目中,我有两个目录。一个包含训练图像,另一个包含测试图像。
参考:lennon310 在Training images and test images的回复
首先,我想向您展示我在 C2 层的结果(当然结果应该是向量)。请注意,我在 S2 层只提取了 2 个原型(在我的项目中我使用了 256 个原型,但仅在这个问题中,假设我只使用了 2 个原型),以及四个原型大小:[4 8 12 16]
。因此,对于每张图像,我们得到 8 个 C2 单元(2 个原型 x 4 个补丁大小 = 8)。
C2res1:对于六张训练图像:
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
C2res2:对于两个测试图像:
0.0080 0.0132
0.0240 0.0001
0.1007 0.2214
0.3055 0.0249
0.2989 0.3483
4.6946 4.2762
0.7048 1.2791
6.7595 4.7728
其次,我下载了osu-svm matlab工具箱并添加了它的路径:
addpath(genpath('./osu-svm/')); %put your own path to osusvm here
useSVM = 1; %if you do not have osusvm installed you can turn this
%to 0, so that the classifier would be a NN classifier
%note: NN is not a great classifier for these features
然后我使用下面的代码:
%Simple classification code
XTrain = [C2res1]; %training examples as columns
XTest = [C2res2]; %the labels of the training set
ytrain = [ones(size(C2res1,2),1)];%testing examples as columns
ytest = [ones(size(C2res2,2),1)]; %the true labels of the test set
if useSVM
Model = CLSosusvm(XTrain,ytrain); %training
[ry,rw] = CLSosusvmC(XTest,Model); %predicting new labels
else %use a Nearest Neighbor classifier
Model = CLSnn(XTrain, ytrain); %training
[ry,rw] = CLSnnC(XTest,Model); %predicting new labels
end
succes-s-rate = mean(ytest==ry) %a simple classification score
上面的代码是真的吗?为什么我总是得到 succes-s-rate=1 ?我认为我在某些地方是错误的。请我需要帮助。如果是真的,还有另一种计算方法吗?为了获得更性感的结果,我可以使用什么来代替成功率?
注意:
函数 CLSosusvm 是:
function Model = CLSosusvm(Xtrain,Ytrain,sPARAMS);
%function Model = CLSosusvm(Xtrain,Ytrain,sPARAMS);
%
%Builds an SVM classifier
%This is only a wrapper function for osu svm
%It requires that osu svm (http://www.ece.osu.edu/~maj/osu_svm/) is installed and included in the path
%X contains the data-points as COLUMNS, i.e., X is nfeatures \times nexamples
%y is a column vector of all the labels. y is nexamples \times 1
%sPARAMS is a structure of parameters:
%sPARAMS.KERNEL specifies the kernel type
%sPARAMS.C specifies the regularization constant
%sPARAMS.GAMMA, sPARAMS.DEGREE are parameters of the kernel function
%Model contains the parameters of the SVM model as returned by osu svm
Ytrain = Ytrain';
if nargin<3
SETPARAMS = 1;
elseif isempty(sPARAMS)
SETPARAMS = 1;
else
SETPARAMS = 0;
end
if SETPARAMS
sPARAMS.KERNEL = 0;
sPARAMS.C = 1;
end
switch 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);
end
Model.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);
%
%wrapper function for osu svm classification
%Samples contains the data-points to be classified as COLUMNS, i.e., it is nfeatures \times nexamples
%Model is the model returned by CLSosusvm
%Labels are the predicted labels
%DecisionValue are the values assigned by the Model to the points (Labels = sign(DecisionValue))
[Labels, DecisionValue]= SVMClass(Samples, Model.AlphaY, ...
Model.SVs, Model.Bias, ...
Model.Parameters, Model.nSV, Model.nLabel);
Labels = Labels';
DecisionValue = DecisionValue';
【问题讨论】:
Christina,你只有两张测试图像,你很有可能达到 100% 的准确率,不是吗?可以打乱数据,从8个中重新选择2个作为测试 所以我的代码是真的吗?成功率数值决定准确性?如果它等于 1,这指的是 100% 的准确率? 准确的值是什么意思?测试中的 2 个面孔是否 100% 被识别?如果我得到值 0,那么测试图像就无法识别? 【参考方案1】:你的代码在我看来不错。
由于您只有 2 张测试图像,因此可能的成功率将限制为 0、0.5、1。预计以 25% 的概率达到 100% 的准确率([0 1],[1 0] ,[1 1],[0 0])。你可以打乱数据,从8个中重新选择2个作为测试,然后观察准确性。
同时尝试将more images 添加到训练和测试样本中。
【讨论】:
【参考方案2】:机器学习对 8 张图像的集合几乎没有意义。收集至少 10 倍以上的数据,然后分析结果。有了这么小的数据集,任何结果都是可能的(从 0% 到 100%),而且没有一个是可靠的。
同时你可以尝试重复交叉验证:
-
随机播放数据
将其拆分为两个元素部分( [1 2][3 4][5 6][7 8] )
对于每个这样的部分:
a)对其进行测试,同时对其余部分进行培训,例如:
在 [3 4 5 6 7 8] 上训练并在 [1 2] 上测试
b) 记录平均分
重复整个过程并报告均值分数
【讨论】:
我的代码是对的吗?是否存在另一种计算准确性的方法?就我而言,我使用了平均分。例如,如何以另一种方式计算准确性以获得更性感的结果? 你能给我一个有效的链接来下载训练面和测试面吗? 首先 - 我没有审查你的代码,所以是关于提出具体的问题和问题,要求免费的代码审查有点......粗鲁。我只是简要解释了这种行为背后最可能的原因。其次,SO 不是一个寻求资源的论坛,谷歌这样的东西,网上有很多这样的数据集,表现出一些参与度。以上是关于HMAX模型中C2层后使用osusvm识别人脸的主要内容,如果未能解决你的问题,请参考以下文章