用于实时识别的 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 是一个资源非常受限的环境。可能需要进一步实时优化 运行(同样,取决于您构建模型和使用模型的方式)。
我有一个项目可以使用三轴加速度计识别 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 是一个资源非常受限的环境。可能需要进一步实时优化 运行(同样,取决于您构建模型和使用模型的方式)。