用于视频中人类 activity 分类的 3D SIFT。没有得到很好的准确性。

3D SIFT for human activity classification in videos. NOT GETTING GOOD ACCURACY.

我正在尝试 class 验证视频中的人类活动(六个 class 和近 100 个视频,每个 class,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(dim-600*1000).
上执行 svmtrain(sum in matlab) 一些潜在的问题-

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

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 描述符,这对我来说似乎也很低,尤其是在随机选择位置的情况下。

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

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

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

调整 SVM

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

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

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

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

祝你好运!