Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于实时人类活动识别的传感器数据预处理_Python_Tensorflow_Machine Learning_Signal Processing_Tensorflow Lite - Fatal编程技术网

Python 用于实时人类活动识别的传感器数据预处理

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的三阶低通巴特沃斯

我正试图开发一个android应用程序(Xamarine),使用智能手机上的加速度计和陀螺仪数据对人类活动进行分类。我开发了一个Tensorflow CNN模型来完成这项任务,但我无法实时预处理数据

我使用UCI HAR数据集来训练模型。下面是我用来训练模型的公共数据集的链接。该模型的训练准确率为96%,验证准确率为87%。

数据集

数据集作者遵循的信号处理方法: 我们使用手机加速计和陀螺仪以50Hz的采样率采集三轴线加速度和角速度信号。使用中值滤波器和截止频率为20 Hz的三阶低通巴特沃斯滤波器对这些信号进行预处理以降低噪声。该速率足以捕捉人体运动,因为其99%的能量包含在15Hz以下。加速度信号包含重力和身体运动分量,使用另一个巴特沃斯低通滤波器将其分离为身体加速度和重力。假设重力只有低频分量,因此我们从实验中发现,对于恒定重力信号,0.3 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数据集的数据预处理吗