我正在做一个出于教育目的的个人项目,以学习 Keras 和机器学习。首先,我想对声音是拍手声还是跺脚声进行分类。
我使用的是声音触发的微控制器,并以 20usec 的速度采样声音。微控制器会将这些原始 ADC 数据发送到 PC 进行 Python 处理。我目前正在获取 1000 点并使用 numpy 获取 FFT(使用 rfft 并获取其绝对值)。
现在,我想将捕获的拍手或踩踏 FFT 信号作为训练数据提供,以便使用神经网络对它们进行分类。我为此研究了一整天,有些文章说应该使用卷积神经网络,有些文章说应该使用循环神经网络。
我查看了卷积神经网络,它提出了另一个问题,我是否应该使用 Keras 的 1-D 或 2-D Conv。
您需要处理 FFT 信号来分类声音是拍手声还是跺脚声。
对于卷积神经网络 (CNN):
CNN 可以从固定长度的输入中提取特征。具有最大池化功能的一维 CNN 在信号数据上效果最好(我个人在加速度计数据上使用它们)。
如果您的输入是固定长度并且具有显着特征,则可以使用它们。
对于循环神经网络:
当信号具有时间特征时应使用。
时间特征(例如)可以用这种方式来识别拍手。拍手会立即发出高亢的声音,然后发出轻柔的声音(当拍手结束时)。 RNN 将按顺序学习这两个特征(上面提到的)。而且鼓掌也是一个连续的动作(它由顺序的各种活动组成)。
如果 RNN 和 LSTM 具有出色的功能,它们可能是最佳选择。
混合Conv LSTM:
该神经网络是 CNN 和 LSTM (RNN) 的混合体。他们使用 CNN 进行特征提取,然后由 LSTM 学习该序列。 CNN 提取的特征还包含时间特征。
如果您使用 Keras,这可能非常简单。
提示:
在进行音频分类时,我还会建议使用MFCC来提取特征。
我认为你应该尝试所有 3 种方法,看看哪一种最适合。 RNN 和 ConvLSTM 很可能适合您的用例。
希望有帮助。
由于在这种情况下训练/测试系统不是嵌入式系统,请看一下 VGGish(https://github.com/tensorflow/models/tree/master/research/audioset - 也参考论文和包括拍手的数据集),它使用以下内容来计算一组特征:
VGGish 使用如下计算的音频特征进行训练:
注意 - 鼓掌已涵盖 (https://research.google.com/audioset/dataset/clapping.html)