IMU_CLASSIFY / app.py
lsy1205's picture
change output
fec8913
Raw
History Blame Contribute Delete
2.9 kB
import gradio as gr
import torch
import numpy as np
import json
from Attn_conv import Attn_conv # 替换为你的模型路径
# 加载模型
model = Attn_conv(n_class=4)
model.load_state_dict(torch.load("./Attn_conv.pth", weights_only=True,map_location=torch.device('cpu')))
model.eval()
# 推理函数
def predict(data):
# 读取上传的 JSON 文件
try:
# with open(file.name, "r") as f:
# data = json.load(f)
channels = ["AccelX", "AccelY", "AccelZ", "GyroX", "GyroY", "GyroZ"]
# 转换为 NumPy 数组,形状为 (6, sequence_length)
imu_data = np.array([data[channel] for channel in channels])
#Process data
len_data = imu_data.shape[1]
window_size = 30
overlap = 15
step = window_size - overlap
predictions = [0,0,0,0]
for start in range(0,len_data,step):
end = start + window_size
if end > len_data:
# Zero padding to last window
window = np.pad(imu_data[:, start:], ((0, 0), (0, end - len_data)), mode='constant')
else:
window = imu_data[:, start:end]
input_tensor = torch.tensor(window, dtype=torch.float32).unsqueeze(0)
with torch.no_grad():
output = model(input_tensor)
probabilities = torch.softmax(output, dim=-1).cpu().numpy()
predicted_class = np.argmax(probabilities)
#print(probabilities)
if np.max(probabilities) > 0.70: #Threshold
predictions[predicted_class] += 1
#取眾數
max_count = max(predictions)
predictions = [x if x == max_count else 0 for x in predictions]
#Result
# result = (
# f"bicep: {predictions[0]} | abs: {predictions[1]} | "
# f"chess: {predictions[2]} | legs: {predictions[3]}"
# )
class_names = ["dumbbells", "situps", "pushups", "squats"]
if max_count == 0:
# 沒有任何類別達到閾值
result_json = {
"type": None,
"reps": 0
}
else:
# 找出哪個類別擁有 max_count
# 如果有多個類別並列最高,這裡僅選第一個
max_index = predictions.index(max_count)
result_json = {
"type": class_names[max_index],
"reps": max_count
}
return result_json
except Exception as e:
return {"error": str(e)}
# 定义 Gradio 界面
iface = gr.Interface(
fn=predict,
inputs=gr.JSON(label="json file"),
outputs=gr.JSON(label="Prediction Result"),
title="Burnsync classifier",
description="Upload a JSON file with 6-channel IMU time series data to predict the action class."
)
# 启动应用
iface.launch()