CoolFace
Apppublic

Piyush23890/Sign_Language_Decoder

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes
train_model.py101 linesDownload Raw Back to root
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