我正在尝试对视频中的人类活动进行分类(每个班级六个班级和近100个视频,6 * 100 = 600个视频)。我正在使用来自UCF的3D SIFT(xy和t scale = 1)。
for f= 1:20
f
offset = 0;
c=strcat('running',num2str(f),'.mat');
load(c)
pix=video3Dm;
% Generate descriptors at locations given by subs matrix
for i=1:100
reRun = 1;
while reRun == 1
loc = subs(i+offset,:);
fprintf(1,'Calculating keypoint at location (%d, %d, %d)\n',loc);
% Create a 3DSIFT descriptor at the given location
[keys{i} reRun] = Create_Descriptor(pix,1,1,loc(1),loc(2),loc(3));
if reRun == 1
offset = offset + 1;
end
end
end
fprintf(1,'\nFinished...\n%d points thrown out do to poor descriptive ability.\n',offset);
for t1=1:20
des(t1+((f-1)*100),:)=keys{1,t1}.ivec;
end
f
end
我的方法是首先为一个视频获取50个描述符(640维),然后用所有描述符(在50 * 600 = 30000个描述符上)执行单词包。执行Kmeans(1000 k值)后
idx1000=kmeans(double(total_des),1000);
我得到30k的长度索引向量。然后我根据它们在簇中的索引值创建每个视频的直方图签名。然后在signetures上执行svmtrain(matlab中的sum)(dim-600 * 1000) 一些潜在的问题 -
1 - 我在3D中生成随机300点,从这些点300点开始计算任意50点的50个描述符。
2- xy和时间刻度值,默认情况下为" 1"。
3-Cluster number,我不确定k = 1000对于30000x640数据是否足够。
4-svmtrain,我正在使用这个matlab库。
注意:一切都在MATLAB上。
答案 0 :(得分:1)
您的基本设置似乎是正确的,特别是考虑到您的准确率达到85-95%。现在,这只是调整程序的问题。不幸的是,除了测试检查结果和重复的各种参数之外,没有办法做到这一点。我将把这个答案分成两部分。关于词包特征的建议,以及关于SVM分类器的建议。
每个视频使用50个3D SIFT功能来自随机选择的点,词汇量为1000个视觉词。正如您已经提到的,词汇表的大小是您可以调整的一个参数。每个视频的描述符数量也是如此。
让我们说每个视频都是60帧长(30 fps只有2秒,但让我们假设您以1fps为1分钟的视频进行采样)。这意味着每帧捕获少于一个描述符。即使使用3D描述符,这对我来说似乎也很低,特别是如果随机选择位置。
我会手动检查您要为其生成要素的点。它们在空间和时间上是否分布均匀?你是否捕获了太多背景?问问自己,我是否能够区分给定这些功能的行为?
如果您发现许多选定的点没有信息,增加点数可能会有所帮助。 kmeans聚类可以为无信息异常值创建一些组,更多的点意味着您希望捕获更多信息点。您还可以尝试其他方法来选择点。例如,您可以使用角点。
您还可以手动检查群集在一起的点。这些团体有什么共同的结构?集群是否过于混合?这通常表明您需要更大的词汇量。
使用Matlab SVM实现或Libsvm实现不应该有所作为。它们都是相同的方法,并具有类似的调整选项。
首先,您应该使用交叉验证来调整SVM,以避免在测试集上过度拟合。
SVM最强大的参数是内核选择。在Matlab中,有五个内置的内核选项,您也可以定义自己的内核选项。内核也有自己的参数。例如,高斯核具有缩放因子sigma。通常,您从一个简单的内核开始,并与更复杂的内核进行比较。例如,从线性开始,然后测试二次,三次和高斯。要进行比较,您只需查看平均交叉验证的准确性即可。
此时,最后一个选项是查看错误分类的个别实例,并尝试找出可能比其他实例更难的原因。是否存在咬合等共性?还要直接查看为这些实例选择的视觉单词。在调整功能时,您可能会发现一些您忽略的内容。
祝你好运!