project / train_model.py
Asmitha3's picture
Upload train_model.py
5de67dd verified
import os
# --- FIX: Set environment variable to prevent Protobuf/TensorFlow crash ---
os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python'
# -----------------------------------------------------------------------
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# --- 1. Data Loading and Setup ---
DATA_PATH = os.path.join('ML_Data')
ACTIONS = np.array(sorted(os.listdir(DATA_PATH)))
SEQUENCE_LENGTH = 20
label_map = {label:num for num, label in enumerate(ACTIONS)}
NUM_CLASSES = len(ACTIONS)
sequences, labels = [], []
for action in ACTIONS:
for sequence in range(15):
window = []
for frame_num in range(SEQUENCE_LENGTH):
try:
# Load the 63 features (21 landmarks * 3 coords)
res = np.load(os.path.join(DATA_PATH, action, str(sequence), f"{frame_num}.npy"))
window.append(res)
except:
continue
if len(window) == SEQUENCE_LENGTH:
sequences.append(window)
labels.append(label_map[action])
X = np.array(sequences)
y = to_categorical(labels).astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05)
# --- 2. Define the Neural Network Model (LSTM) ---
model = Sequential()
model.add(LSTM(64, return_sequences=True, activation='relu', input_shape=(SEQUENCE_LENGTH, 63)))
model.add(LSTM(128, return_sequences=True, activation='relu'))
model.add(LSTM(64, return_sequences=False, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(NUM_CLASSES, activation='softmax'))
# --- 3. Compile, Train, and Save ---
model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['categorical_accuracy'])
print(f"Starting Training for {NUM_CLASSES} signs...")
model.fit(X_train, y_train, epochs=100, callbacks=[])
res = model.predict(X_test)
y_pred = np.argmax(res, axis=1)
y_true = np.argmax(y_test, axis=1)
print(f"\nModel Accuracy on Test Data: {accuracy_score(y_true, y_pred)*100:.2f}%")
model.save('/tmp/sign_language_model.h5')
print("Model trained and saved as sign_language_model.h5")