Piyush23890/Sign_Language_Decoder
0
1"""2train_model.py3==============4Train a Random Forest classifier on the collected static ISL landmark CSVs.5 6Pipeline7--------81. Walk dataset/<LABEL>/data.csv for every letter A–Z92. Merge into a single feature matrix (N × 126)103. Train RandomForestClassifier(n_estimators=300)114. Save isl_alphabet_model.pkl + label_map.pkl12 13Usage14-----15 python train_model.py16"""17 18import os19import joblib20import numpy as np21import pandas as pd22from sklearn.ensemble import RandomForestClassifier23from sklearn.metrics import accuracy_score, classification_report24from sklearn.model_selection import train_test_split25 26DATASET_PATH = "dataset"27MODEL_PATH = "isl_alphabet_model.pkl"28LABEL_MAP_PATH= "label_map.pkl"29EXPECTED_COLS = 12630 31# ── 1. Load data ────────────────────────────────────────────────────────────────32print("=" * 50)33print("SignBridge — Static Model Trainer")34print("=" * 50)35 36X, y = [], []37LABELS = sorted(os.listdir(DATASET_PATH))38label_map = {lbl: idx for idx, lbl in enumerate(LABELS)}39 40for label in LABELS:41 csv_path = os.path.join(DATASET_PATH, label, "data.csv")42 if not os.path.exists(csv_path):43 print(f" [WARN] Missing: {csv_path}")44 continue45 46 df = pd.read_csv(csv_path, engine="python", on_bad_lines="skip")47 loaded = 048 49 for _, row in df.iterrows():50 vals = row.values51 # Skip header rows accidentally written as data52 if isinstance(vals[0], str):53 continue54 try:55 vals = vals.astype(float)56 except ValueError:57 continue58 59 # Pad / truncate to 12660 if len(vals) < EXPECTED_COLS:61 vals = np.pad(vals, (0, EXPECTED_COLS - len(vals)))62 vals = vals[:EXPECTED_COLS]63 64 X.append(vals)65 y.append(label_map[label])66 loaded += 167 68 print(f" [{label}] {loaded} samples")69 70X = np.array(X, dtype=np.float32)71y = np.array(y, dtype=np.int32)72 73print(f"\nDataset: {X.shape[0]} samples × {X.shape[1]} features | {len(label_map)} classes")74if len(np.unique(y)) < 2:75 raise RuntimeError("Need at least 2 classes to train — collect more data.")76 77# ── 2. Train / test split ────────────────────────────────────────────────────────78X_train, X_test, y_train, y_test = train_test_split(79 X, y, test_size=0.20, random_state=42, stratify=y80)81print(f"Train: {len(X_train)} | Test: {len(X_test)}")82 83# ── 3. Train ─────────────────────────────────────────────────────────────────────84print("\nTraining RandomForestClassifier (n_estimators=300) …")85clf = RandomForestClassifier(n_estimators=300, n_jobs=-1, random_state=42)86clf.fit(X_train, y_train)87 88# ── 4. Evaluate ──────────────────────────────────────────────────────────────────89y_pred = clf.predict(X_test)90acc = accuracy_score(y_test, y_pred)91print(f"\nTest Accuracy : {acc * 100:.2f}%")92print("\nClassification Report:")93print(classification_report(y_test, y_pred,94 target_names=[l for l in LABELS if l in label_map]))95 96# ── 5. Save ───────────────────────────────────────────────────────────────────────97joblib.dump(clf, MODEL_PATH)98joblib.dump(label_map, LABEL_MAP_PATH)99print(f"\nSaved: {MODEL_PATH} + {LABEL_MAP_PATH}")100print("Classes trained:", list(label_map.keys()))101 