用于视频中人类 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。通常,您从一个简单的内核开始,然后与更复杂的内核进行比较。例如,从线性开始,然后测试二次、三次和高斯。要进行比较,您可以简单地查看平均交叉验证准确度。
在这一点上,最后一个选择是查看被错误分类的个别实例,并尝试找出它们可能比其他实例更难的原因。是否存在遮挡等共性?还可以直接查看为这些实例选择的视觉词。您可能会发现在调整功能时忽略的一些内容。
祝你好运!
我正在尝试 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。通常,您从一个简单的内核开始,然后与更复杂的内核进行比较。例如,从线性开始,然后测试二次、三次和高斯。要进行比较,您可以简单地查看平均交叉验证准确度。
在这一点上,最后一个选择是查看被错误分类的个别实例,并尝试找出它们可能比其他实例更难的原因。是否存在遮挡等共性?还可以直接查看为这些实例选择的视觉词。您可能会发现在调整功能时忽略的一些内容。
祝你好运!