{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":46105,"databundleVersionId":5087314}],"dockerImageVersionId":31329,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport json\nfrom tqdm import tqdm\nimport gc\n\nbase_path = '/kaggle/input/competitions/asl-signs'\ntrain_csv_path = '/kaggle/input/competitions/asl-signs/train.csv'\njson_map_path = '/kaggle/input/competitions/asl-signs/sign_to_prediction_index_map.json'\n\ntrain_df = pd.read_csv(train_csv_path)\nwith open(json_map_path, 'r') as f:\n    sign_map = json.load(f)\n\nLEFT_HAND = list(range(468, 489))\nRIGHT_HAND = list(range(522, 543))\nKEY_POSE = [500, 501, 502, 503, 504, 505]\nSELECTED = LEFT_HAND + RIGHT_HAND + KEY_POSE\n\nos.makedirs('processed_chunks', exist_ok=True)\n\ndef fast_preprocess():\n    valid_count = 0\n    for i, (index, row) in enumerate(tqdm(train_df.iterrows(), total=len(train_df))):\n        file_path = os.path.join(base_path, row['path'])\n        try:\n            data = pd.read_parquet(file_path, columns=['x', 'y', 'z'])\n            n_frames = len(data) // 543\n\n            indices = np.linspace(0, n_frames - 1, 30).astype(int)\n            raw = data.values.reshape(n_frames, 543, 3)\n            processed = raw[indices][:, SELECTED, :].reshape(30, -1)\n\n            processed = np.nan_to_num(processed)\n\n            # Per-frame normalizasyon\n            mean = processed.mean(axis=1, keepdims=True)\n            std = processed.std(axis=1, keepdims=True)\n            processed = (processed - mean) / (std + 1e-6)\n\n            label = sign_map[row['sign']]\n            np.save(f'processed_chunks/{valid_count}_{label}.npy', processed.astype('float16'))\n            valid_count += 1\n\n            if i % 1000 == 0:\n                gc.collect()\n        except:\n            continue\n\n    print(f\"Bitti! {valid_count} dosya hazır.\")\n\nfast_preprocess()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-05-06T15:19:43.861553Z","iopub.execute_input":"2026-05-06T15:19:43.861816Z","iopub.status.idle":"2026-05-06T15:46:21.780859Z","shell.execute_reply.started":"2026-05-06T15:19:43.861792Z","shell.execute_reply":"2026-05-06T15:46:21.780132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nimport os\nimport glob\nimport gc\nfrom sklearn.model_selection import train_test_split\n\ntf.keras.backend.clear_session()\ngc.collect()\n\n# Tek GPU - strateji yok\nBATCH_SIZE = 64\nNUM_CLASSES = 250\nNUM_FRAMES = 30\nNUM_FEATURES = 144\n\nfile_list = glob.glob('processed_chunks/*.npy')\ntrain_files, val_files = train_test_split(file_list, test_size=0.15, random_state=42)\nprint(f\"Eğitim: {len(train_files)} | Doğrulama: {len(val_files)}\")\n\ndef load_sample(path):\n    path = path.numpy().decode('utf-8')\n    data = np.load(path).astype('float32')\n    label = int(os.path.basename(path).split('_')[-1].split('.')[0])\n    return data, label\n\ndef tf_load_sample(path):\n    data, label = tf.py_function(load_sample, [path], [tf.float32, tf.int32])\n    data.set_shape([NUM_FRAMES, NUM_FEATURES])\n    label.set_shape([])\n    return data, label\n\ndef make_dataset(file_list, shuffle=True):\n    ds = tf.data.Dataset.from_tensor_slices(file_list)\n    if shuffle:\n        ds = ds.shuffle(10000, reshuffle_each_iteration=True)\n    ds = ds.map(tf_load_sample, num_parallel_calls=4)\n    ds = ds.batch(BATCH_SIZE, drop_remainder=False)\n    ds = ds.prefetch(2)\n    return ds\n\ntrain_ds = make_dataset(train_files, shuffle=True)\nval_ds = make_dataset(val_files, shuffle=False)\n\n# Strateji olmadan direkt model\ninputs = tf.keras.Input(shape=(NUM_FRAMES, NUM_FEATURES))\nx = tf.keras.layers.Dense(256, activation='swish')(inputs)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Dropout(0.3)(x)\nx = tf.keras.layers.Conv1D(256, kernel_size=3, padding='same', activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Conv1D(128, kernel_size=3, padding='same', activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.GlobalAveragePooling1D()(x)\nx = tf.keras.layers.Dense(256, activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Dropout(0.4)(x)\noutputs = tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')(x)\n\nmodel = tf.keras.Model(inputs, outputs)\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n    loss='sparse_categorical_crossentropy',\n    metrics=['accuracy']\n)\n\ncallbacks = [\n    tf.keras.callbacks.EarlyStopping(monitor='val_accuracy', patience=12, restore_best_weights=True),\n    tf.keras.callbacks.ModelCheckpoint('siject_conv1d_final.keras', save_best_only=True, monitor='val_accuracy'),\n    tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-5, verbose=1)\n]\n\nprint(\"\\n--- TEK GPU İLE EĞİTİM BAŞLIYOR ---\")\nhistory = model.fit(\n    train_ds,\n    validation_data=val_ds,\n    epochs=100,\n    callbacks=callbacks\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T19:10:36.669844Z","iopub.execute_input":"2026-05-06T19:10:36.670535Z","iopub.status.idle":"2026-05-06T21:55:06.354806Z","shell.execute_reply.started":"2026-05-06T19:10:36.670500Z","shell.execute_reply":"2026-05-06T21:55:06.354135Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\n\nmodel = tf.keras.models.load_model('/kaggle/working/siject_conv1d_final.keras')\n\nconverter = tf.lite.TFLiteConverter.from_keras_model(model)\nconverter.optimizations = [tf.lite.Optimize.DEFAULT]\ntflite_model = converter.convert()\n\nwith open('/kaggle/working/asl_model_final.tflite', 'wb') as f:\n    f.write(tflite_model)\n\nprint(f\"BAŞARILI! Boyut: {len(tflite_model) / 1024:.1f} KB\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T22:14:15.018780Z","iopub.execute_input":"2026-05-06T22:14:15.019364Z","iopub.status.idle":"2026-05-06T22:14:16.516877Z","shell.execute_reply.started":"2026-05-06T22:14:15.019331Z","shell.execute_reply":"2026-05-06T22:14:16.516101Z"}},"outputs":[],"execution_count":null}]}