{"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":"none","dataSources":[{"sourceId":5048,"databundleVersionId":868335,"sourceType":"competition"}],"dockerImageVersionId":30626,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         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","execution":{"iopub.status.busy":"2024-05-06T16:39:06.756873Z","iopub.execute_input":"2024-05-06T16:39:06.757335Z","iopub.status.idle":"2024-05-06T16:39:06.763400Z","shell.execute_reply.started":"2024-05-06T16:39:06.757301Z","shell.execute_reply":"2024-05-06T16:39:06.762136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfrom glob import glob\nimport random\nimport time\nimport tensorflow as tf\nimport datetime\nos.environ['KERAS_BACKEND'] = 'tensorflow'\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 3 = INFO, WARNING, and ERROR messages are not printed\n\nfrom tqdm import tqdm\n\nimport numpy as np\nimport pandas as pd\nfrom IPython.display import FileLink\nimport matplotlib.pyplot as plt\nimport warnings\nwarnings.filterwarnings('ignore')\nimport seaborn as sns \n%matplotlib inline\nfrom IPython.display import display, Image\nimport matplotlib.image as mpimg\nimport cv2\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.datasets import load_files       \nfrom sklearn.utils import shuffle\nfrom sklearn.metrics import log_loss\n\nfrom keras.models import Sequential, Model\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization, GlobalAveragePooling2D\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.preprocessing import image\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping\nfrom keras.applications.vgg16 import VGG16\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.applications import (\n    VGG19,\n    InceptionResNetV2,\n#     NasNetLarge,\n    EfficientNetB7,\n    DenseNet201,\n    ResNet152,\n    MobileNetV3Large,\n)\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.applications.vgg19 import preprocess_input\nfrom tensorflow.keras.applications.inception_resnet_v2 import preprocess_input as preprocess_inception_resnet\nfrom tensorflow.keras.applications.nasnet import preprocess_input as preprocess_nasnet\nfrom tensorflow.keras.applications.efficientnet import preprocess_input as preprocess_efficientnet\nfrom tensorflow.keras.applications.densenet import preprocess_input as preprocess_densenet\nfrom tensorflow.keras.applications.resnet import preprocess_input as preprocess_resnet\nfrom tensorflow.keras.applications.mobilenet_v3 import preprocess_input as preprocess_mobilenet\nimport numpy as np\n","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:21:38.488686Z","iopub.execute_input":"2024-05-07T08:21:38.488954Z","iopub.status.idle":"2024-05-07T08:21:52.376200Z","shell.execute_reply.started":"2024-05-07T08:21:38.488929Z","shell.execute_reply":"2024-05-07T08:21:52.375266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv('/kaggle/input/state-farm-distracted-driver-detection/driver_imgs_list.csv')\nby_drivers = data.groupby('subject')\nunique_drivers = by_drivers.groups.keys()\nprint(len(unique_drivers))","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:22:01.486954Z","iopub.execute_input":"2024-05-07T08:22:01.488040Z","iopub.status.idle":"2024-05-07T08:22:01.567967Z","shell.execute_reply.started":"2024-05-07T08:22:01.488003Z","shell.execute_reply":"2024-05-07T08:22:01.567039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## reading the image using open cv\ndef get_cv2_image(path, img_rows, img_cols, color_type=3):\n    # Loading as Grayscale image\n    if color_type == 1:\n        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)\n    elif color_type == 3:\n        img = cv2.imread(path, cv2.IMREAD_COLOR)\n    # Reduce size\n    img = cv2.resize(img, (img_rows, img_cols)) \n    return img","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:22:05.893189Z","iopub.execute_input":"2024-05-07T08:22:05.894072Z","iopub.status.idle":"2024-05-07T08:22:05.899359Z","shell.execute_reply.started":"2024-05-07T08:22:05.894040Z","shell.execute_reply":"2024-05-07T08:22:05.898387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"directory_path = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/train/c\"+str(i)\nprint(directory_path)","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:22:09.018803Z","iopub.execute_input":"2024-05-07T08:22:09.019678Z","iopub.status.idle":"2024-05-07T08:22:09.786708Z","shell.execute_reply.started":"2024-05-07T08:22:09.019628Z","shell.execute_reply":"2024-05-07T08:22:09.785000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#/kaggle/input/state-farm-distracted-driver-detection/imgs/train\n## collecting the train data in classwise\n\n## /kaggle/input/state-farm-distracted-driver-detection/imgs/train/c0/img_100026.jpg\nno_of_classes=10\nimg_rows = 64\nimg_cols = 64\ntrain_images=[]\ntrain_labels=[]\nfor i in range(10):\n    directory_path = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/train/c\"+str(i)\n    file_list = os.listdir(directory_path)\n    for filename in file_list:\n        full_path = os.path.join(directory_path, filename)\n        img = get_cv2_image(full_path, img_rows, img_cols, 3)\n        train_images.append(img)\n        train_labels.append(i)       ","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:22:13.706219Z","iopub.execute_input":"2024-05-07T08:22:13.706675Z","iopub.status.idle":"2024-05-07T08:26:20.522213Z","shell.execute_reply.started":"2024-05-07T08:22:13.706632Z","shell.execute_reply":"2024-05-07T08:26:20.521204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y = tf.keras.utils.to_categorical(train_labels, 10)\nx_train, x_test, y_train, y_test = train_test_split(train_images, y, test_size=0.2, random_state=42)\n\nx_train = np.array(x_train, dtype=np.uint8).reshape(-1,img_rows,img_cols,3)\nx_test = np.array(x_test, dtype=np.uint8).reshape(-1,img_rows,img_cols,3)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:44:28.939965Z","iopub.execute_input":"2024-05-07T08:44:28.940728Z","iopub.status.idle":"2024-05-07T08:44:29.066336Z","shell.execute_reply.started":"2024-05-07T08:44:28.940693Z","shell.execute_reply":"2024-05-07T08:44:29.065483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.shape","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:44:31.674916Z","iopub.execute_input":"2024-05-07T08:44:31.675266Z","iopub.status.idle":"2024-05-07T08:44:31.681920Z","shell.execute_reply.started":"2024-05-07T08:44:31.675241Z","shell.execute_reply":"2024-05-07T08:44:31.681007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image = cv2.imread('/kaggle/input/state-farm-distracted-driver-detection/imgs/train/c0/img_100026.jpg')\nplt.subplot(1, 2, 1)\nplt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))\nprint(image.shape)","metadata":{"execution":{"iopub.status.busy":"2024-05-06T16:42:16.116428Z","iopub.execute_input":"2024-05-06T16:42:16.117195Z","iopub.status.idle":"2024-05-06T16:42:16.487808Z","shell.execute_reply.started":"2024-05-06T16:42:16.117161Z","shell.execute_reply":"2024-05-06T16:42:16.486904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n# Plot figure size\nplt.figure(figsize = (5,5))\n# Count the number of images per category\nsns.countplot(x = 'classname', data = data)\n# Change the Axis names\nplt.ylabel('Count')\nplt.title('Categories Distribution')\n# Show plot\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-06T16:42:16.489272Z","iopub.execute_input":"2024-05-06T16:42:16.489891Z","iopub.status.idle":"2024-05-06T16:42:16.757149Z","shell.execute_reply.started":"2024-05-06T16:42:16.489859Z","shell.execute_reply":"2024-05-06T16:42:16.755976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_model_v1():\n    # Vanilla CNN model\n    model = Sequential()\n\n    model.add(Conv2D(filters = 64, kernel_size = 3, padding='same', activation = 'relu', input_shape=(img_rows, img_cols, 3)))\n    model.add(MaxPooling2D(pool_size = 2))\n\n    model.add(Conv2D(filters = 128, padding='same', kernel_size = 3, activation = 'relu'))\n    model.add(MaxPooling2D(pool_size = 2))\n\n    model.add(Conv2D(filters = 256, padding='same', kernel_size = 3, activation = 'relu'))\n    model.add(MaxPooling2D(pool_size = 2))\n\n    model.add(Conv2D(filters = 512, padding='same', kernel_size = 3, activation = 'relu'))\n    model.add(MaxPooling2D(pool_size = 2))\n\n    model.add(Dropout(0.5))\n\n    model.add(Flatten())\n\n    model.add(Dense(500, activation = 'relu'))\n    model.add(Dropout(0.5))\n    model.add(Dense(10, activation = 'softmax'))\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:44:36.579893Z","iopub.execute_input":"2024-05-07T08:44:36.580629Z","iopub.status.idle":"2024-05-07T08:44:36.588726Z","shell.execute_reply.started":"2024-05-07T08:44:36.580594Z","shell.execute_reply":"2024-05-07T08:44:36.587584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_v1 = create_model_v1()\n\n# More details about the layers\nmodel_v1.summary()\n\n# Compiling the model\nmodel_v1.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:44:51.804760Z","iopub.execute_input":"2024-05-07T08:44:51.805109Z","iopub.status.idle":"2024-05-07T08:44:53.268299Z","shell.execute_reply.started":"2024-05-07T08:44:51.805082Z","shell.execute_reply":"2024-05-07T08:44:53.267306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpointer = ModelCheckpoint(filepath='saved_models/weights_best_vanilla.hdf5', \n                               monitor='val_loss', mode='min',\n                               verbose=1, save_best_only=True)\nes = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=2)\ncallbacks = [checkpointer, es]","metadata":{"execution":{"iopub.status.busy":"2024-05-06T16:42:17.159970Z","iopub.execute_input":"2024-05-06T16:42:17.160329Z","iopub.status.idle":"2024-05-06T16:42:17.165768Z","shell.execute_reply.started":"2024-05-06T16:42:17.160297Z","shell.execute_reply":"2024-05-06T16:42:17.164670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Training the Vanilla Model version 1\nbatch_size = 40\nnb_epoch = 10\nmodel_v1.fit(x_train, y_train, \nvalidation_data=(x_test, y_test),\nepochs=nb_epoch, batch_size=batch_size, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:45:03.073930Z","iopub.execute_input":"2024-05-07T08:45:03.075009Z","iopub.status.idle":"2024-05-07T08:46:36.182217Z","shell.execute_reply.started":"2024-05-07T08:45:03.074962Z","shell.execute_reply":"2024-05-07T08:46:36.181362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"score = model_v1.evaluate(x_test, y_test, verbose=1)\nprint('Score: ', score)","metadata":{"execution":{"iopub.status.busy":"2024-05-06T16:44:45.699009Z","iopub.status.idle":"2024-05-06T16:44:45.700273Z","shell.execute_reply.started":"2024-05-06T16:44:45.699898Z","shell.execute_reply":"2024-05-06T16:44:45.699924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Prepare data augmentation configuration\ntrain_datagen = ImageDataGenerator(rescale = 1.0/255, \n                                   shear_range = 0.2, \n                                   zoom_range = 0.2, \n                                   horizontal_flip = True, \n                                   validation_split = 0.2)\n\ntest_datagen = ImageDataGenerator(rescale=1.0/ 255, validation_split = 0.2)\ntraining_generator = train_datagen.flow(x_train, y_train, batch_size=batch_size)\nvalidation_generator = test_datagen.flow(x_test, y_test, batch_size=batch_size)","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:46:40.638109Z","iopub.execute_input":"2024-05-07T08:46:40.638853Z","iopub.status.idle":"2024-05-07T08:46:40.903995Z","shell.execute_reply.started":"2024-05-07T08:46:40.638820Z","shell.execute_reply":"2024-05-07T08:46:40.903204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***VGG Network***","metadata":{}},{"cell_type":"code","source":"def vgg_std16_model(img_rows, img_cols, color_type=3):\n    nb_classes = 10\n    # Remove fully connected layer and replace\n    # with softmax for classifying 10 classes\n    vgg16_model = VGG16(weights=\"imagenet\", include_top=False)\n\n    # Freeze all layers of the pre-trained model\n    for layer in vgg16_model.layers:\n        layer.trainable = False\n        \n    x = vgg16_model.output\n    x = GlobalAveragePooling2D()(x)\n    x = Dense(1024, activation='relu')(x)\n    predictions = Dense(nb_classes, activation = 'softmax')(x)\n\n    model = Model(inputs = vgg16_model.input, outputs = predictions)\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:46:44.517101Z","iopub.execute_input":"2024-05-07T08:46:44.517505Z","iopub.status.idle":"2024-05-07T08:46:44.524477Z","shell.execute_reply.started":"2024-05-07T08:46:44.517472Z","shell.execute_reply":"2024-05-07T08:46:44.523503Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the VGG16 network\nprint(\"Loading network...\")\nmodel_vgg16 = vgg_std16_model(img_rows, img_cols)\n\nmodel_vgg16.summary()\n\nmodel_vgg16.compile(loss='categorical_crossentropy',\n                         optimizer='rmsprop',\n                         metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:46:47.529162Z","iopub.execute_input":"2024-05-07T08:46:47.530012Z","iopub.status.idle":"2024-05-07T08:46:48.348269Z","shell.execute_reply.started":"2024-05-07T08:46:47.529975Z","shell.execute_reply":"2024-05-07T08:46:48.347386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##/kaggle/input/state-farm-distracted-driver-detection/imgs/train\ntraining_generator = train_datagen.flow_from_directory('../input/state-farm-distracted-driver-detection/imgs/train', \n                                                 target_size = (img_rows, img_cols), \n                                                 batch_size = batch_size,\n                                                 shuffle=True,\n                                                 class_mode='categorical', subset=\"training\")\n\nvalidation_generator = test_datagen.flow_from_directory('../input/state-farm-distracted-driver-detection/imgs/train', \n                                                   target_size = (img_rows, img_cols), \n                                                   batch_size = batch_size,\n                                                   shuffle=False,\n                                                   class_mode='categorical', subset=\"validation\")\nnb_train_samples = 17943\nnb_validation_samples = 4481","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:46:54.563855Z","iopub.execute_input":"2024-05-07T08:46:54.564220Z","iopub.status.idle":"2024-05-07T08:47:10.872749Z","shell.execute_reply.started":"2024-05-07T08:46:54.564189Z","shell.execute_reply":"2024-05-07T08:47:10.871984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_vgg16.fit_generator(training_generator,\n                         steps_per_epoch = nb_train_samples // batch_size,\n                         epochs = 5, \n                         verbose = 1,\n                         validation_data = validation_generator,\n                         validation_steps = nb_validation_samples // batch_size)","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:47:10.874128Z","iopub.execute_input":"2024-05-07T08:47:10.874444Z","iopub.status.idle":"2024-05-07T08:53:30.738059Z","shell.execute_reply.started":"2024-05-07T08:47:10.874419Z","shell.execute_reply":"2024-05-07T08:53:30.737232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_model(base_model, num_classes):\n    # Freeze the layers of the base model\n    base_model.trainable = False\n\n    # Create the model\n    model = Sequential([\n        base_model,\n        layers.GlobalAveragePooling2D(),  # Global pooling layer\n        layers.Dropout(0.2),  # Dropout layer to prevent overfitting\n        layers.Dense(num_classes, activation='softmax')  # Output layer for classification\n    ])\n\n    return model\n","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:54:48.945656Z","iopub.execute_input":"2024-05-07T08:54:48.946535Z","iopub.status.idle":"2024-05-07T08:54:48.952186Z","shell.execute_reply.started":"2024-05-07T08:54:48.946493Z","shell.execute_reply":"2024-05-07T08:54:48.951182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Example number of classes (change as needed)\nnum_classes = 10\n\n# Create models with different base architectures\nvgg19_model = create_model(VGG19(input_shape=(64, 64, 3), include_top=False), num_classes)\n# inception_resnet_model = create_model(InceptionResNetV2(input_shape=(64, 64, 3), include_top=False), num_classes)\n# nasnet_model = create_model(NasNetLarge(input_shape=(331, 331, 3), include_top=False), num_classes)\nefficientnet_model = create_model(EfficientNetB7(input_shape=(64, 64, 3), include_top=False), num_classes)\ndensenet_model = create_model(DenseNet201(input_shape=(64, 64, 3), include_top=False), num_classes)\nresnet_model = create_model(ResNet152(input_shape=(64, 64, 3), include_top=False), num_classes)\nmobilenet_model = create_model(MobileNetV3Large(input_shape=(64, 64, 3), include_top=False), num_classes)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:59:03.690647Z","iopub.execute_input":"2024-05-07T08:59:03.691009Z","iopub.status.idle":"2024-05-07T08:59:31.105489Z","shell.execute_reply.started":"2024-05-07T08:59:03.690981Z","shell.execute_reply":"2024-05-07T08:59:31.104636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Example data preparation\nbatch_size = 32\n\n# Compile and train the model\nvgg19_model.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)\n\nvgg19_model.fit(\n    training_generator,\n    epochs=10,  # Adjust as needed\n    steps_per_epoch=len(training_generator),\n    verbose=1\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-07T08:59:55.362693Z","iopub.execute_input":"2024-05-07T08:59:55.363040Z","iopub.status.idle":"2024-05-07T09:09:22.897908Z","shell.execute_reply.started":"2024-05-07T08:59:55.363015Z","shell.execute_reply":"2024-05-07T09:09:22.896031Z"},"trusted":true},"execution_count":null,"outputs":[]}]}