-1

我的项目是创建一个软件来识别某些物体,如苹果或硬币等。我想使用 Kinect。我的问题是:我需要像 haar 分类器这样的机器学习算法来识别物体还是 kinect 本身可以做到这一点?

4

1 回答 1

4

Kinect 本身无法识别物体。它会给你一个密集的深度图。然后您可以使用深度特征和一些简单的特征(在您的情况下,也许颜色特征或渐变特征可以完成这项工作)。您输入到分类器(例如 SVM 或随机森林)以训练系统的那些特征。您使用经过训练的模型对新样本进行测试。

关于 Haar 功能,我认为他们可以完成这项工作,但您需要一个足够大的功能数据库。这完全取决于您要检测的内容。在苹果和硬币的情况下,只要颜色就足够了。

请参阅本文了解如何使用 Kinect 相机执行人体姿势识别。你只需要注意它们的深度特征和分类器。不要直接应用他们的方法。你的问题更简单。

编辑:简单的渐变方向直方图

梯度方向可以让您对物体的形状有一个粗略的了解(它不是具体的形状特征,存在更好的形状特征,但是这个计算速度非常快)。

代码片段:

%calculate gradient
[dx,dy] = gradient(double(img));
A = (atan(dy./(dx+eps))*180)/pi;   %eps added to avoid division by zero.

A 将包含每个像素的方向。根据深度值分割原始图像。对于具有相似深度值的段,计算颜色直方图。提取与该区域对应的像素方向,称为A_r. 计算一个 9 箱(您可以有更多箱。九箱意味着每个箱将包含180/9=20 degrees)直方图。连接颜色特征和梯度直方图。这样做以获得足够数量的叶子。然后你可以把它交给一个分类器进行训练。

编辑:这是对下面评论的回复。

关于opencv_traincascadeMaxDepth中的参数

文档说,“弱树的最大深度。一个不错的选择是 1,这是树桩的情况”。当您执行二进制分类时,它采用以下形式:

if yourFeatureValue>=learntThresh
   class=1;
else
   class=0;
end

上述对单个特征值(标量)执行阈值处理的分类器称为决策树桩。正负类之间只有一个分裂(因此maxDepth是一个)。例如,它将在以下情况下工作。假设您有一个一维特征:

f=[1 2 3 4 -1 -2 -3 -4]

前 4 个是 1 类,其余是 0 类。通过将阈值设置为零,决策树桩将在此数据上获得 100% 的准确度。现在,想象一个复杂的特征空间,例如:

f=[1 2 3 4 5 6 7 8 9 10 11 12];

前 4 个和后 4 个是 1 类,其余是 0 类。在这里,您不能通过决策树桩获得 100% 的分类。您需要两个阈值/拆分。因此,您可以构建深度值为 2 的树。您将有 2^(2-1)=2 个阈值。对于depth=3,你得到4个阈值,对于depth=4,你得到8个阈值,依此类推。在这里,我假设具有单个节点的树的高度为 1。

您可能会觉得级别数越多,可以达到更高的准确度,但随之而来的是过度拟合(以及计算、内存存储等)的问题。因此,您必须为深度设置一个好的值。我通常将其设置为 3。

于 2014-02-12T22:56:35.130 回答