{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":5048,"databundleVersionId":868335,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#  Import required libraries\nimport os\nimport random\nimport shutil\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom tensorflow.keras.applications import MobileNetV2\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.optimizers import Adam","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T15:45:22.521416Z","iopub.execute_input":"2025-08-03T15:45:22.521594Z","iopub.status.idle":"2025-08-03T15:45:44.268738Z","shell.execute_reply.started":"2025-08-03T15:45:22.521576Z","shell.execute_reply":"2025-08-03T15:45:44.267903Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  Function to create training/testing folders and move images\ndef prepare_data(base_input_path, base_output_path, train_ratio=0.8):\n    labels = [f'c{i}' for i in range(10)]\n    for label in labels:\n        input_folder = os.path.join(base_input_path, label)\n        images = os.listdir(input_folder)\n        random.shuffle(images)\n        split_point = int(len(images) * train_ratio)\n\n        # Create class folders for train and test\n        train_class_dir = os.path.join(base_output_path, 'training', label)\n        test_class_dir = os.path.join(base_output_path, 'testing', label)\n        os.makedirs(train_class_dir, exist_ok=True)\n        os.makedirs(test_class_dir, exist_ok=True)\n\n        for i, image in enumerate(images):\n            src_path = os.path.join(input_folder, image)\n            if i < split_point:\n                dest_path = os.path.join(train_class_dir, image)\n            else:\n                dest_path = os.path.join(test_class_dir, image)\n            shutil.copy(src_path, dest_path)\n\n# 🚀 Prepare data (run once)\nprepare_data(\n    base_input_path=\"/kaggle/input/state-farm-distracted-driver-detection/imgs/train\",\n    base_output_path=\"/kaggle/working/master_data\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T15:46:06.184097Z","iopub.execute_input":"2025-08-03T15:46:06.184687Z","iopub.status.idle":"2025-08-03T15:49:37.238719Z","shell.execute_reply.started":"2025-08-03T15:46:06.184645Z","shell.execute_reply":"2025-08-03T15:49:37.238153Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 🔄 Load data using ImageDataGenerator\ntrain_path = \"/kaggle/working/master_data/training\"\ntest_path = \"/kaggle/working/master_data/testing\"\n\ntrain_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(\n    train_path, target_size=(224, 224), batch_size=32, class_mode='categorical'\n)\ntest_generator = test_datagen.flow_from_directory(\n    test_path, target_size=(224, 224), batch_size=32, class_mode='categorical'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T15:49:48.937778Z","iopub.execute_input":"2025-08-03T15:49:48.938087Z","iopub.status.idle":"2025-08-03T15:49:49.284979Z","shell.execute_reply.started":"2025-08-03T15:49:48.938059Z","shell.execute_reply":"2025-08-03T15:49:49.284410Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  Build transfer learning model using MobileNetV2\ndef build_model():\n    base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3))\n    base_model.trainable = False  # Freeze the base model\n\n    x = base_model.output\n    x = GlobalAveragePooling2D()(x)\n    x = Dropout(0.3)(x)\n    x = Dense(128, activation='relu')(x)\n    predictions = Dense(10, activation='softmax')(x)\n\n    model = Model(inputs=base_model.input, outputs=predictions)\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    return model\n\nmodel = build_model()\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T15:49:55.733951Z","iopub.execute_input":"2025-08-03T15:49:55.734605Z","iopub.status.idle":"2025-08-03T15:50:00.335749Z","shell.execute_reply.started":"2025-08-03T15:49:55.734584Z","shell.execute_reply":"2025-08-03T15:50:00.335149Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  EarlyStopping to avoid overfitting\nearly_stop = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\n\n# 🔧 Train model\nhistory = model.fit(\n    train_generator,\n    validation_data=test_generator,\n    epochs=10,\n    callbacks=[early_stop]\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T15:50:12.148890Z","iopub.execute_input":"2025-08-03T15:50:12.149618Z","iopub.status.idle":"2025-08-03T15:59:15.493468Z","shell.execute_reply.started":"2025-08-03T15:50:12.149592Z","shell.execute_reply":"2025-08-03T15:59:15.492740Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  Unfreeze top layers for fine-tuning\nmodel.layers[0].trainable = True  # Unfreeze base model\n\n# Recompile with lower learning rate\nmodel.compile(optimizer=Adam(1e-5), loss='categorical_crossentropy', metrics=['accuracy'])\n\n#  Retrain\nfine_tune_history = model.fit(\n    train_generator,\n    validation_data=test_generator,\n    epochs=5,\n    callbacks=[early_stop]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T15:59:36.066351Z","iopub.execute_input":"2025-08-03T15:59:36.067092Z","iopub.status.idle":"2025-08-03T16:04:07.562958Z","shell.execute_reply.started":"2025-08-03T15:59:36.067069Z","shell.execute_reply":"2025-08-03T16:04:07.562360Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  Save model\nmodel.save(\"driver_distraction_model.h5\")\nprint(\"Model saved.\")\n\n#  Plot training performance\nplt.plot(history.history['accuracy'], label='Train Acc')\nplt.plot(history.history['val_accuracy'], label='Val Acc')\nplt.plot(fine_tune_history.history['accuracy'], label='Fine-tune Acc')\nplt.plot(fine_tune_history.history['val_accuracy'], label='Fine-tune Val Acc')\nplt.title(\"Model Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T16:06:44.866956Z","iopub.execute_input":"2025-08-03T16:06:44.867243Z","iopub.status.idle":"2025-08-03T16:06:45.335984Z","shell.execute_reply.started":"2025-08-03T16:06:44.867200Z","shell.execute_reply":"2025-08-03T16:06:45.335254Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load trained model\nmodel = load_model('driver_distraction_model.h5')\nprint(\"model loaded\")\n\n# Path to test images\ntest_path = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/test\"\ntest_images = os.listdir(test_path)\n\n# Collect rows in a list\nsubmission_rows = []\n\n# Process each image\nfor img_name in test_images:\n    print(\"haha\")\n    img_path = os.path.join(test_path, img_name)\n    \n    # Load and preprocess image\n    img = load_img(img_path, target_size=(224, 224))\n    img_array = img_to_array(img) / 255.0\n    img_array = np.expand_dims(img_array, axis=0)\n    \n    # Predict probabilities\n    preds = model.predict(img_array, verbose=0)[0]\n    \n    # Create row dictionary\n    row = {'img': img_name}\n    for i in range(10):\n        row[f'c{i}'] = preds[i]\n    submission_rows.append(row)\n\n# Convert to DataFrame\nsubmission = pd.DataFrame(submission_rows)\n\n# Save to CSV\nsubmission.to_csv('submission.csv', index=False)\nprint(\"✅ submission.csv generated successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T16:16:05.249684Z","iopub.execute_input":"2025-08-03T16:16:05.250279Z","iopub.status.idle":"2025-08-03T18:22:49.079859Z","shell.execute_reply.started":"2025-08-03T16:16:05.250253Z","shell.execute_reply":"2025-08-03T18:22:49.079241Z"}},"outputs":[],"execution_count":null}]}