{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":5048,"databundleVersionId":868335,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import warnings \nwarnings.filterwarnings('ignore')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport random\nimport numpy as np\nimport pandas as pd \nfrom skimage import io\nfrom skimage import color\nfrom PIL import Image\nimport PIL.Image\nfrom IPython.display import display\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom dask.array.image import imread\nfrom dask import bag, threaded\nfrom dask.diagnostics import ProgressBar\nimport cv2\nfrom sklearn.model_selection import train_test_split\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n\nfrom keras import backend as K\nfrom keras.layers import Dense, Activation\nfrom keras.optimizers import Adam\nfrom keras.metrics import categorical_crossentropy\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications import imagenet_utils\nfrom keras.layers import Dense,GlobalAveragePooling2D\nfrom keras.applications import MobileNet\nfrom keras.applications.mobilenet import preprocess_input\nfrom IPython.display import Image\n\n\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten,Input\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.utils import to_categorical\nfrom keras.preprocessing import image \nfrom keras.layers import BatchNormalization\nfrom keras.applications.vgg16 import VGG16, preprocess_input\nfrom keras.models import Model\nfrom keras import optimizers\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nos.getcwd()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"driver_details = pd.read_csv('/kaggle/input/state-farm-distracted-driver-detection/driver_imgs_list.csv',na_values='na')\nprint(driver_details.head(5))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Getting all the images\n\ntrain_image = []\nimage_label = []\n\n\nfor i in range(10):\n    print('now we are in the folder C',i)\n    imgs = os.listdir(\"/kaggle/input/state-farm-distracted-driver-detection/imgs/train/c\"+str(i))\n    for j in range(len(imgs)):\n    #for j in range(100):\n        img_name = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/train/c\"+str(i)+\"/\"+imgs[j]\n        img = cv2.imread(img_name)\n        #img = color.rgb2gray(img)\n        img = img[50:,120:-50]\n        img = cv2.resize(img,(224,224))\n        label = i\n        driver = driver_details[driver_details['img'] == imgs[j]]['subject'].values[0]\n        train_image.append([img,label,driver])\n        image_label.append(i)\n\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Randomly shuffling the images\n\nimport random\nrandom.shuffle(train_image)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ## getting list of driver names\n\n# D = []\n# for features,labels,drivers in train_image:\n#     D.append(drivers)\n\n# ## Deduplicating drivers\n\n# deduped = []\n\n# for i in D:\n#     if i not in deduped:\n#         deduped.append(i)\n    \n\n# ## selecting random drivers for the validation set\n# driv_selected = []\n# import random\n# driv_nums = random.sample(range(len(deduped)), 4)\n# for i in driv_nums:\n#     driv_selected.append(deduped[i])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"driv_selected = ['p050', 'p015', 'p022', 'p056']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Splitting the train and test\n\nX_train= []\ny_train = []\nX_test = []\ny_test = []\nD_train = []\nD_test = []\n\nfor features,labels,drivers in train_image:\n    if drivers in driv_selected:\n        X_test.append(features)\n        y_test.append(labels)\n        D_test.append(drivers)\n    \n    else:\n        X_train.append(features)\n        y_train.append(labels)\n        D_train.append(drivers)\n    \nprint (len(X_train),len(X_test))\nprint (len(y_train),len(y_test))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Converting images to nparray. Encoding the Y\n\nX_train = np.array(X_train).reshape(-1,224,224,3)\nX_test = np.array(X_test).reshape(-1,224,224,3)\ny_train = to_categorical(y_train)\ny_test = to_categorical(y_test)\n\n\nprint (X_train.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"base_model=MobileNet(weights='imagenet',include_top=False) #imports the mobilenet model and discards the last 1000 neuron layer.\n# base_model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x=base_model.output\nx=GlobalAveragePooling2D()(x)\n\nx=Dense(1024,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.\n\nx = Dropout(0.1)(x) # ****reduce dropout \n\nx=Dense(1024,activation='relu')(x) #dense layer 2\n\nx = BatchNormalization()(x)\nx = Dropout(0.5)(x)\n\nx=Dense(512,activation='relu')(x) #dense layer 3\n\npreds=Dense(10,activation='softmax')(x) #final layer with softmax activation\n\nmodel = Model(inputs=base_model.input, outputs=preds)\n\nmodel.summary()","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for layer in model.layers:\n#     layer.trainable=False\n# # or if we want to set the first 20 layers of the network to be non-trainable\n# for layer in model.layers[:20]:\n#     layer.trainable=False\n# for layer in model.layers[20:]:\n#     layer.trainable=True","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import optimizers  \n\n#adam = optimizers.Adam(lr=0.001) #tried 0.0005 - too slow and didn't converge\nsgd = optimizers.SGD(learning_rate = 0.005) # try 0.01 - didn't converge and 0.005 , 0.001 best acc of 11%\n\nmodel.compile(optimizer=sgd,loss='categorical_crossentropy',metrics=['accuracy']) # create object\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ModelCheckpoint,EarlyStopping\n\ncheckpointer = ModelCheckpoint('/kaggle/working/mobilenet_sgd_nolayers.keras', verbose=1, save_best_only=True)\nearlystopper = EarlyStopping(monitor='val_loss', patience=10, verbose=1)\n\ndatagen = ImageDataGenerator(\n    height_shift_range=0.5,\n    width_shift_range = 0.5,\n    zoom_range = 0.5,\n    rotation_range=30\n        )\n#datagen.fit(X_train)\ndata_generator = datagen.flow(X_train, y_train, batch_size = 64)\n\n# Fits the model on batches with real-time data augmentation:\nmobilenet_model = model.fit(data_generator,steps_per_epoch = int(len(X_train) / 64), callbacks=[checkpointer, earlystopper],\n                                                            epochs = 25, verbose = 1, validation_data = (X_test, y_test))\n","metadata":{"execution":{"iopub.status.idle":"2024-04-21T12:56:15.362099Z","shell.execute_reply.started":"2024-04-21T12:26:43.063869Z","shell.execute_reply":"2024-04-21T12:56:15.361020Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(1, 2, figsize = (10, 5))\naxes[0].plot(range(1, len(model.history.history['accuracy']) + 1), model.history.history['accuracy'], linestyle = 'solid', marker = 'o', color = 'crimson', label = 'Training Accuracy')\naxes[0].plot(range(1, len(model.history.history['val_accuracy']) + 1), model.history.history['val_accuracy'], linestyle = 'solid', marker = 'o', color = 'dodgerblue', label = 'Testing Accuracy')\naxes[0].set_xlabel('Epochs', fontsize = 14)\naxes[0].set_ylabel('Accuracy',fontsize = 14)\naxes[0].set_title('CNN Dropout Accuracy Trainig VS Testing', fontsize = 14)\naxes[0].legend(loc = 'best')\naxes[1].plot(range(1, len(model.history.history['loss']) + 1), model.history.history['loss'], linestyle = 'solid', marker = 'o', color = 'crimson', label = 'Training Loss')\naxes[1].plot(range(1, len(model.history.history['val_loss']) + 1), model.history.history['val_loss'], linestyle = 'solid', marker = 'o', color = 'dodgerblue', label = 'Testing Loss')\naxes[1].set_xlabel('Epochs', fontsize = 14)\naxes[1].set_ylabel('Loss',fontsize = 14)\naxes[1].set_title('CNN Dropout Loss Trainig VS Testing', fontsize = 14)\naxes[1].legend(loc = 'best')","metadata":{"execution":{"iopub.status.busy":"2024-04-21T12:56:15.363625Z","iopub.execute_input":"2024-04-21T12:56:15.363926Z","iopub.status.idle":"2024-04-21T12:56:15.957599Z","shell.execute_reply.started":"2024-04-21T12:56:15.363902Z","shell.execute_reply":"2024-04-21T12:56:15.956602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# TEST","metadata":{}},{"cell_type":"code","source":"# labels is the image array\ntest_image = []\ni = 0\nfig, ax = plt.subplots(1, 20, figsize = (50,50 ))\n\nfolder_path = os.listdir('/kaggle/input/state-farm-distracted-driver-detection/imgs/test')\n#nums = np.random.randint(low=1, high=len(files), size=20)\nfor img in folder_paths:\n    path = os.path.join(folder_path, img)\n\n    img = cv2.imread(path)\n    #img = color.rgb2gray(img)\n    img = img[50:,120:-50]\n    img = cv2.resize(img,(224,224))\n    test_image.append(img)\n#         ax[i].imshow(img,cmap = 'gray')\n#         plt.show\n","metadata":{"execution":{"iopub.status.busy":"2024-04-21T13:32:14.026317Z","iopub.execute_input":"2024-04-21T13:32:14.027052Z","iopub.status.idle":"2024-04-21T13:32:17.389678Z","shell.execute_reply.started":"2024-04-21T13:32:14.027019Z","shell.execute_reply":"2024-04-21T13:32:17.388351Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = []\n\nfor img in test_image:\n    test.append(img)\n    \nmodel.load_weights('mobilenet_sgd_nolayers.hdf5')\n\n\ntest = np.array(test).reshape(-1,224,224,3)\nprediction = model.predict(test)","metadata":{"execution":{"iopub.status.busy":"2024-04-21T12:56:20.080726Z","iopub.status.idle":"2024-04-21T12:56:20.081170Z","shell.execute_reply.started":"2024-04-21T12:56:20.080942Z","shell.execute_reply":"2024-04-21T12:56:20.080961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction[0]","metadata":{"execution":{"iopub.status.busy":"2024-04-21T12:56:20.082727Z","iopub.status.idle":"2024-04-21T12:56:20.083086Z","shell.execute_reply.started":"2024-04-21T12:56:20.082916Z","shell.execute_reply":"2024-04-21T12:56:20.082931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tags = { \"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\" }","metadata":{"execution":{"iopub.status.busy":"2024-04-21T12:56:20.084400Z","iopub.status.idle":"2024-04-21T12:56:20.084755Z","shell.execute_reply.started":"2024-04-21T12:56:20.084581Z","shell.execute_reply":"2024-04-21T12:56:20.084596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# labels is the image array\ni = 0\nfig, ax = plt.subplots(20, 1, figsize = (100,100))\n\nfor i in range(20):\n    ax[i].imshow(test[i].squeeze())\n    predicted_class = 'C'+str(np.where(prediction[i] == np.amax(prediction[i]))[0][0])\n    ax[i].set_title(tags[predicted_class])\n    plt.show\n    \n","metadata":{"execution":{"iopub.status.busy":"2024-04-21T12:56:20.086560Z","iopub.status.idle":"2024-04-21T12:56:20.086907Z","shell.execute_reply.started":"2024-04-21T12:56:20.086741Z","shell.execute_reply":"2024-04-21T12:56:20.086756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}