3D SIFT用于视频中的人类活动分类.无法获得良好的准确性



我试图在视频中对人类活动进行分类(六个课程和近100个视频,6*100 = 600个视频)。我使用UCF使用的3D筛分(XY和t量表= 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索引向量。然后,我根据簇中的索引值创建每个视频的直方图签名。然后在签名(DIM-600*1000)上执行SVMtrain(MATLAB中的总和)。
一些潜在的问题 -

1-i在3D中生成随机300点,以计算50点的50点描述符300点。

2- xy和时间尺度值,默认情况下它们为" 1"。

3个集群数字,我不确定K = 1000足以用于30000x640数据。

4-SVMtrain,我正在使用此Matlab库。

注意:一切都在Matlab上。

您的基本设置似乎正确,尤其是考虑到您的精度为85-95%。现在,这只是调整程序的问题。不幸的是,除了测试各种参数检查结果并重复的参数外,没有其他方法可以执行此操作。我将这个答案分为两个部分。有关单词功能的建议,以及有关SVM分类器的建议。

单词功能调音袋

您从随机选择点的每个视频中使用50个3D SIFT功能,其中词汇为1000个视觉单词。如您已经提到的,词汇的大小是您可以调整的一个参数。每个视频的描述符数量也是如此。

假设每个视频的长度为60帧长(仅30 fps仅2秒,但假设您以1fps的方式采样1分钟的视频)。这意味着您每帧捕获少于一个描述符。即使有3D描述符,这对我来说似乎也很低,尤其是在随机选择的位置时。

我将手动检查您正在生成功能的点。它们在时空和时间上的分布是否很好?您要捕捉太多背景吗?问问自己,我是否能够区分这些功能?

如果您发现许多选定的点是无信息的,则增加点数可能会有所帮助。Kmeans的聚类可以使几个小组成为非信息的异常值,而更多的观点意味着您希望您能捕获一些更多信息丰富的观点。您也可以尝试选择其他方法。例如,您可以使用角点。

您也可以手动检查聚集在一起的点。这些团体有什么共同点?集群太混杂了吗?这通常是您需要更大的词汇量的迹象。

调整SVM

使用MATLAB SVM实现或LIBSVM实现不应有所作为。它们都是相同的方法,并且具有相似的调整选项。

首先,您真的应该使用交叉验证来调整SVM,以避免在测试集上过度拟合。

SVM最强大的参数是内核选择。在MATLAB中,内核选项内置五个,您也可以定义自己的选择。内核也有自己的参数。例如,高斯内核具有缩放因子Sigma。通常,您从简单的内核开始,并与更复杂的内核进行比较。例如,从线性开始,然后测试二次,立方体和高斯。为了比较,您可以简单地查看平均交叉验证精度。

在这一点上,最后一个选择是查看错误分类的单个实例,并试图确定其可能比其他情况更困难的原因。有遮挡等共同点吗?还直接查看为这些情况选择的视觉单词。调整功能时,您可能会发现自己忽略的东西。

祝你好运!

最新更新