Python 用于实时人类活动识别的传感器数据预处理
我正试图开发一个android应用程序(Xamarine),使用智能手机上的加速度计和陀螺仪数据对人类活动进行分类。我开发了一个Tensorflow CNN模型来完成这项任务,但我无法实时预处理数据 我使用UCI HAR数据集来训练模型。下面是我用来训练模型的公共数据集的链接。该模型的训练准确率为96%,验证准确率为87%。 数据集: 数据集作者遵循的信号处理方法: 我们使用手机加速计和陀螺仪以50Hz的采样率采集三轴线加速度和角速度信号。使用中值滤波器和截止频率为20 Hz的三阶低通巴特沃斯滤波器对这些信号进行预处理以降低噪声。该速率足以捕捉人体运动,因为其99%的能量包含在15Hz以下。加速度信号包含重力和身体运动分量,使用另一个巴特沃斯低通滤波器将其分离为身体加速度和重力。假设重力只有低频分量,因此我们从实验中发现,对于恒定重力信号,0.3 Hz是最佳转角频率 我的方法:Python 用于实时人类活动识别的传感器数据预处理,python,tensorflow,machine-learning,signal-processing,tensorflow-lite,Python,Tensorflow,Machine Learning,Signal Processing,Tensorflow Lite,我正试图开发一个android应用程序(Xamarine),使用智能手机上的加速度计和陀螺仪数据对人类活动进行分类。我开发了一个Tensorflow CNN模型来完成这项任务,但我无法实时预处理数据 我使用UCI HAR数据集来训练模型。下面是我用来训练模型的公共数据集的链接。该模型的训练准确率为96%,验证准确率为87%。 数据集: 数据集作者遵循的信号处理方法: 我们使用手机加速计和陀螺仪以50Hz的采样率采集三轴线加速度和角速度信号。使用中值滤波器和截止频率为20 Hz的三阶低通巴特沃斯
- 对信号应用窗口大小为5的中值滤波器
- 采用截止频率为20Hz的低通巴特沃斯滤波器
- 应用规范化[-1,1]
private List<List<float>> PrepareInputArray(SensorDataList sensorData)
{
List<List<float>> cols = new List<List<float>>();
sensorData.Acc_Total_X = MedianFilter(sensorData.Acc_Total_X, 128);
sensorData.Acc_Total_X = ButterworthFilter(sensorData.Acc_Total_X);
sensorData.Acc_Total_X = NormalizeData(sensorData.Acc_Total_X);
sensorData.Acc_Total_Y = MedianFilter(sensorData.Acc_Total_Y, 128);
sensorData.Acc_Total_Y = ButterworthFilter(sensorData.Acc_Total_Y);
sensorData.Acc_Total_Y = NormalizeData(sensorData.Acc_Total_Y);
sensorData.Acc_Total_Z = MedianFilter(sensorData.Acc_Total_Z, 128);
sensorData.Acc_Total_Z = ButterworthFilter(sensorData.Acc_Total_Z);
sensorData.Acc_Total_Z = NormalizeData(sensorData.Acc_Total_Z);
for (var i = 0; i < 128; i++)
{
var rows = new List<float> {
sensorData.Acc_Total_X[i], sensorData.Acc_Total_Y[i], sensorData.Acc_Total_Z[i] };
cols.Add(rows);
}
return cols;
}
private static List<float> NormalizeData(IEnumerable<float> data)
{
float dataMax = data.Max();
float dataMin = data.Min();
float range = dataMax - dataMin;
var returnData = data
.Select(d => (2 * (d - dataMin) / range) - 1)
.ToList();
returnData.ForEach(el =>
{
el = float.IsNaN(el) ? 0 : el;
});
return returnData;
}
private static List<float> MedianFilter(List<float> signal, int N = 128)
{
var result = signal;
// Move window through all elements of the signal
for (int i = 2; i < N - 2; ++i)
{
// Pick up window elements
var window = new float[5];
for (int j = 0; j < 5; ++j)
{
window[j] = signal[i - 2 + j];
}
// Order elements (only half of them)
for (int j = 0; j < 3; ++j)
{
// Find position of minimum element
int min = j;
for (int k = j + 1; k < 5; ++k)
{
if (window[k] < window[min])
{
min = k;
}
}
// Put found minimum element in its place
var temp = window[j];
window[j] = window[min];
window[min] = temp;
}
// Get result - the middle element
result[i - 2] = window[2];
}
return result;
}
private static List<float> ButterworthFilter(List<float> src, double cutoff = 20d)
{
var sigOut = new float[128]; //Output signal
var coeff = new LowPassButtersworthCoefficients(3, 50d, cutoff);
var chain = coeff.Calculate();
chain.Filter(src.ToArray(), 0, sigOut, 0, src.Count);
return sigOut.ToList();
}
专用列表准备输入阵列(传感器数据列表传感器数据)
{
List cols=新列表();
sensorData.Acc_Total_X=中间过滤器(sensorData.Acc_Total_X,128);
sensorData.Acc_Total_X=巴特沃斯滤波器(sensorData.Acc_Total_X);
sensorData.Acc_Total_X=归一化数据(sensorData.Acc_Total_X);
sensorData.Acc_Total_Y=中间过滤器(sensorData.Acc_Total_Y,128);
sensorData.Acc_Total_Y=巴特沃斯滤波器(sensorData.Acc_Total_Y);
sensorData.Acc_Total_Y=归一化数据(sensorData.Acc_Total_Y);
sensorData.Acc_Total_Z=中间过滤器(sensorData.Acc_Total_Z,128);
sensorData.Acc_Total_Z=巴特沃斯滤波器(sensorData.Acc_Total_Z);
sensorData.Acc_Total_Z=归一化数据(sensorData.Acc_Total_Z);
对于(变量i=0;i<128;i++)
{
变量行=新列表{
sensorData.Acc_Total_X[i],sensorData.Acc_Total_Y[i],sensorData.Acc_Total_Z[i]};
cols.Add(行);
}
返回cols;
}
私有静态列表规范化数据(IEnumerable数据)
{
float dataMax=data.Max();
float dataMin=data.Min();
浮动范围=数据最大值-数据最小值;
var returnData=数据
.选择(d=>(2*(d-dataMin)/范围)-1)
.ToList();
returnData.ForEach(el=>
{
el=浮动。IsNaN(el)?0:el;
});
返回数据;
}
专用静态列表MedianFilter(列表信号,int N=128)
{
var结果=信号;
//通过信号的所有元素移动窗口
对于(int i=2;i
Butterworth过滤器从以下Nuget软件包中使用:
这就是我在Xamarin(.Net)中进行预处理的方式。在处理之后,我将数据输入模型进行预测,其中的预测是错误的
有人能帮我在移动应用程序中识别人类活动的UCI HAR数据集的数据预处理吗