用于实时识别的 Tensorflow Lite 推理

Tensorflow Lite inference for real time recognition

我有一个项目可以使用三轴加速度计识别 activity 日常生活和跌倒。 我已经训练了 LSTM 模型并获得了很高的准确性。 我即将完成它,但目前我在推理阶段遇到了问题。

我决定将模型转换为 TensorFlow lite,以便将其加载到我的 Raspberry Pi 中,我已经成功完成了。

现在我想在已经连接到我的 Raspberry Pi 的加速度计传感器上对训练模型进行实时识别。

我知道 RNN/LSTM 需要 (Time_steps, Features),在我的例子中是 (200,3)。 而且我知道我还必须在 200 个样本中制作加速度计读数样本 window(对吗?)。

到目前为止,我已经编写了完成此任务的代码:

def get_sample():
    sample_list = []
    sample_count = 0
    total=[0,0,0]
    last_time = time.time_ns() / 1000000000
    while sample_count < 200/3:
        if time.time() - last_time >= 0.01:
            adxl345 = ADXL345()
            axes = adxl345.getAxes(True)
            total[0] += axes['x']
            total[1] += axes['y']
            total[2] += axes['z']
            sample = list(total)
            sample_list += [
                (sample[0] + 9.80665) / (9.80665 * 2),
                (sample[1] + 9.80665) / (9.80665 * 2),
                (sample[2] + 9.80665) / (9.80665 * 2)]
            last_time = time.time_ns() / 1000000000
            sample_count += 1
        time.sleep(0.001)
    sample_list.pop()    
    return sample_list

当我 运行 以下代码时:

    interpreter = tflite.Interpreter(model_path=model_file)
    interpreter.allocate_tensors()

    # Get input and output tensors.
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    sample_list = np.array(np.asarray(np.asarray(sample_list, dtype=np.float32)))

    interpreter.set_tensor(input_details[0]['index'], [[sample_list]])

    interpreter.invoke()

我收到这个错误:

我知道有问题! 也许以我理解推理或 LSTM 的方式。 你能帮帮我吗?

这个问题花了很多时间,到现在都没弄明白。 提前致谢。

您可以通过执行以下操作来调整输入张量的大小:

input_details = interpreter.get_input_details()
interpreter.resize_tensor_input(input_details[0]["index"], input.shape)
interpreter.allocate_tensors()
interpreter.set_tensor(input_details[0]['index'], input)

请注意,我认为您可能 运行 遇到其他问题:

  • 没有看到您生成 LSTM 模型的代码,很难预测它是否有效。
  • Raspberry Pi 是一个资源非常受限的环境。可能需要进一步实时优化 运行(同样,取决于您构建模型和使用模型的方式)。