【问题标题】:3D SIFT for human activity classification in videos. NOT GETTING GOOD ACCURACY.用于视频中人类活动分类的 3D SIFT。没有得到良好的准确性。
【发布时间】:2015-07-21 12:57:53
【问题描述】:

我正在尝试对视频中的人类活动进行分类(六类,每类近 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 的长度索引向量。然后我根据它们在集群中的索引值创建每个视频的直方图签名。然后在签名(dim-600*1000)上执行 svmtrain(matlab 中的 sum)。
一些潜在的问题-

1-我在 3D 中随机生成 300 个点,以从这些点 300 个点计算任意 50 个点上的 50 个描述符。

2- xy 和时间刻度值,默认为“1”。

3-Cluster 数字,我不确定 k=1000 对于 30000x640 数据是否足够。

4-svmtrain,我正在使用这个 matlab 库。

注意:一切都在 MATLAB 上。

【问题讨论】:

  • 有什么问题?我在这里看不到问题陈述。
  • 嘿,我为这部分道歉。问题是我对这个过程的准确性不好。这就是我在这里描述一切的原因。
  • 别生气。我只是想询问更多信息。你的准确率是多少?您希望获得什么准确度?
  • 还有多少视频用于训练,多少用于验证?
  • 你好塞西莉亚,别误会我的意思。我把这个陈述写成了大写,这样每个人都可以看到问题陈述。如果是这样,我再次道歉。

标签: matlab video svm k-means sift


【解决方案1】:

您的基本设置似乎是正确的,特别是考虑到您获得了 85-95% 的准确率。现在,这只是调整程序的问题。不幸的是,除了测试各种参数检查结果并重复之外,没有其他方法可以做到这一点。我将把这个答案分成两部分。关于词袋特征的建议,以及关于 SVM 分类器的建议。

调整词袋功能

您在每个视频中使用 50 个 3D SIFT 特征,这些特征来自随机选择的点,词汇表包含 1000 个视觉单词。正如您已经提到的,词汇量的大小是您可以调整的一个参数。每个视频的描述符数量也是如此。

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

我会手动检查您为其生成特征的点。它们看起来在空间和时间上分布良好吗?您是否捕获了太多背景?问问自己,考虑到这些特征,我能否区分动作?

如果您发现许多选定的点没有提供信息,增加点的数量可能会有所帮助。 kmeans 聚类可以为无信息的异常值创建几个组,更多的点意味着你希望捕获更多的信息点。您也可以尝试其他选择点的方法。例如,您可以使用角点。

您还可以手动检查聚集在一起的点。这些团体有哪些共同的结构?集群是否过于混合?这通常表明您需要更大的词汇量。

调整 SVM

使用 Matlab SVM 实现或 Libsvm 实现应该没有区别。它们都是相同的方法,并且具有相似的调整选项。

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

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

此时,最后一个选项是查看被错误分类的单个实例,并尝试找出它们可能比其他实例更困难的原因。是否有遮挡等共性?还可以直接查看为这些实例选择的视觉词。您可能会发现在调整功能时忽略了一些东西。

祝你好运!

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 2019-01-01
    • 1970-01-01
    • 2014-10-04
    • 2020-11-15
    • 2019-01-06
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多