{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Libraries","metadata":{"id":"HQQ8_RFdvcn8"}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nimport os\nimport random","metadata":{"id":"VMsfneaFvgs2","outputId":"10dd3062-9fe6-4432-bcf6-ae9e6e7bc201","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Data","metadata":{"id":"dcDvFclrBhuN"}},{"cell_type":"code","source":"fig, ax = plt.subplots(nrows=10, ncols=10, figsize=(20, 20))\n\ntrain_dir = '/kaggle/input/state-farm-distracted-driver-detection/imgs/train/'\nlabels = [f'c{i}' for i in range(10)]\n\nfor i, label in enumerate(labels):\n  sample = os.listdir(train_dir+label)[:10]\n  for j, img in enumerate(sample):\n    img_path = train_dir+label+'/'+img\n    img = cv2.imread(img_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    ax[i, j].imshow(img)\n    ax[i, j].set_xticks([])\n    ax[i, j].set_yticks([])\n\n    if j == 0 :\n      ax[i, j].set_ylabel(label, fontsize=20)\n\nfig.suptitle('10 samples for each class', fontsize=30)\nplt.tight_layout()        ","metadata":{"id":"iKRzj1u0Cbws","outputId":"ce1db857-fb87-48fc-c7ed-5ee9ab43163d","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{"id":"5CmoNISBEWDj"}},{"cell_type":"code","source":"evaluation_df = pd.DataFrame()\nmodels_dict = {}","metadata":{"id":"jw-cY3ATnAwX","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ETL Pipeline for Baseline models","metadata":{"id":"m2u_qGiMEcSh"}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_dir = '/kaggle/input/state-farm-distracted-driver-detection/imgs/train'\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255, \n    validation_split=.2\n)\n\ntrain_generator = train_datagen.flow_from_directory(\n    directory=train_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    class_mode='categorical',\n    subset='training'\n)\n\nvalidation_generator = train_datagen.flow_from_directory(\n    directory=train_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    class_mode='categorical',\n    subset='validation'\n)","metadata":{"id":"iTitGYkOEfGa","outputId":"d07518aa-ec7d-489a-cf3c-520c4945b5cd","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Baseline Dense layers model","metadata":{"id":"UD2d4_SGNm-H"}},{"cell_type":"code","source":"from keras import models\nfrom keras import layers\n\nmodel = models.Sequential()\n\nmodel.add(layers.Flatten(input_shape=(256, 256, 3)))\nmodel.add(layers.Dense(512, activation='relu', name='layer_1'))\nmodel.add(layers.Dense(256, activation='relu', name='layer_2'))\nmodel.add(layers.Dense(128, activation='relu', name='layer_3'))\nmodel.add(layers.Dense(10, activation='softmax'))","metadata":{"id":"su8jyF1cMXWi","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"outputId":"bed38e7f-ba46-43e4-b9d9-1b0a33103949","id":"XyOBKENfMXWi","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import plot_model\n\nplot_model(model)","metadata":{"outputId":"59b5050a-7008-4d54-b1c5-7221bfda160d","id":"YBcnzznFMXWj","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"id":"VXLlhTD-MXWj","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n      train_generator,\n      epochs=10,\n      validation_data=validation_generator)","metadata":{"outputId":"75ca5cb1-9491-4e9e-8b95-5f7f8a1749f5","id":"EX2zOR1fMXWj","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Train VS Validation","metadata":{"id":"VvXvqmZGMXWj"}},{"cell_type":"code","source":"accuracy = history.history['accuracy']\nloss = history.history['loss']\n\nval_accuracy = history.history['val_accuracy']\nval_loss = history.history['val_loss']\n\nplt.plot(loss, label='Training loss')\nplt.plot(val_loss, label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()\n\nplt.plot(accuracy, label='Training accuracy')\nplt.plot(val_accuracy, label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.show()","metadata":{"outputId":"668fb15a-31cb-41c3-8c69-794342ec2f5d","id":"SHAEZVIPMXWj","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save model","metadata":{"id":"1rktH3VmMXWk"}},{"cell_type":"code","source":"model.save('/kaggle/working/Distracted_Driver_Detection_baseline_dense.h5')","metadata":{"id":"T2F-e4tVMXWk","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save Performace","metadata":{"id":"vnRDQhQJnZGE"}},{"cell_type":"code","source":"model_name = 'Dense Baseline'\nmodels_dict[model_name] = '/kaggle/working/Distracted_Driver_Detection_baseline_dense.h5'\n\ntrain_loss, train_accuracy = model.evaluate(train_generator)\nvalidation_loss, validation_accuracy = model.evaluate(validation_generator)\n\nevaluation = pd.DataFrame({\n                          'Model' : [model_name],\n                          'Train' : [train_accuracy],\n                          'Validation' : [validation_accuracy]\n                        })\n\nevaluation_df = pd.concat([evaluation_df, evaluation], ignore_index=True)","metadata":{"id":"0uBEbGB7ncJ9","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Baseline CNN model","metadata":{"id":"dNsDFZjhhM5Y"}},{"cell_type":"code","source":"from keras import models\nfrom keras import layers\n\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, (3, 3),  activation='relu',\n                        input_shape=(256, 256, 3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3),  activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Flatten())\n# model.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(512, activation='relu'))#, kernel_regularizer=regularizers.l2(0.001), activation='relu'))\nmodel.add(layers.Dense(10, activation='softmax'))","metadata":{"id":"lyZWQkKKQC6h","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"OyqbIqKDQjdq","outputId":"fd6484f7-2491-45a6-91c4-322a376bdda2","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import plot_model\n\nplot_model(model)","metadata":{"id":"364vHDCIQjyk","outputId":"35424250-c71e-4b75-fd4b-c8181adf10a5","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"id":"2B9esit4QTgc","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n      train_generator,\n      epochs=10,\n      validation_data=validation_generator)","metadata":{"id":"gdkd6HI1aWKw","outputId":"e2ba583f-e399-4659-cec7-9dc26b9c0111","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Train VS Validation","metadata":{"id":"M828iIL9pdS6"}},{"cell_type":"code","source":"accuracy = history.history['accuracy']\nloss = history.history['loss']\n\nval_accuracy = history.history['val_accuracy']\nval_loss = history.history['val_loss']\n\nplt.plot(loss, label='Training loss')\nplt.plot(val_loss, label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()\n\nplt.plot(accuracy, label='Training accuracy')\nplt.plot(val_accuracy, label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.show()","metadata":{"id":"ay4h3sakpfmO","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save model","metadata":{"id":"32Zqtbuhn5ul"}},{"cell_type":"code","source":"model.save('/kaggle/working/MyDrive/Distracted_Driver_Detection_baseline_cnn.h5')","metadata":{"id":"oLI6oGNkn5Ad","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save Performace","metadata":{"id":"5j7_zTwrol7i"}},{"cell_type":"code","source":"model_name = 'CNN Baseline'\nmodels_dict[model_name] = '/kaggle/working/Distracted_Driver_Detection_baseline_cnn.h5'\n\ntrain_loss, train_accuracy = model.evaluate(train_generator)\nvalidation_loss, validation_accuracy = model.evaluate(validation_generator)\n\nevaluation = pd.DataFrame({\n                          'Model' : [model_name],\n                          'Train' : [train_accuracy],\n                          'Validation' : [validation_accuracy]\n                        })\n\nevaluation_df = pd.concat([evaluation_df, evaluation], ignore_index=True)","metadata":{"id":"AptQ3fVfol7j","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ETL Pipeline for data augmentation","metadata":{"id":"z_pWfGTKQuUz"}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_dir = '/kaggle/input/state-farm-distracted-driver-detection/imgs/train'\n\n# All images will be rescaled by 1./255\ntrain_datagen = ImageDataGenerator(rescale=1./255,\n                                   zoom_range=0.05,\n                                   width_shift_range=0.05,\n                                   height_shift_range=0.05,\n                                   shear_range=0.05, \n                                   fill_mode='nearest',\n                                   validation_split=.2)\n\n# validation should not be augmented !\nvalidation_datagen = ImageDataGenerator(rescale=1./255,\n                                   validation_split=.2)\n\ntrain_generator = train_datagen.flow_from_directory(\n    directory=train_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    class_mode='categorical',\n    subset='training',\n    seed=42\n)\n\nvalidation_generator = validation_datagen.flow_from_directory(\n    directory=train_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    class_mode='categorical',\n    subset='validation',\n    seed=42\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## CNN with Data augmentation","metadata":{"id":"wuOERfgyQbQ7"}},{"cell_type":"code","source":"from keras import models\nfrom keras import layers\n\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, (3, 3),  activation='relu',\n                        input_shape=(256, 256, 3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3),  activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Flatten())\n# model.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(512, activation='relu'))#, kernel_regularizer=regularizers.l2(0.001), activation='relu'))\nmodel.add(layers.Dense(10, activation='softmax'))","metadata":{"id":"Jt2sQeGEQbRE","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"mcONE3P_QbRF","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import plot_model\n\nplot_model(model)","metadata":{"id":"szvclCIAQbRF","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"id":"481CNNjGQbRF","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n      train_generator,\n      epochs=10,\n      validation_data=validation_generator)","metadata":{"id":"xO-bCiCwQbRF","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Train VS Validation","metadata":{"id":"28T5B7ENQbRF"}},{"cell_type":"code","source":"accuracy = history.history['accuracy']\nloss = history.history['loss']\n\nval_accuracy = history.history['val_accuracy']\nval_loss = history.history['val_loss']\n\nplt.plot(loss, label='Training loss')\nplt.plot(val_loss, label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()\n\nplt.plot(accuracy, label='Training accuracy')\nplt.plot(val_accuracy, label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.show()","metadata":{"id":"nVJxUv3dQbRG","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save model","metadata":{"id":"yxQQa6F7QbRG"}},{"cell_type":"code","source":"model.save('/kaggle/working/Distracted_Driver_Detection_cnn_data_augmentation.h5')","metadata":{"id":"wpGV-zYrQbRG","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save Performace","metadata":{"id":"rr8sojx2pNzs"}},{"cell_type":"code","source":"model_name = 'CNN & Data Augmentation'\nmodels_dict[model_name] = '/kaggle/working/Distracted_Driver_Detection_cnn_data_augmentation.h5'\n\ntrain_loss, train_accuracy = model.evaluate(train_generator)\nvalidation_loss, validation_accuracy = model.evaluate(validation_generator)\n\nevaluation = pd.DataFrame({\n                          'Model' : [model_name],\n                          'Train' : [train_accuracy],\n                          'Validation' : [validation_accuracy]\n                        })\n\nevaluation_df = pd.concat([evaluation_df, evaluation], ignore_index=True)","metadata":{"id":"Jg-AsRzfpNz1","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ETL Pipeline for Transfer Learning","metadata":{"id":"5bzJOFpgSIHk"}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.imagenet_utils import preprocess_input\n\ntrain_dir = '/kaggle/input/state-farm-distracted-driver-detection/imgs/train'\n\ntrain_datagen = ImageDataGenerator(\n                                   preprocessing_function=preprocess_input,\n                                   zoom_range=0.05,\n                                   width_shift_range=0.05,\n                                   height_shift_range=0.05,\n                                   shear_range=0.05, \n                                   fill_mode='nearest',\n                                   validation_split=.2)\n\n# validation should not be augmented !\nvalidation_datagen = ImageDataGenerator(\n                                        preprocessing_function=preprocess_input,\n                                        validation_split=.2)\n\ntrain_generator = train_datagen.flow_from_directory(\n    directory=train_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    class_mode='categorical',\n    subset='training',\n    seed=42\n)\n\nvalidation_generator = validation_datagen.flow_from_directory(\n    directory=train_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    class_mode='categorical',\n    subset='validation',\n    seed=42\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Transfer Learning","metadata":{"id":"-RbE7zOVJAss"}},{"cell_type":"code","source":"from keras.applications import VGG16\n\nconv_base = VGG16(weights='imagenet',\n                  include_top = False,\n                  input_shape=(256, 256, 3))\n\nconv_base.trainable = False","metadata":{"id":"h2-QZmqKTQkA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conv_base.summary()","metadata":{"id":"VIElyS4VUnne","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import models\nfrom keras import layers\n\nmodel = models.Sequential()\nmodel.add(conv_base)\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(256, activation='relu'))\nmodel.add(layers.Dense(10, activation='softmax'))","metadata":{"id":"RuHDMyydUuS9","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"A9vVQd9huZX6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])","metadata":{"id":"JLJlIcJZyY99","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n      train_generator,\n      epochs=10,\n      validation_data=validation_generator,\n      )","metadata":{"id":"bp3xVNo5yPzd","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Train VS Validation","metadata":{"id":"O5T4XxZiygux"}},{"cell_type":"code","source":"accuracy = history.history['accuracy']\nloss = history.history['loss']\n\nval_accuracy = history.history['val_accuracy']\nval_loss = history.history['val_loss']\n\nplt.plot(loss, label='Training loss')\nplt.plot(val_loss, label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()\n\nplt.plot(accuracy, label='Training accuracy')\nplt.plot(val_accuracy, label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.show()","metadata":{"id":"NFrewmonygux","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save model","metadata":{"id":"aTcGRNe-ygux"}},{"cell_type":"code","source":"model.save('/kaggle/working/Distracted_Driver_Detection_transfer_learning.h5')","metadata":{"id":"lvAiAh5sygux","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save Performace","metadata":{"id":"TmRWnaWPpcoQ"}},{"cell_type":"code","source":"model_name = 'Transfer-Learning'\nmodels_dict[model_name] = '/kaggle/working/Distracted_Driver_Detection_transfer_learning.h5'\n\ntrain_loss, train_accuracy = model.evaluate(train_generator)\nvalidation_loss, validation_accuracy = model.evaluate(validation_generator)\n\nevaluation = pd.DataFrame({\n                          'Model' : [model_name],\n                          'Train' : [train_accuracy],\n                          'Validation' : [validation_accuracy]\n                        })\n\nevaluation_df = pd.concat([evaluation_df, evaluation], ignore_index=True)","metadata":{"id":"JYOIj1P6pcoQ","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Fine-tuning","metadata":{"id":"hpAdE_7NQlyr"}},{"cell_type":"code","source":"from keras.applications import VGG16\n\nconv_base = VGG16(weights='imagenet',\n                  include_top = False,\n                  input_shape=(256, 256, 3))\n\nconv_base.trainable = False","metadata":{"id":"DWR5bGifQlyz","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conv_base.summary()","metadata":{"id":"0KmKwxJ9Qlyz","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import models\nfrom keras import layers\n\nmodel = models.Sequential()\nmodel.add(conv_base)\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(256, activation='relu'))\nmodel.add(layers.Dense(10, activation='softmax'))","metadata":{"id":"fV0vmVkXQly0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"jrH7DqjVQly0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])","metadata":{"id":"RbniHcqoQly0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n      train_generator,\n      epochs=5,\n      validation_data=validation_generator)","metadata":{"id":"nsKLBTlAQly0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conv_base.trainable = True\n\nfor layer in conv_base.layers:\n    if layer.name == 'block5_conv1':\n      break\n    else:\n        layer.trainable = False","metadata":{"id":"uM1qWddjQ5NQ","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"R7PsDVDb1L3L","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n      train_generator,\n      epochs=10,\n      validation_data=validation_generator)","metadata":{"id":"SAx8h05j1Doo","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Train VS Validation","metadata":{"id":"Rii1iinUQly2"}},{"cell_type":"code","source":"accuracy = history.history['accuracy']\nloss = history.history['loss']\n\nval_accuracy = history.history['val_accuracy']\nval_loss = history.history['val_loss']\n\nplt.plot(loss, label='Training loss')\nplt.plot(val_loss, label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()\n\nplt.plot(accuracy, label='Training accuracy')\nplt.plot(val_accuracy, label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.show()","metadata":{"id":"paUVZXKKQly2","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save model","metadata":{"id":"-3W_tWWsQly3"}},{"cell_type":"code","source":"model.save('/kaggle/working/Distracted_Driver_Detection_fine_tuning.h5')","metadata":{"id":"UZPLZdNfQly3","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Save Performace","metadata":{"id":"GO27sXhsp994"}},{"cell_type":"code","source":"model_name = 'Fine-Tuning'\nmodels_dict[model_name] = '/kaggle/working/Distracted_Driver_Detection_fine_tuning.h5'\n\ntrain_loss, train_accuracy = model.evaluate(train_generator)\nvalidation_loss, validation_accuracy = model.evaluate(validation_generator)\n\nevaluation = pd.DataFrame({\n                          'Model' : [model_name],\n                          'Train' : [train_accuracy],\n                          'Validation' : [validation_accuracy]\n                        })\n\nevaluation_df = pd.concat([evaluation_df, evaluation], ignore_index=True)","metadata":{"id":"SFcAsLnRp995","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluation","metadata":{"id":"44UdkpfCfSA0"}},{"cell_type":"code","source":"evaluation_df","metadata":{"id":"Fh8-sEc2lFvC","outputId":"25c62d7b-bfda-41d0-fee3-ba3261b1ac9d","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.models import load_model\n# Get best model according to validation score\nbest_model = evaluation_df[evaluation_df['Validation'] == evaluation_df['Validation'].max()]['Model'].values[0]\nmodel = load_model(models_dict[best_model])","metadata":{"id":"xYwGvwrXqSRN","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission File Generation","metadata":{"id":"fSJUAnKNhQI9"}},{"cell_type":"markdown","source":"### Utility Functions","metadata":{"id":"xfra_EvOqyFJ"}},{"cell_type":"code","source":"def preprocess(images, rescale=1./255):\n  \"\"\"\n  Takes numpy array.\n    Args:\n      rescale: rescaling factor. Defaults to None. If None or 0, no rescaling\n        is applied, otherwise we multiply the data by the value provided\n        (after applying all other transformations).\n\n  Returns:\n      A numpy array\n  \"\"\"\n\n  # apply the pre-processing that utilized during training.\n  if rescale and rescale != 0 :\n    images = images*rescale\n  \n  return images ","metadata":{"id":"cBlbgA7OT6iQ","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def test_flow_from_directory(directory, batch_size=32, target_size=(256, 256), preprocess_input=None, shuffle=False):\n#   \"\"\"\n#   Takes the path to a directory & generates batches.\n#     Args:\n#       directory: string, path to the target directory. \n#       batch_size: Size of the batches of data (default: 32).\n#       target_size: Tuple of integers `(height, width)`, The dimensions to which all images found will be resized,\n#         defaults to `None`.\n#       rescale: rescaling factor. Defaults to None. If None or 0, no rescaling\n#         is applied, otherwise we multiply the data by the value provided\n#         (after applying all other transformations).\n#       shuffle: Whether to shuffle the data (default: True).\n#       preprocess_input: the pre-processing function that utilized during training.\n\n#   Returns:\n#       A numpy array containing a batch of images with shape\n#       `(batch_size, *target_size, channels)`\n#   \"\"\"\n\n\n#   file_names = os.listdir(directory)\n#   if shuffle:\n#     random.shuffle(file_names)\n\n#   for i in range(len(file_names)+1//batch_size):\n\n#     # get batch \n#     start = i * batch_size\n#     end = (i+1) * batch_size\n#     batch_file_names = file_names[start:end]\n#     batch_file_names_path = list(map(lambda name: directory+'/'+name, batch_file_names))\n\n#     # read image in BGR format\n#     images = np.array(list(map(lambda file: cv2.imread(file), batch_file_names_path)))\n    \n#     # convert image to RGB format\n#     images = np.array(list(map(lambda img: cv2.cvtColor(img, cv2.COLOR_BGR2RGB), images)))\n\n#     # pre-processing \n#     if preprocess_input:\n#       images = np.array(list(map(lambda x: cv2.resize(x, target_size), images)))\n#       images = preprocess_input(images)\n    \n#     yield batch_file_names, images","metadata":{"id":"qeQplyuAipOF","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Inference using manual test generator (test_flow_from_directory)","metadata":{"id":"ybmDuBePq3EO"}},{"cell_type":"code","source":"# from keras.applications.imagenet_utils import preprocess_input\n\n# # Get the pre-processing function that utilized during training.\n# if best_model in('Fine-Tuning', 'Transfer-Learning'):\n#     preprocess_function = preprocess_input\n# else:\n#     preprocess_function = preprocess","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission_df = pd.DataFrame()\n\n# test_dir = '/kaggle/input/state-farm-distracted-driver-detection/imgs/test'\n\n# for batch_file_names, images in (test_flow_from_directory(test_dir,\n#                                                           preprocess_input=preprocess_function)):\n#   # model predictions\n#   predictions = model.predict(images, verbose=0)\n  \n#   # concat image file name with its prediction\n#   arr = np.array([[batch_file_names[i]] + predictions.tolist()[i] for i in range(len(predictions))])\n  \n#   # appned image file name with its prediction as a record in dataframe\n#   submission_df = pd.concat((submission_df, pd.DataFrame(arr)))","metadata":{"id":"98eMu4lnhfyB","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"get columns names from sample_submission csv and assign it to our dataframe","metadata":{"id":"OTXX_IQQLsp7"}},{"cell_type":"code","source":"# sample_submission_df = pd.read_csv('/kaggle/input/state-farm-distracted-driver-detection/sample_submission.csv')\n\n# submission_df.columns = sample_submission_df.columns\n# submission_df.columns","metadata":{"id":"9ORGusadJKkj","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission_df.head()","metadata":{"id":"YhjvrAKyL3Ci","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission_df.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Inference using built-in test_generator","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.imagenet_utils import preprocess_input\n\n# Get the pre-processing function that utilized during training.\nif best_model in('Fine-Tuning', 'Transfer-Learning'):\n    preprocess_function = preprocess_input\nelse:\n    preprocess_function = preprocess\n\ntest_dir = '/kaggle/input/state-farm-distracted-driver-detection/imgs/'\n\ntest_datagen = ImageDataGenerator(preprocessing_function=preprocess_function)\n\ntest_generator = test_datagen.flow_from_directory(\n    directory=test_dir,\n    target_size=(256, 256),\n    batch_size = 32,\n    classes=['test'],\n    class_mode=None,\n    shuffle=False\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"file_names = sorted(os.listdir(test_dir+'test'))\nlen(file_names)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(test_generator, verbose=0)\npredictions.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.DataFrame()\n\n# concat image file name with its prediction\narr = np.array([[file_names[i]] + predictions.tolist()[i] for i in range(len(predictions))])\n\n# appned image file name with its prediction as a record in dataframe\nsubmission_df = pd.concat((submission_df, pd.DataFrame(arr)))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission_df = pd.read_csv('/kaggle/input/state-farm-distracted-driver-detection/sample_submission.csv')\nsubmission_df.columns = sample_submission_df.columns\nsubmission_df.columns","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}