C++ 一维阵列的运动检测(神经网络或其他选项?)

C++ 一维阵列的运动检测(神经网络或其他选项?),c++,vector,graph,detection,pattern-recognition,C++,Vector,Graph,Detection,Pattern Recognition,我目前正在开发一个检测不同声音的项目。软件应将传入的声音作为波形文件进行分析,并识别某些标签。对于一些标签,我使用神经网络,这也很有效。然而,现在我有了一个标签,它会产生问题。这是关于运动检测的 我想知道声音是否僵硬且静止(当然允许轻微变化),或者声音是否包含运动。为了做到这一点,我将波分成大小相等的帧,并应用FFT得到频谱。对于不熟悉这个领域的人来说。。。别担心。你不必这么做,因为最后只有一张图出来,我想看看这张图是否随时间移动,以及移动了多少 这里有一个小例子。我加载了一个波形(在右上角的图

我目前正在开发一个检测不同声音的项目。软件应将传入的声音作为波形文件进行分析,并识别某些标签。对于一些标签,我使用神经网络,这也很有效。然而,现在我有了一个标签,它会产生问题。这是关于运动检测的

我想知道声音是否僵硬且静止(当然允许轻微变化),或者声音是否包含运动。为了做到这一点,我将波分成大小相等的帧,并应用FFT得到频谱。对于不熟悉这个领域的人来说。。。别担心。你不必这么做,因为最后只有一张图出来,我想看看这张图是否随时间移动,以及移动了多少

这里有一个小例子。我加载了一个波形(在右上角的图片中),随着时间的推移,它在视觉上看起来非常相似。但是,您可以在频谱(右下角)中看到,每帧的高度比例(较高频率)降低。我想以某种方式认识到这种运动

该示例显示了三个帧。每张图片一帧。。。 (很遗憾,我无法在此发布任何图片)

第1帧:

框架2:

框架3:

有没有人能给我一个方法,我怎样才能解决这个问题

为了更好地说明,左下方是光谱图。在这里,你可以看到随时间变化的完整光谱。X表示时间,Y表示频率。同样,你可以很好地看到这个动作

长期以来,我尝试了以下两种想法,但都没有成功或错误地实施:

第一种方法:也是一个神经网络,以及其他标签(它在那里工作得很好)。我在左下角拍摄完整的图片,并将其输入网络,就像图像识别一样。所以你有X*Y输入神经元,一个隐藏层,有2/3倍的神经元和两个输出神经元,用于“运动”或“不运动”。正如我所说的,其他属性都很好,但这个属性与这个属性无关。我需要经常性的网络吗?如果是,有人知道什么吗


第二种方法:我计算从当前帧到下一帧的频谱中各点的差值,并求和。假设频谱中的点0(最低频率)在第0帧中的值为“0.5”,在第1帧中的值为“0.5”,在第2帧中的值为“0.6”,那么我的总数为“0.1”。我对所有点都这样做,并将它们相加。值越高,移动越大,对吗?不幸的是,不完全是这样,因为如果只是一种轻微的颤抖,那么它会在一帧到另一帧之间轻微地上下移动,但根本不会移动,然后它仍然会进行总结并识别出一个移动,但几乎没有任何移动可用。

声音识别仍然具有竞争力。 没有人能给你一个解决方案,他可以说这是可行的。可能是在这一领域非常有经验的人(+15年的声音识别)

你可以使用递归神经网络,但我不会给他们太多机会,让他们在这种情况下工作得很好。但它可以。你应该使用贝叶斯网络。贝叶斯网络用于口语词的识别。这是我找到的第一篇论文的链接:我没有读过,只是你知道我在说什么。维基百科也应该有所帮助

很明显,你可以用你的神经网络尝试更多的功能。例如顶点的数量、顶点的频率、梯度等。这是可行的,它解决了一个与时间相关的数据问题。和时间预测一样好。 与应用主成分分析(pca)或线性判别分析(lda)相比,您可以完美地生成许多特征。这将删除不重要的数据,这些数据可能会混淆您的神经网络,并使训练持续时间非常长

我会先尝试2个,因为它的工作量更少。只需制作更多功能并再次训练您的ANN。顺便说一句,对于这个问题,一层似乎不太合适,即使我不知道您的功能和输出的数量。也许你应该至少使用两个中间层

如果你不能用2得到一个解决方案,你应该根据2的结果来决定你是采用RNN还是贝叶斯网络。如果具有新功能的解决方案2不好,我不会尝试RNN,因为它们非常相似。众所周知,贝叶斯网络适用于时间相关数据