{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-23T22:19:46.496806Z","iopub.execute_input":"2025-03-23T22:19:46.497140Z","execution_failed":"2025-03-23T22:24:43.849Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, ModelCheckpoint\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix, classification_report\n\n# Set parameters\nIMG_SIZE = (128, 128)  # Resize all images to 128x128\nBATCH_SIZE = 32\nEPOCHS = 10\nNUM_CLASSES = 10  # 10 driving behavior classes\n\n# Paths to dataset (modify as needed)\nTRAIN_DIR = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/train\"\nTEST_DIR = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/test\"\n\n# Data Augmentation for better generalization\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0/255,  \n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    validation_split=0.2  \n)\n\n# Load training and validation data\ntrain_generator = train_datagen.flow_from_directory(\n    TRAIN_DIR,\n    target_size=IMG_SIZE,\n    batch_size=BATCH_SIZE,\n    class_mode='categorical',\n    subset='training'\n)\n\nval_generator = train_datagen.flow_from_directory(\n    TRAIN_DIR,\n    target_size=IMG_SIZE,\n    batch_size=BATCH_SIZE,\n    class_mode='categorical',\n    subset='validation'\n)\n\n# Define CNN model\nmodel = Sequential([\n    Conv2D(32, (3,3), activation='relu', input_shape=(128, 128, 3)),\n    MaxPooling2D(2,2),\n    Conv2D(64, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    Conv2D(128, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    Flatten(),\n    Dense(512, activation='relu'),\n    Dropout(0.5),\n    Dense(NUM_CLASSES, activation='softmax')  \n])\n\n# Display model architecture\nmodel.summary()\n\n# Compile model\nmodel.compile(optimizer=Adam(learning_rate=0.001),\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\n\n# Define callbacks\nlr_reduction = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, verbose=1)\ncheckpoint = ModelCheckpoint(\"best_model.keras\", save_best_only=True, monitor=\"val_accuracy\", verbose=1)\n\n# Train model\nhistory = model.fit(train_generator, validation_data=val_generator, epochs=EPOCHS, callbacks=[lr_reduction, checkpoint])\n\n# Plot accuracy and loss graphs\ndef plot_training_history(history):\n    fig, ax = plt.subplots(1, 2, figsize=(12, 4))\n\n    # Accuracy plot\n    ax[0].plot(history.history['accuracy'], label='Train Accuracy')\n    ax[0].plot(history.history['val_accuracy'], label='Validation Accuracy')\n    ax[0].set_title('Model Accuracy')\n    ax[0].set_xlabel('Epochs')\n    ax[0].set_ylabel('Accuracy')\n    ax[0].legend()\n\n    # Loss plot\n    ax[1].plot(history.history['loss'], label='Train Loss')\n    ax[1].plot(history.history['val_loss'], label='Validation Loss')\n    ax[1].set_title('Model Loss')\n    ax[1].set_xlabel('Epochs')\n    ax[1].set_ylabel('Loss')\n    ax[1].legend()\n\n    plt.show()\n\nplot_training_history(history)\n\n# Load test data for predictions\ntest_datagen = ImageDataGenerator(rescale=1.0/255)\n\ntest_generator = None\nif os.path.isdir(TEST_DIR) and len(os.listdir(TEST_DIR)) > 0:  # Ensure test images exist\n    test_generator = test_datagen.flow_from_directory(\n        TEST_DIR,\n        target_size=IMG_SIZE,\n        batch_size=1,\n        class_mode=None,\n        shuffle=False  \n    )\nelse:\n    print(\"Test directory is empty or does not contain subdirectories.\")\n\nif test_generator:\n    # Predict probabilities for each test image\n    predictions = model.predict(test_generator)\n    filenames = test_generator.filenames\n\n    # Create submission DataFrame\n    submission_df = pd.DataFrame(predictions, columns=[f'c{i}' for i in range(NUM_CLASSES)])\n    submission_df.insert(0, 'img', [f.split('/')[-1] for f in filenames])\n\n    # Save to CSV\n    submission_df.to_csv('submission.csv', index=False)\n    print(\"Submission file saved as 'submission.csv'.\")\n\n# Evaluate model on validation data\nval_loss, val_acc = model.evaluate(val_generator)\nprint(f\"Validation Accuracy: {val_acc:.4f}\")\n\n# Confusion Matrix & Classification Report\ny_true = val_generator.classes\ny_pred = np.argmax(model.predict(val_generator), axis=1)\n\n# Plot Confusion Matrix\ncm = confusion_matrix(y_true, y_pred)\nplt.figure(figsize=(8, 6))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=val_generator.class_indices.keys(), yticklabels=val_generator.class_indices.keys())\nplt.xlabel('Predicted Label')\nplt.ylabel('True Label')\nplt.title('Confusion Matrix')\nplt.show()\n\n# Print classification report\nprint(classification_report(y_true, y_pred, target_names=val_generator.class_indices.keys()))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-22T08:29:22.819064Z","iopub.execute_input":"2025-03-22T08:29:22.821240Z","iopub.status.idle":"2025-03-22T09:55:47.559240Z","shell.execute_reply.started":"2025-03-22T08:29:22.821046Z","shell.execute_reply":"2025-03-22T09:55:47.556886Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D\nfrom tensorflow.keras.applications import DenseNet121\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, ModelCheckpoint, EarlyStopping, LearningRateScheduler\nfrom sklearn.utils.class_weight import compute_class_weight\nimport matplotlib.pyplot as plt\n\n# Set parameters\nIMG_SIZE = (128, 128)\nBATCH_SIZE = 32\nEPOCHS = 30  # Increased for better learning\nNUM_CLASSES = 10  # Driving behavior classes\n\n# Paths to dataset\nTRAIN_DIR = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/train\"\nTEST_DIR = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/test\"\n\n# Data Augmentation\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0/255,\n    rotation_range=30,\n    width_shift_range=0.3,\n    height_shift_range=0.3,\n    shear_range=0.3,\n    zoom_range=0.3,\n    brightness_range=[0.5, 1.5],\n    horizontal_flip=True,\n    fill_mode='nearest',\n    validation_split=0.2\n)\n\ntrain_generator = train_datagen.flow_from_directory(\n    TRAIN_DIR, target_size=IMG_SIZE, batch_size=BATCH_SIZE,\n    class_mode='categorical', subset='training'\n)\n\nval_generator = train_datagen.flow_from_directory(\n    TRAIN_DIR, target_size=IMG_SIZE, batch_size=BATCH_SIZE,\n    class_mode='categorical', subset='validation'\n)\n\n# Compute class weights to handle imbalance\nclass_weights = compute_class_weight('balanced', classes=np.unique(train_generator.classes), y=train_generator.classes)\nclass_weights = dict(enumerate(class_weights))\n\n# Load DenseNet121 as feature extractor\nbase_model = DenseNet121(weights='imagenet', include_top=False, input_shape=(128, 128, 3))\nbase_model.trainable = False  # Freeze base model initially\n\n# Define Model\nmodel = Sequential([\n    base_model,\n    GlobalAveragePooling2D(),\n    Dense(512, activation='relu'),\n    Dropout(0.5),\n    Dense(NUM_CLASSES, activation='softmax')\n])\n\n# Compile model\nmodel.compile(optimizer=Adam(learning_rate=1e-4),\n              loss=keras.losses.CategoricalCrossentropy(label_smoothing=0.1),\n              metrics=['accuracy'])\n\n# Callbacks\nlr_reduction = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, verbose=1)\nearly_stopping = EarlyStopping(monitor=\"val_loss\", patience=5, restore_best_weights=True)\nlr_scheduler = LearningRateScheduler(lambda epoch: 1e-4 * 0.1 ** (epoch // 10))\ncheckpoint = ModelCheckpoint(\"best_model.keras\", save_best_only=True, monitor=\"val_accuracy\", verbose=1)\n\n# Train model\nhistory = model.fit(\n    train_generator, validation_data=val_generator,\n    epochs=EPOCHS, class_weight=class_weights,\n    callbacks=[lr_reduction, checkpoint, early_stopping, lr_scheduler]\n)\n\n# Unfreeze top layers for fine-tuning\nbase_model.trainable = True\nmodel.compile(optimizer=Adam(learning_rate=1e-5),\n              loss=keras.losses.CategoricalCrossentropy(label_smoothing=0.1),\n              metrics=['accuracy'])\n\n# Fine-tune model\nhistory_fine = model.fit(\n    train_generator, validation_data=val_generator,\n    epochs=10, class_weight=class_weights,\n    callbacks=[lr_reduction, checkpoint, early_stopping, lr_scheduler]\n)\n\n# Evaluate model\nval_loss, val_acc = model.evaluate(val_generator)\nprint(f\"Final Validation Accuracy: {val_acc:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-28T10:06:50.270185Z","iopub.execute_input":"2025-03-28T10:06:50.270547Z"}},"outputs":[],"execution_count":null}]}