在之前的数据处理环节中,用CSI Tool收集到的原始数据信号,经历了数据解析、降噪、插值的处理步骤,变成了干净、完整的信号片段,这是后续做更进一步分析的基础。
在开始阅读本篇博客前,需要说明两个重要的点:
- 在先前的代码中,为了能够一次性提取出所有重要的信息,振幅和相位数据都进行了计算,被存储到result_matrix这个数组中,但是从本篇博客开始,将仅围绕着振幅值进行分析。具体提以什么值进行分析,请结合自己的研究对象以及相关文献。
- 后续的特征提取以及研究思路都是基于人类活动识别,CSI感知所涵盖的领域较多,而特征的提取与识别对象本身息息相关,因此需要对比自己所研究的领域,同本博客的是否有相似性。
本环节是特征提取环节,起承上启下的作用:对上,应着数据处理完毕的信号,但是还不能直接进行分析,因为此时信号片段过长,对于活动识别而言,存在非许多目标片段(例如失败不规范的动作、休息间歇等);对下,具体采取何种活动片段提取策略,需要配合后续采取的活动识别算法进行(深度学习/机器学习,CNN/RNN/LSTM等等),不同的算法适配不同的数据形式,例如CNN一般用于识图,不需要关注时间顺序,LSTM则要求保留时间关系等等,所以本博客后续仅介绍几种分类思路。
以CNN识图这种非常简单粗暴的一种识别方法为例,由于最后是需要图像形式的数据集,因此本环节,经历了以下几个步骤:
①标记活动点→②切割信号片段→③筛选活动片段→④转化为图像帧
具体怎么实现上述步骤呢,这里参考了下面博客的做法。这个github是我做CSI识别时候的救星,虽然是LSTM算法,但是里面的代码很全,只要提供信号数据文件和标注文件,就可以自动去进行一系列后续的操作。
GitHub - ermongroup/Wifi_Activity_Recognition: Code for IEEE Communication Magazine (A Survey on Behaviour Recognition Using WiFi Channle State Information)
在上面这个博客中,一共有三个重要的Python文件,其顺序和作用是:
cross_vali_data_convert_merge.py:从指定路径中的CSV文件中导入数据,并根据一定的条件将数据处理成滑动窗口的形式,然后将处理后的数据保存到新的CSV文件中。
cross_vali_input_data.py:读取前述代码处理好的CSV文件,对数据进行降采样、预处理,根据活动阈值进行筛选,并将处理后的数据存储到字典中。
cross_vali_recurrent_network_wifi_activity.py:LSTM算法部分。
接下来列出的代码源于上述博客,作出了一定修改。下面将按照代码,详细介绍每一步需要准备的文件和处理流程,实验细节以之前博客所设定的参数为例。
① 标记活动点
在之前的环节中,得到的是一段信号片段result_matrix,由于只需要振幅数值,那么现在result_matrix这个数组的维度是(N,91),N为数据包的个数。图像化展示一段信号的振幅图像如下:
可以看到圈起来的片段波动较大,对应着志愿者实际发生活动,而在活动的间歇间,振幅波动则很小,因此振幅的方差可以作为是否发生活动的一种判定方式,有相关文献是根据此进行自动化的活动片段提取。但是并不是所有的活动数据都能采用这个思路,不怕麻烦的话,人工对照视频监控对数据文件进行标注是最准确的方法,可以手动淘汰不标准的动作。不过改方式要求在先前做实验的时候,记录每次采集数据开始的时间,因为CSI信号数据本身并未存储现实生活中的时间,只有相对时间信息。举例,一段长度为10000的CSI信号,采样频率是1000Hz,可知该段信号记录了10s的活动,如果采集开始时刻已知,即可知道这段信号对应的真实时间段。
首先,将数据处理环节得到的振幅值以csv格式进行存储,每个实验样本的CSI振幅为一个csv文件,期内有90*N个数