Sep-20-2021, 09:55 AM
Hi everyone, i have followed a youtube tutorial to build a model for human activity recognition using accelerometer.
In my model i used both accelerometer and gyroscope, so i have 6 features.
I'm trying to use the model for real time activity recognition. How? I have a loop with a kafka consumer which fills a dictionary, and for each client connected when the number of measurements reach a specific amount (80, 4 seconds) a make_prediction function gets called, (this function calls model.predict_classes).
My problem is: if i collect a dataset ad i use the model for prediction i get a very good accuracy, about 90-95%, when i try to predict activity in real time my model doesn't work.
This is the relevant code:
Code I used to train the model:
Now this is how i predict the activity in real time:
Even if i collect a dataset and i try to make prediction on it, using the function get_frames_2 to process the data, the model works.
But when i use i for real time prediction, i don't get the correct result, i get Walking label every time.
Can someone help me please? Thank you!
In my model i used both accelerometer and gyroscope, so i have 6 features.
I'm trying to use the model for real time activity recognition. How? I have a loop with a kafka consumer which fills a dictionary, and for each client connected when the number of measurements reach a specific amount (80, 4 seconds) a make_prediction function gets called, (this function calls model.predict_classes).
My problem is: if i collect a dataset ad i use the model for prediction i get a very good accuracy, about 90-95%, when i try to predict activity in real time my model doesn't work.
This is the relevant code:
Code I used to train the model:
X = balanced_data[['acc_x', 'acc_y', 'acc_z', 'gy_x', 'gy_y', 'gy_z']]
y = balanced_data['label']
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
scaled_X = pd.DataFrame(data = X, columns = ['acc_x', 'acc_y', 'acc_z', 'gy_x', 'gy_y','gy_z'])
scaled_X['label'] = y.values
scaled_X.head()
Fs = 20
frame_size = Fs*4 # 80
hop_size = Fs*2 # 40
def get_frames(df, frame_size, hop_size):
N_FEATURES = 6
frames = []
labels = []
for i in range(0, len(df) - frame_size, hop_size):
acc_x = df['acc_x'].values[i: i + frame_size]
acc_y = df['acc_y'].values[i: i + frame_size]
acc_z = df['acc_z'].values[i: i + frame_size]
gy_x = df['gy_x'].values[i: i + frame_size]
gy_y = df['gy_y'].values[i: i + frame_size]
gy_z = df['gy_z'].values[i: i + frame_size]
# Retrieve the most often used label in this segment
label = stats.mode(df['label'][i: i + frame_size])[0][0]
frames.append([acc_x, acc_y, acc_z, gy_z, gy_y, gy_z])
labels.append(label)
# Bring the segments into a better shape
frames = np.asarray(frames).reshape(-1, frame_size, N_FEATURES)
labels = np.asarray(labels)
return frames, labels
X, y = get_frames(scaled_X, frame_size, hop_size)
X.shape, y.shape
X, y = shuffle(X, y, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0, stratify = y)
x_train_bf = X_train
X_train = X_train.reshape(len(X_train), 80, 6, 1)
X_test = X_test.reshape(len(X_test), 80, 6, 1)I get a val_accuracy of 96-98%.Now this is how i predict the activity in real time:
if len(prediction_sockets[key])>=prediction_sockets_index[key] + 80:
window = prediction_sockets[key][prediction_sockets_index[key]:prediction_sockets_index[key]+80]
result = await make_prediction(window)
print(str(result) +str(key)+ '\n\n\n\n\n')
prediction_sockets_index[key]+=40
#make_prediction function
def make_prediction(window):
frames=[]
for line in window:
frames.append([float(line[1]),float(line[2]),float(line[3]),float(line[5]),float(line[6]),float(line[7])])
#lines:['user', 'acc_timestamp','acc_x','acc_y','acc_z','gy_timestamp','gy_x','gy_y','gy_z']
cols=['acc_x', 'acc_y', 'acc_z', 'gy_x', 'gy_y', 'gy_z']
data = pd.DataFrame(data = frames, columns = cols)
scaler_2 = ML.scaler #ML is the file where i trained the model, i'm using the same scaler.
window_scaled=scaler_2.transform(data)
scaled_data = pd.DataFrame(data = window_scaled, columns = cols)
frame_pp=get_frames_2(scaled_data,80,40)
re_frame = frame_pp.reshape(len(frame_pp),80,6,1)
return model.predict_classes(re_frame)
def get_frames_2(df, frame_size, hop_size):
N_FEATURES = 6
frames = []
for i in range(0, len(df) - frame_size, hop_size):
acc_x = df['acc_x'].values[i: i + frame_size]
acc_y = df['acc_y'].values[i: i + frame_size]
acc_z = df['acc_z'].values[i: i + frame_size]
gy_x = df['gy_x'].values[i: i + frame_size]
gy_y = df['gy_y'].values[i: i + frame_size]
gy_z = df['gy_z'].values[i: i + frame_size]
frames.append([acc_x, acc_y, acc_z, gy_x,gy_y,gy_z])
# Bring the segments into a better shape
frames = np.asarray(frames).reshape(-1, frame_size, N_FEATURES)As you can see i'm pre-processing the data exactly the same way when i train my model and when i use for real-time recogniton.Even if i collect a dataset and i try to make prediction on it, using the function get_frames_2 to process the data, the model works.
But when i use i for real time prediction, i don't get the correct result, i get Walking label every time.
Can someone help me please? Thank you!
