我试图在视频中对人类活动进行分类(每堂课有六节课,每节课有将近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的长度索引向量。然后,我创建每个视频的直方图签名,根据它们的索引值在集群中。然后执行svmtrain(在matlab中的和)对签名(din-600*1000)。
一些潜在的问题-
1-我在3D中随机生成300个点,从这些点300个点算出50个描述符。
2- xy和时间尺度值,在默认情况下它们是"1“。
3-群集数,我不确定k=1000是否足以处理30000x640数据。
我正在使用这个matlab库。
注意:一切都在MATLAB上。
发布于 2015-05-13 16:09:17
你的基本设置似乎是正确的,特别是考虑到你得到了85%-95%的准确度。现在,这只是一个调整你的程序的问题。不幸的是,除了测试各种参数以检查结果和重复之外,没有其他方法可以做到这一点。我要把这个答案分成两部分。关于单词特征包的建议,关于支持向量机分类器的建议。
字调袋特征
您正在使用50个3D筛选功能,每个视频从随机选择的点,词汇量为1000个视觉单词。正如您已经提到的,词汇表的大小是您可以调整的一个参数。每个视频的描述符数量也是如此。
假设每个视频有60帧长( 30 fps只有2秒,但假设您在1fps采样1分钟视频)。这意味着每个帧捕获的描述符少于一个。这在我看来非常低,即使是3D描述符,特别是如果位置是随机选择的。
我将手动检查您正在为其生成特性的点。它们在空间和时间上都有很好的分布吗?你拍的背景太多了吗?问问自己,考虑到这些特性,我能区分这些行为吗?
如果您发现所选的许多点信息不足,增加点数可能会有所帮助。kmeans聚类可以为信息不丰富的异常值生成一些组,而更多的点意味着您希望捕获更多的信息点。您还可以尝试其他选择点的方法。例如,你可以使用角点。
您还可以手动检查聚集在一起的点。这些团体有什么共同之处?这些星系团是不是太混了?这通常表明你需要一个更大的词汇量。
调整支持向量机
使用Matlab实现或Libsvm实现不应该有什么不同。它们都是相同的方法,具有相似的调优选项。
首先,您应该使用交叉验证来调优支持向量机,以避免在测试集上过度拟合。
支持向量机最强大的参数是核选择。在Matlab中,有五个内置的内核选项,您也可以定义自己的选项。内核也有自己的参数。例如,高斯核有一个缩放因子σ。通常,您从一个简单的内核开始,并与更复杂的内核进行比较。例如,从线性开始,然后测试二次、三次和高斯。要进行比较,您可以简单地查看您的平均交叉验证准确性。
此时,最后一种选择是查看被错误分类的个别实例,并试图找出它们可能比其他实例更难的原因。是否存在诸如遮挡之类的共性?还可以直接查看为这些实例选择的可视单词。在调优功能时,您可能会发现一些您忽略的内容。
祝好运!
https://stackoverflow.com/questions/30160601
复制相似问题