{"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":"## Reading Data","metadata":{}},{"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)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-07T12:50:27.165013Z","iopub.execute_input":"2023-01-07T12:50:27.165583Z","iopub.status.idle":"2023-01-07T12:50:27.198381Z","shell.execute_reply.started":"2023-01-07T12:50:27.165467Z","shell.execute_reply":"2023-01-07T12:50:27.19745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/state-farm-distracted-driver-detection/driver_imgs_list.csv')\ndf = df.sample(frac=1)\ndf\n# i think subject is of no use in prediction ,\n# the task done by 1 person can be equally well done by any other person","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:50:36.553632Z","iopub.execute_input":"2023-01-07T12:50:36.554056Z","iopub.status.idle":"2023-01-07T12:50:36.620196Z","shell.execute_reply.started":"2023-01-07T12:50:36.553999Z","shell.execute_reply":"2023-01-07T12:50:36.619378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# mapping classname to int labels\ndicti = {'c4': 0, 'c8': 1, 'c0': 2, 'c5': 3, 'c9': 4, 'c6': 5, 'c2': 6, 'c3': 7, 'c1': 8, 'c7': 9}","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:50:40.713782Z","iopub.execute_input":"2023-01-07T12:50:40.714158Z","iopub.status.idle":"2023-01-07T12:50:40.720542Z","shell.execute_reply.started":"2023-01-07T12:50:40.714125Z","shell.execute_reply":"2023-01-07T12:50:40.718063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"reverse_dict = {0:'c4', 1:'c8', 2:'c0', 3:'c5', 4:'c9', 5:'c6', 6:'c2', 7:'c3', 8:'c1', 9:'c7'}","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:50:45.056961Z","iopub.execute_input":"2023-01-07T12:50:45.057744Z","iopub.status.idle":"2023-01-07T12:50:45.063003Z","shell.execute_reply.started":"2023-01-07T12:50:45.057707Z","shell.execute_reply":"2023-01-07T12:50:45.061914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# mapping classname to their meaning for plotting images\n\nclass_names = {\n    'c0': 'safe driving' ,\n    'c1': 'texting - right',\n    'c2': 'talking on the phone - right' ,\n    'c3': 'texting - left' ,\n    'c4': 'talking on the phone - left' ,\n    'c5': 'operating the radio',\n    'c6': 'drinking',\n    'c7': 'reaching behind',\n    'c8': 'hair and makeup',\n    'c9': 'talking to passenger' \n}\n\n","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:50:49.483817Z","iopub.execute_input":"2023-01-07T12:50:49.484196Z","iopub.status.idle":"2023-01-07T12:50:49.489597Z","shell.execute_reply.started":"2023-01-07T12:50:49.484164Z","shell.execute_reply":"2023-01-07T12:50:49.488429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Adding New col in df (paths, int_labels)","metadata":{}},{"cell_type":"code","source":"# adding img_path , labels to pass df into ImageDataGenerator\n\nimport os\n\ntrain_images = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/train\"\n\nfile_names = []\nlabels = []\nfor i in range(len(df)):\n  path = os.path.join(train_images , df[\"classname\"].iloc[i] , df[\"img\"].iloc[i])\n  labels.append(dicti[df[\"classname\"].iloc[i]])\n  file_names.append(path)\n\ndf[\"filename\"] = file_names \ndf[\"labels\"] = labels\ndf","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:50:54.235971Z","iopub.execute_input":"2023-01-07T12:50:54.236341Z","iopub.status.idle":"2023-01-07T12:50:54.924033Z","shell.execute_reply.started":"2023-01-07T12:50:54.236309Z","shell.execute_reply":"2023-01-07T12:50:54.923088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plotting random images","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport os\n\n\nplt.figure(figsize=(20, 20))\nfor i in range (49):\n\n # path = os.path.join('/content/imgs/train' ,df[\"classname\"].iloc[i] ,df[\"img\"].iloc[i] )\n  arr = plt.imread(df[\"filename\"].iloc[i])\n\n  plt.subplot(7, 7, i + 1)\n  plt.xticks([])\n  plt.yticks([])\n  plt.grid(False)\n  label_index = df[\"classname\"].iloc[i]\n  plt.title(class_names[label_index])\n  plt.imshow(arr)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:50:59.015038Z","iopub.execute_input":"2023-01-07T12:50:59.015404Z","iopub.status.idle":"2023-01-07T12:51:03.659596Z","shell.execute_reply.started":"2023-01-07T12:50:59.015371Z","shell.execute_reply":"2023-01-07T12:51:03.658207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Splitting data into train ,val_data","metadata":{}},{"cell_type":"code","source":"# Splitting data into train ,validation\n\nsize = df.shape[0]\ndf_train = df.iloc[:size - int(0.2*size)]\ndf_val = df.iloc[size - int(0.2*size):]\n\nprint(\"train_size: \" ,df_train.shape)\nprint(\"val_size: \" ,df_val.shape)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:51:25.21216Z","iopub.execute_input":"2023-01-07T12:51:25.213144Z","iopub.status.idle":"2023-01-07T12:51:25.220806Z","shell.execute_reply.started":"2023-01-07T12:51:25.213095Z","shell.execute_reply":"2023-01-07T12:51:25.219691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating data from images","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator   # convert into vector\n\ntrain_data_gen = ImageDataGenerator(rescale=1/255 ,rotation_range = 5, shear_range = 0.02,zoom_range = 0.02,\n                                         samplewise_center=True, samplewise_std_normalization= True)\ntrain_generator = train_data_gen.flow_from_dataframe(\n                                                     df_train ,\n                                                     target_size = (64,64),\n                                                     x_col = \"filename\", \n                                                     y_col = \"labels\" ,\n                                                     shuffle = True ,\n                                                     class_mode = 'raw',\n                                                     batch_size = 128\n                                                    )\n\ntest_data_gen = ImageDataGenerator(rescale=1/255 ,rotation_range = 5, shear_range = 0.02,zoom_range = 0.02,\n                                         samplewise_center=True, samplewise_std_normalization= True)\ntest_generator = test_data_gen.flow_from_dataframe(\n                                                     df_val ,\n                                                     target_size = (64,64),\n                                                     x_col = \"filename\" ,\n                                                     y_col = \"labels\" ,\n                                                     shuffle = True ,\n                                                     class_mode = 'raw',\n                                                     batch_size = 128\n                                                    )\n","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:51:28.785642Z","iopub.execute_input":"2023-01-07T12:51:28.786903Z","iopub.status.idle":"2023-01-07T12:52:26.710774Z","shell.execute_reply.started":"2023-01-07T12:51:28.786864Z","shell.execute_reply":"2023-01-07T12:52:26.709721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x,y = next(train_generator)\nprint(type(x))\nprint(type(y))\nprint(x.shape)\nprint(y.shape)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:52:41.228568Z","iopub.execute_input":"2023-01-07T12:52:41.229269Z","iopub.status.idle":"2023-01-07T12:52:42.577109Z","shell.execute_reply.started":"2023-01-07T12:52:41.229232Z","shell.execute_reply":"2023-01-07T12:52:42.576081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Architecture of CNN","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.layers import Conv2D ,MaxPooling2D , Dense ,Flatten\nfrom tensorflow.keras.layers import BatchNormalization\nfrom keras.layers.core import Activation\nfrom keras.models import Sequential\nfrom keras.layers import Dropout\n\n","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:52:46.959868Z","iopub.execute_input":"2023-01-07T12:52:46.960812Z","iopub.status.idle":"2023-01-07T12:52:46.969001Z","shell.execute_reply.started":"2023-01-07T12:52:46.960772Z","shell.execute_reply":"2023-01-07T12:52:46.967705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# CONV->RELU->DROP.\n\nbase_model = Sequential()\nbase_model.add(Conv2D(32, (3, 3), padding=\"same\",input_shape = (64 , 64 , 3)))\nbase_model.add(Activation(\"relu\"))\nbase_model.add(Dropout(0.1))\nbase_model.add(BatchNormalization(axis=1))\n\nbase_model.add(MaxPooling2D(pool_size=(3, 3)))\n\nbase_model.add(Conv2D(64, (3, 3), padding=\"same\"))\nbase_model.add(Activation(\"relu\"))\nbase_model.add(Dropout(0.1))\nbase_model.add(BatchNormalization(axis=1))\n\nbase_model.add(Conv2D(64, (3, 3), padding=\"same\"))\nbase_model.add(Activation(\"relu\"))\nbase_model.add(BatchNormalization(axis=1))\nbase_model.add(MaxPooling2D(pool_size=(2, 2)))\n\nbase_model.add(Conv2D(128, (3, 3), padding=\"same\"))\nbase_model.add(Activation(\"relu\"))\nbase_model.add(Dropout(0.1))\nbase_model.add(BatchNormalization(axis=1))\n\nbase_model.add(Conv2D(128, (3, 3), padding=\"same\"))\nbase_model.add(Activation(\"relu\"))\nbase_model.add(BatchNormalization(axis=1))\nbase_model.add(MaxPooling2D(pool_size=(2, 2)))\n\nbase_model.add(Flatten())\n\nbase_model.add(Dense(1024))\nbase_model.add(Activation(\"relu\"))\nbase_model.add(Dropout(0.5))\nbase_model.add(BatchNormalization())\n\nbase_model.add(Dense(10))\nbase_model.add(Activation(\"softmax\"))\n\nbase_model.build((0,128,128,3))\nbase_model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:52:50.150625Z","iopub.execute_input":"2023-01-07T12:52:50.151114Z","iopub.status.idle":"2023-01-07T12:52:54.19744Z","shell.execute_reply.started":"2023-01-07T12:52:50.151072Z","shell.execute_reply":"2023-01-07T12:52:54.196421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.keras.utils.plot_model(\n    base_model, to_file='model.png'\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:53:01.549064Z","iopub.execute_input":"2023-01-07T12:53:01.549434Z","iopub.status.idle":"2023-01-07T12:53:02.687623Z","shell.execute_reply.started":"2023-01-07T12:53:01.549403Z","shell.execute_reply":"2023-01-07T12:53:02.686418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# call_backs\nfrom keras.callbacks import ReduceLROnPlateau\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='accuracy',\n                                            patience = 2,\n                                            verbose=1,\n                                            factor=0.1,\n                                            min_lr=0.000001)\n\nes = EarlyStopping(monitor= 'val_acc' ,patience=4 ,min_delta=0.001)\n\ncall_backs = []\ncall_backs.append(learning_rate_reduction)\ncall_backs.append(es)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:53:09.743622Z","iopub.execute_input":"2023-01-07T12:53:09.745059Z","iopub.status.idle":"2023-01-07T12:53:09.753696Z","shell.execute_reply.started":"2023-01-07T12:53:09.745Z","shell.execute_reply":"2023-01-07T12:53:09.752382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model_Fitting","metadata":{}},{"cell_type":"code","source":"\nopti = tf.keras.optimizers.Adam(learning_rate=0.0001)\n\n\nbase_model.compile(optimizer = opti, loss='sparse_categorical_crossentropy', metrics=['accuracy'])\nhistory = base_model.fit(train_generator,validation_data = test_generator, epochs = 7,callbacks=call_backs)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T12:53:17.641877Z","iopub.execute_input":"2023-01-07T12:53:17.642647Z","iopub.status.idle":"2023-01-07T13:12:08.200013Z","shell.execute_reply.started":"2023-01-07T12:53:17.642608Z","shell.execute_reply":"2023-01-07T13:12:08.198851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plot The history of the training Process","metadata":{}},{"cell_type":"code","source":"from matplotlib import pyplot\n\n# plot loss during training\npyplot.subplot(211)\npyplot.title('Loss')\npyplot.plot(history.history['loss'], label='train')\npyplot.plot(history.history['val_loss'], label='test')\npyplot.legend()\n\n# plot accuracy during training\npyplot.subplot(212)\npyplot.title('Accuracy')\npyplot.plot(history.history['accuracy'], label='train')\npyplot.plot(history.history['val_accuracy'], label='test')\npyplot.legend()\npyplot.show()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T13:15:05.280965Z","iopub.execute_input":"2023-01-07T13:15:05.282045Z","iopub.status.idle":"2023-01-07T13:15:05.590764Z","shell.execute_reply.started":"2023-01-07T13:15:05.281978Z","shell.execute_reply":"2023-01-07T13:15:05.589871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predicting label for train_image using model","metadata":{}},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\npath = '/kaggle/input/state-farm-distracted-driver-detection/imgs/train/c0/img_100026.jpg'\nimg = plt.imread(path)\nplt.imshow(img)\n\nplt.show()\nprint(\"img_shape :\",img.shape)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T13:15:10.787965Z","iopub.execute_input":"2023-01-07T13:15:10.78891Z","iopub.status.idle":"2023-01-07T13:15:11.066494Z","shell.execute_reply.started":"2023-01-07T13:15:10.788871Z","shell.execute_reply":"2023-01-07T13:15:11.06549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\n\nimg = cv2.resize(img, (64, 64))\nplt.imshow(img)\n\nprint(\"Reducing image pixels -->\")\nplt.show()\nimg = img.reshape(1,64,64,3)\nprint(\"img_shape :\" ,img.shape)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T13:15:15.121907Z","iopub.execute_input":"2023-01-07T13:15:15.122622Z","iopub.status.idle":"2023-01-07T13:15:15.592213Z","shell.execute_reply.started":"2023-01-07T13:15:15.122585Z","shell.execute_reply":"2023-01-07T13:15:15.591207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = base_model.predict(img/255)\nc = reverse_dict[np.argmax(y_pred)]\n\ny_true = df.loc[df['filename'] == path , 'classname'].item()\n\nprint('y_pred :' ,c , '   y_true :' ,y_true)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T13:15:18.930465Z","iopub.execute_input":"2023-01-07T13:15:18.931174Z","iopub.status.idle":"2023-01-07T13:15:19.250529Z","shell.execute_reply.started":"2023-01-07T13:15:18.931138Z","shell.execute_reply":"2023-01-07T13:15:19.249438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(y_pred)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T13:15:22.983957Z","iopub.execute_input":"2023-01-07T13:15:22.989077Z","iopub.status.idle":"2023-01-07T13:15:23.006243Z","shell.execute_reply.started":"2023-01-07T13:15:22.988956Z","shell.execute_reply":"2023-01-07T13:15:23.004153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Creating CSV of PREdictions from BaseModel","metadata":{}},{"cell_type":"code","source":"import csv\nfrom tensorflow.keras.preprocessing import image\n\ndirectory = '/kaggle/input/state-farm-distracted-driver-detection/imgs/test'\n\nheading = [ 'img' ,'c0', 'c1', 'c2','c3', 'c4','c5', 'c6', 'c7', 'c8', 'c9']\n\nwith open('Submission.csv', 'w', ) as myfile:\n    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)\n    wr.writerow(heading)\n    for filename in os.listdir(directory):\n        \n        path = os.path.join(directory, filename )\n        img = image.load_img(path, target_size=(64, 64))\n        img_array = image.img_to_array(img)\n        img_batch = np.expand_dims(img_array, axis=0)\n        \n        y_pred = base_model.predict(img_batch/255)\n\n        li = []\n        li.append(filename)\n        li2 = y_pred.tolist()\n        li += li2[0]\n        wr.writerow(li)\n\n    myfile.close()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T13:15:26.264773Z","iopub.execute_input":"2023-01-07T13:15:26.265153Z","iopub.status.idle":"2023-01-07T14:32:28.780514Z","shell.execute_reply.started":"2023-01-07T13:15:26.26512Z","shell.execute_reply":"2023-01-07T14:32:28.779492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.layers import Input, Add, Dense, Activation, ZeroPadding2D,GlobalAveragePooling2D","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:09:30.048963Z","iopub.execute_input":"2023-01-07T15:09:30.050072Z","iopub.status.idle":"2023-01-07T15:09:30.055651Z","shell.execute_reply.started":"2023-01-07T15:09:30.050002Z","shell.execute_reply":"2023-01-07T15:09:30.054695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"encoder_resnet50 = tf.keras.applications.ResNet50(include_top=False, weights=None, input_shape=(128,128 ,3)) \nnew_model = Sequential(name = 'encoder_resnet_50')\nnew_model.add(encoder_resnet50)\nnew_model.add(GlobalAveragePooling2D())\nnew_model.add(Dense(512))\nnew_model.add(Dense(256))\nnew_model.add(Dense(10, activation='softmax'))\nresnet50 = new_model\nresnet50.summary()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:09:48.463823Z","iopub.execute_input":"2023-01-07T15:09:48.464198Z","iopub.status.idle":"2023-01-07T15:09:49.759552Z","shell.execute_reply.started":"2023-01-07T15:09:48.464157Z","shell.execute_reply":"2023-01-07T15:09:49.758343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.keras.utils.plot_model(\n    resnet50, to_file='base_model.png'\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:09:54.01476Z","iopub.execute_input":"2023-01-07T15:09:54.015146Z","iopub.status.idle":"2023-01-07T15:09:54.230839Z","shell.execute_reply.started":"2023-01-07T15:09:54.015113Z","shell.execute_reply":"2023-01-07T15:09:54.229569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet50.compile(optimizer = opti, loss='sparse_categorical_crossentropy', metrics=['accuracy',])\nhistory = resnet50.fit(train_generator,validation_data = test_generator, epochs = 7,callbacks= call_backs)","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:09:58.87821Z","iopub.execute_input":"2023-01-07T15:09:58.878615Z","iopub.status.idle":"2023-01-07T15:28:14.299891Z","shell.execute_reply.started":"2023-01-07T15:09:58.878578Z","shell.execute_reply":"2023-01-07T15:28:14.29889Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib import pyplot\n\n# plot loss during training\npyplot.subplot(211)\npyplot.title('Loss')\npyplot.plot(history.history['loss'], label='train')\npyplot.plot(history.history['val_loss'], label='test')\npyplot.legend()\npyplot.show()\n\n# plot accuracy during training\npyplot.subplot(212)\npyplot.title('Accuracy')\npyplot.plot(history.history['accuracy'], label='train')\npyplot.plot(history.history['val_accuracy'], label='test')\npyplot.legend()\npyplot.show()","metadata":{"execution":{"iopub.status.busy":"2023-01-07T15:28:43.045449Z","iopub.execute_input":"2023-01-07T15:28:43.045812Z","iopub.status.idle":"2023-01-07T15:28:43.430714Z","shell.execute_reply.started":"2023-01-07T15:28:43.04578Z","shell.execute_reply":"2023-01-07T15:28:43.429799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}