{"metadata":{"kernelspec":{"display_name":"R","language":"R","name":"ir"},"language_info":{"mimetype":"text/x-r-source","name":"R","pygments_lexer":"r","version":"3.4.2","file_extension":".r","codemirror_mode":"r"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"**Distratced Driving Detection using Keras in R**","metadata":{}},{"cell_type":"code","source":"#Load the libraries\nlibrary(tidyverse)\nlibrary(keras)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**List Files**","metadata":{}},{"cell_type":"code","source":"list.files(\"../input/state-farm-distracted-driver-detection\")\n\nlist.files('../input/state-farm-distracted-driver-detection/imgs/train')\n\nhead(list.files('../input/state-farm-distracted-driver-detection/imgs/test'))\n\nhead(read.csv('../input/state-farm-distracted-driver-detection/sample_submission.csv'))\n\nhead(read.csv('../input/state-farm-distracted-driver-detection/driver_imgs_list.csv'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Build Generators**","metadata":{}},{"cell_type":"code","source":"train_dir <- '../input/state-farm-distracted-driver-detection/imgs/train'\ntest_dir <- '../input/state-farm-distracted-driver-detection/imgs/test'\n\ntrain_datagen = image_data_generator(rescale = 1/255, data_format='channels_last', validation_split=.5)\ntest_datagen <- image_data_generator(rescale = 1/255, data_format='channels_last')  \n\ntrain_generator <- flow_images_from_directory(\n  train_dir,                  # Target directory  \n  train_datagen,              # Data generator\n  target_size = c(256, 256),  # Resizes all images\n  batch_size = 4,\n  class_mode = \"categorical\",       \n  subset='training'\n)\n\nvalidation_generator <- flow_images_from_directory(\n  train_dir,                  # Target directory  \n  train_datagen,              # Data generator\n  target_size = c(256, 256),  # Resizes all images\n  batch_size = 4,\n  class_mode = \"categorical\",       \n  subset='validation'\n)\n\ntest_generator <- flow_images_from_directory(\n  test_dir,                  # Target directory  \n  test_datagen,              # Data generator\n  target_size = c(256, 256),  # Resizes all images\n  batch_size = 4,\n  shuffle=FALSE,\n  class_mode = NULL\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"** Build Model**","metadata":{}},{"cell_type":"code","source":"model <- keras_model_sequential()\n\nmodel %>%\n  \n  # Start with hidden 2D convolutional layer being fed 32x32 pixel images\n  layer_conv_2d(\n    filter = 16, kernel_size = c(2), padding = \"same\", \n    input_shape = c(256, 256, 3),\n      activation='relu') %>%\n  layer_batch_normalization() %>%\n  # Second hidden layer\n  layer_conv_2d(filter = 128, kernel_size = c(2), activation='relu') %>%\n  layer_batch_normalization() %>%    \n\n  # Use max pooling\n  layer_max_pooling_2d(pool_size = c(2)) %>%\n  layer_dropout(rate=.2) %>%\n      \n  # 1 additional hidden 2D convolutional layers\n  layer_conv_2d(filter = 64, kernel_size = c(4), padding = \"same\", activation='relu') %>%\n  layer_batch_normalization() %>%\n  layer_conv_2d(filter = 64, kernel_size = c(4), activation='relu') %>%\n  layer_batch_normalization() %>%\n\n  layer_max_pooling_2d(pool_size = c(2)) %>%\n  layer_dropout(rate=.2) %>%\n\n  # Flatten max filtered output into feature vector \n  # and feed into dense layer\n  layer_flatten() %>%\n  #layer_dropout(rate=.2) %>%\n  #layer_dense(128, activaton='relu') %>% \n  \n  # Outputs from dense layer are projected onto 10 unit output layer\n  layer_dense(10, activation='softmax')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"str(model)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Compile Model**","metadata":{}},{"cell_type":"code","source":"opt <- optimizer_rmsprop(lr = 0.0001, decay = 1e-6)\n\nmodel %>% compile(\n  loss = \"categorical_crossentropy\",\n  optimizer = opt,\n  metrics = \"accuracy\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Fit Model**","metadata":{}},{"cell_type":"code","source":"history <- model %>% fit_generator(\n  train_generator,\n  steps_per_epoch = 600,\n  epochs = 10,\n  validation_data=validation_generator,\n  validation_steps=100\n)\n\nplot(history)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model %>% evaluate_generator(train_generator, steps=50)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**** Evaluate Model ****","metadata":{}},{"cell_type":"code","source":"model %>% evaluate_generator(validation_generator, steps=50)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Test Ramdom Example**","metadata":{}},{"cell_type":"code","source":"classes <- c('Safe Driving', 'texting - right', 'talking on the phone - right', 'texting - left',\n             'talking on the phone - left', 'operating the radio', 'drinking', 'reaching behind',\n             'hair and makeup', 'talking to passenger')\n\nfile <- sample(list.files(test_dir),1)\n\nimg_path <- paste(test_dir, file, sep='/')         \nimg <- image_load(img_path, target_size = c(256, 256)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 256, 256, 3)) \n\n\np_class <- predict_classes(model, img)\npreds <- as.data.frame(t(predict_proba(model, img)))\npreds$class <- classes\n\n\nclasses[p_class+1]\npreds\n\n\nimg_ <- image_load(img_path, target_size = c(640, 480)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 640, 480, 3)) \n\n\nimg_tensor=img_/255\nplot(as.raster(img_tensor[1,,,]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#classes <- c('Safe Driving', 'texting - right', 'talking on the phone - right', 'texting - left',\n#             'talking on the phone - left', 'operating the radio', 'drinking', 'reaching behind',\n#             'hair and makeup', 'talking to passenger')\n\nfile <- sample(list.files(test_dir),1)\n\nimg_path <- paste(test_dir, file, sep='/')         \nimg <- image_load(img_path, target_size = c(256, 256)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 256, 256, 3)) \n\n\np_class <- predict_classes(model, img)\npreds <- as.data.frame(t(predict_proba(model, img)))\npreds$class <- classes\n\n\nclasses[p_class+1]\npreds\n\n\nimg_ <- image_load(img_path, target_size = c(640, 480)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 640, 480, 3)) \n\n\nimg_tensor=img_/255\nplot(as.raster(img_tensor[1,,,]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#classes <- c('Safe Driving', 'texting - right', 'talking on the phone - right', 'texting - left',\n#             'talking on the phone - left', 'operating the radio', 'drinking', 'reaching behind',\n#             'hair and makeup', 'talking to passenger')\n\nfile <- sample(list.files(test_dir),1)\n\nimg_path <- paste(test_dir, file, sep='/')         \nimg <- image_load(img_path, target_size = c(256, 256)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 256, 256, 3)) \n\n\np_class <- predict_classes(model, img)\npreds <- as.data.frame(t(predict_proba(model, img)))\npreds$class <- classes\n\n\nclasses[p_class+1]\npreds\n\n\nimg_ <- image_load(img_path, target_size = c(640, 480)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 640, 480, 3)) \n\n\nimg_tensor=img_/255\nplot(as.raster(img_tensor[1,,,]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#classes <- c('Safe Driving', 'texting - right', 'talking on the phone - right', 'texting - left',\n#             'talking on the phone - left', 'operating the radio', 'drinking', 'reaching behind',\n#             'hair and makeup', 'talking to passenger')\n\nfile <- sample(list.files(test_dir),1)\n\nimg_path <- paste(test_dir, file, sep='/')         \nimg <- image_load(img_path, target_size = c(256, 256)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 256, 256, 3)) \n\n\np_class <- predict_classes(model, img)\npreds <- as.data.frame(t(predict_proba(model, img)))\npreds$class <- classes\n\n\nclasses[p_class+1]\npreds\n\n\nimg_ <- image_load(img_path, target_size = c(640, 480)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 640, 480, 3)) \n\n\nimg_tensor=img_/255\nplot(as.raster(img_tensor[1,,,]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Save Model**","metadata":{}},{"cell_type":"code","source":"save_model_hdf5(model, 'model_v6.h5', overwrite = TRUE,\n  include_optimizer = TRUE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}