{"metadata":{"kernelspec":{"name":"ir","display_name":"R","language":"R"},"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"3.6.3"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"library(tidyverse)\nlibrary(keras)\n#library(magrittr)\n#library(onehot)\nlibrary(splitstackshape)\nlibrary(caret)\nlibrary(randomForest)\n\n#factor = .4\n#reduceFrom = 2\n\nimage_path <- '../input/plant-pathology-2021-fgvc8/train_images'\n\nbase <- read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\") #%>% sample_n(1000)\n\nbase <- base %>% mutate(complex = ifelse(str_detect(labels, \"complex\"), 1, 0),\n                        healthy = ifelse(str_detect(labels, \"healthy\"), 1, 0),\n                        rust = ifelse(str_detect(labels, \"rust\"), 1, 0),\n                        scab = ifelse(str_detect(labels, \"scab\"), 1, 0),\n                        frog_eye_leaf_spot = ifelse(str_detect(labels, \"frog_eye_leaf_spot\"), 1, 0),\n                        powdery_mildew = ifelse(str_detect(labels, \"powdery_mildew\"), 1, 0))\n\n\nhead(base)\n\n### USAR KFOLD PRA SEPARAR TRAIN TEST\n#base <- base %>% mutate(flag = sample(0:1, n(), prob = c(.2, .8), replace = TRUE))\n\n#test <- base %>% filter(flag == 0) %>% select(-flag)\n#train <- base %>% filter(flag == 1) %>% select(-flag)\n\n#head(test)\n#head(train)","metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"### stratified k fold pra separar train e test, visto que ha muita diferenca na proporcao dos labels\n\nprop.table(table(base$labels))\n\nd <- rownames_to_column(base, var = \"id\") %>% mutate_at(vars(id), as.integer)\ntrain <- d %>% stratified(., group = \"labels\", size = 0.80)\n#dim(train)\n#train\n\nprop.table(table(train$labels))\n\ntest <- d[-train$id, ]\n#dim(test)\nprop.table(table(test$labels)) \n\nhead(train)\nhead(test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 32\ntarget_size = c(256, 256)\n\ntrain_data_gen = image_data_generator(\n  rescale = 1/255,\n  horizontal_flip = TRUE,\n  #vertical_flip = TRUE,\n    #rotation_range=30, \n    zoom_range=0.1,\n    width_shift_range=0.07, \n    #height_shift_range=0.2, \n    #shear_range=0.15,\n    #fill_mode=\"reflect\",\n    validation_split = 0.2\n)\n\n#testar sem valid_data_gen\nvalid_data_gen <- image_data_generator(\n  rescale = 1/255,\n  horizontal_flip = TRUE,\n  #vertical_flip = TRUE,\n    #rotation_range=30, \n    zoom_range=0.1,\n    width_shift_range=0.07, \n    #height_shift_range=0.2, \n    #shear_range=0.15,\n    #fill_mode=\"reflect\",\n    validation_split = 0.2\n)\n\ntrain_generator <- flow_images_from_dataframe(dataframe = train, \n                                              directory = image_path,\n                                              generator = train_data_gen,\n                                              class_mode = \"other\",#tentar categorical\n                                              x_col = \"image\",\n                                              y_col = c('complex', 'healthy', 'rust', 'scab', 'frog_eye_leaf_spot', 'powdery_mildew'),#testar \"labels\"\n                                              target_size = target_size,\n                                              batch_size = batch_size,\n                                              #shuffle = TRUE,\n                                              drop_duplicates = FALSE#,\n                                              #interpolation = \"nearest\"\n                                             )\n\nvalidation_generator <- flow_images_from_dataframe(dataframe = test, \n                                              directory = image_path,\n                                              generator = valid_data_gen, #testar sem    \n                                              class_mode = \"other\",\n                                              x_col = \"image\",\n                                              y_col = c('complex', 'healthy', 'rust', 'scab', 'frog_eye_leaf_spot', 'powdery_mildew'),\n                                              target_size = target_size,\n                                              batch_size = batch_size,\n                                              #shuffle = TRUE,\n                                              drop_duplicates = FALSE#,\n                                              #interpolation = \"nearest\"\n                                                  )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"weights_path = \"../input/inceptionv3/inceptionv3_imagenet_1000_no_top.h5\"\n\npre_model <- application_inception_v3(\n  include_top = FALSE,\n  weights = weights_path,\n  #input_tensor = NULL,\n  input_shape = c(256,256,3),\n  #pooling = NULL,\n  #classes = 1000\n)\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras_model_sequential() #model1 = keras_model()\nmodel %>% pre_model %>%\n    layer_flatten()  %>%\n    layer_dense(units = 128, activation = 'relu')  %>%\n    layer_dropout(rate = 0.3) %>%\n    layer_dense(units = 6, activation = 'sigmoid')\n\nsummary(model)\n\nfor (layer in pre_model$layers[-311]){\n      layer$trainable <- FALSE\n}\n\nmodel %>%\n  compile (optimizer = optimizer_adam(lr=0.0001),loss = 'binary_crossentropy', \n           metrics = c('accuracy'))\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history <- model %>% fit_generator(\n    train_generator,\n    steps_per_epoch = round(nrow(train)/(4*batch_size)),\n    epochs = 15,#50,\n    validation_data = validation_generator,\n    validation_step = round(nrow(test)/(4*batch_size))\n    #verbose = 1\n)\n\nplot(history)\n\nhistory","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Avaliando metricas","metadata":{}},{"cell_type":"code","source":"head(test)\n\ntest_data_gen <- image_data_generator(\n  rescale = 1/255\n)\n\nsample_submission <- test#read_csv(\"../input/plant-pathology-2021-fgvc8/sample_submission.csv\")\ntest_generator <- flow_images_from_dataframe(dataframe = sample_submission, \n                                              directory = image_path512,\n                                              class_mode = NULL,\n                                              x_col = \"image\",\n                                              y_col = NULL,\n                                              target_size = target_size,\n                                              shuffle = FALSE,\n                                              generator = test_data_gen, \n                                              batch_size=32) #testar 1\n\nnum_test_images <- nrow(sample_submission)\n\npred <- model %>% predict_generator(test_generator, steps = num_test_images)\n\nhead(pred)\n\nlabel <- apply(pred, 1, which.max)\nlabel\n\nlabelt <- label %>% str_replace(\"1\", \"complex\") %>% str_replace(\"2\", \"healthy\") %>% str_replace(\"3\", \"rust\") %>% \n            str_replace(\"4\", \"scab\") %>% str_replace(\"5\", \"frog_eye_leaf_spot\") %>% str_replace(\"6\", \"powdery_mildew\")\nlabelt\n\nprediction <- tibble(image = sample_submission$image, labels = labelt)\n\nhead(prediction)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"library(pROC)\n\npreddf <- as.data.frame(pred)\ncolnames(preddf) <- c(\"complex_p\", \"healthy_p\",\"rust_p\", \"scab_p\", \"frog_eye_leaf_spot_p\", \"powdery_mildew_p\")\n\nroc_complex <- roc(sample_submission$complex,  pred[,1])\nth_complex <- auc(roc_complex)\nth_complex\n\nroc_healthy <- roc(sample_submission$healthy,  pred[,2])\nth_healthy <- auc(roc_healthy)\nth_healthy\n\nroc_rust <- roc(sample_submission$rust,  pred[,3])\nth_rust <- auc(roc_rust)\nth_rust\n\nroc_scab <- roc(sample_submission$scab,  pred[,4])\nth_scab <- auc(roc_scab)\nth_scab\n\nroc_frog_eye_leaf_spot <- roc(sample_submission$frog_eye_leaf_spot,  pred[,5])\nth_frog_eye_leaf_spot <- auc(roc_frog_eye_leaf_spot)\nth_frog_eye_leaf_spot\n\nroc_powdery_mildew <- roc(sample_submission$powdery_mildew,  pred[,6])\nth_powdery_mildew <- auc(roc_powdery_mildew)\nth_powdery_mildew\n\npreddf <- preddf %>% mutate(complex_p = ifelse(complex_p>=th_complex, 1, 0),\n                            healthy_p = ifelse(healthy_p>=th_healthy,1,0),\n                            rust_p = ifelse(rust_p>=th_rust, 1, 0),\n                            scab_p = ifelse(scab_p>=th_scab, 1, 0),\n                            frog_eye_leaf_spot_p = ifelse(frog_eye_leaf_spot_p>=th_frog_eye_leaf_spot, 1, 0),\n                            powdery_mildew_p = ifelse(powdery_mildew_p>=th_powdery_mildew, 1, 0))\n\nfor(i in 1:nrow(preddf)){\n    a <- preddf %>% slice(i) %>% filter(complex_p==0 & healthy_p==0 & rust_p==0 & scab_p==0 & frog_eye_leaf_spot_p==0 & powdery_mildew_p==0)\n    if(nrow(a)!=0){\n        aux <- as.data.frame(pred) %>% slice(i)\n        maiorp <- apply(aux, 1, which.max)\n        if(maiorp==1){preddf[i,] <- c(1,0,0,0,0,0)}else{\n            if(maiorp==2){preddf[i,] <- c(0,1,0,0,0,0)}else{\n                if(maiorp==3){preddf[i,] <- c(0,0,1,0,0,0)}else{\n                    if(maiorp==4){preddf[i,] <- c(0,0,0,1,0,0)}else{\n                        if(maiorp==5){preddf[i,] <- c(0,0,0,0,1,0)}else{\n                            if(maiorp==6){preddf[i,] <- c(0,0,0,0,0,1)}\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nhead(preddf)\n\n#1\npred_complex <- as.data.frame(cbind(test$complex, preddf$complex_p))\ncolnames(pred_complex) <- c(\"complex_test\", \"complex_pred\")\n\nt0p0_complex <- nrow(pred_complex %>% filter(complex_test == 0, complex_pred == 0)) #tb1\nt1p0_complex <- nrow(pred_complex %>% filter(complex_test == 1, complex_pred == 0)) #tb2\nt0p1_complex <- nrow(pred_complex %>% filter(complex_test == 0, complex_pred == 1)) #tb3\nt1p1_complex <- nrow(pred_complex %>% filter(complex_test == 1, complex_pred == 1)) #tb4\n\n\n#2\npred_healthy <- as.data.frame(cbind(test$healthy, preddf$healthy_p))\ncolnames(pred_healthy) <- c(\"healthy_test\", \"healthy_pred\")\n\nt0p0_healthy <- nrow(pred_healthy %>% filter(healthy_test == 0, healthy_pred == 0)) #tb1\nt1p0_healthy <- nrow(pred_healthy %>% filter(healthy_test == 1, healthy_pred == 0)) #tb2\nt0p1_healthy <- nrow(pred_healthy %>% filter(healthy_test == 0, healthy_pred == 1)) #tb3\nt1p1_healthy <- nrow(pred_healthy %>% filter(healthy_test == 1, healthy_pred == 1)) #tb4\n\n#3\npred_rust <- as.data.frame(cbind(test$rust, preddf$rust_p))\ncolnames(pred_rust) <- c(\"rust_test\", \"rust_pred\")\n\nt0p0_rust <- nrow(pred_rust %>% filter(rust_test == 0, rust_pred == 0)) #tb1\nt1p0_rust <- nrow(pred_rust %>% filter(rust_test == 1, rust_pred == 0)) #tb2\nt0p1_rust <- nrow(pred_rust %>% filter(rust_test == 0, rust_pred == 1)) #tb3\nt1p1_rust <- nrow(pred_rust %>% filter(rust_test == 1, rust_pred == 1)) #tb4\n\n#4\npred_scab <- as.data.frame(cbind(test$scab, preddf$scab_p))\ncolnames(pred_scab) <- c(\"scab_test\", \"scab_pred\")\n\nt0p0_scab <- nrow(pred_scab %>% filter(scab_test == 0, scab_pred == 0)) #tb1\nt1p0_scab <- nrow(pred_scab %>% filter(scab_test == 1, scab_pred == 0)) #tb2\nt0p1_scab <- nrow(pred_scab %>% filter(scab_test == 0, scab_pred == 1)) #tb3\nt1p1_scab <- nrow(pred_scab %>% filter(scab_test == 1, scab_pred == 1)) #tb4\n\n#5\npred_frog_eye_leaf_spot <- as.data.frame(cbind(test$frog_eye_leaf_spot, preddf$frog_eye_leaf_spot_p))\ncolnames(pred_frog_eye_leaf_spot) <- c(\"frog_eye_leaf_spot_test\", \"frog_eye_leaf_spot_pred\")\n\nt0p0_frog_eye_leaf_spot <- nrow(pred_frog_eye_leaf_spot %>% filter(frog_eye_leaf_spot_test == 0, frog_eye_leaf_spot_pred == 0)) #tb1\nt1p0_frog_eye_leaf_spot <- nrow(pred_frog_eye_leaf_spot %>% filter(frog_eye_leaf_spot_test == 1, frog_eye_leaf_spot_pred == 0)) #tb2\nt0p1_frog_eye_leaf_spot <- nrow(pred_frog_eye_leaf_spot %>% filter(frog_eye_leaf_spot_test == 0, frog_eye_leaf_spot_pred == 1)) #tb3\nt1p1_frog_eye_leaf_spot <- nrow(pred_frog_eye_leaf_spot %>% filter(frog_eye_leaf_spot_test == 1, frog_eye_leaf_spot_pred == 1)) #tb4\n\n#6\npred_powdery_mildew <- as.data.frame(cbind(test$powdery_mildew, preddf$powdery_mildew_p))\ncolnames(pred_powdery_mildew) <- c(\"powdery_mildew_test\", \"powdery_mildew_pred\")\n\nt0p0_powdery_mildew <- nrow(pred_powdery_mildew %>% filter(powdery_mildew_test == 0, powdery_mildew_pred == 0)) #tb1\nt1p0_powdery_mildew <- nrow(pred_powdery_mildew %>% filter(powdery_mildew_test == 1, powdery_mildew_pred == 0)) #tb2\nt0p1_powdery_mildew <- nrow(pred_powdery_mildew %>% filter(powdery_mildew_test == 0, powdery_mildew_pred == 1)) #tb3\nt1p1_powdery_mildew <- nrow(pred_powdery_mildew %>% filter(powdery_mildew_test == 1, powdery_mildew_pred == 1)) #tb4\n\ncalculate_stats <- function(tb1, tb2, tb3, tb4, labelname) {\n  acc <- (tb1 + tb4)/(tb1 + tb2 + tb3 + tb4)\n  recall <- tb4/(tb4 + tb3)\n  precision <- tb4/(tb4 + tb2)\n  f1 <- 2 * ((precision * recall) / (precision + recall))\n  \n  cat(labelname, \": \\n\")\n  cat(\"\\tAccuracy = \", acc*100, \"%.\")\n  cat(\"\\n\\tPrecision = \", precision*100, \"%.\")\n  cat(\"\\n\\tRecall = \", recall*100, \"%.\")\n  cat(\"\\n\\tF1 Score = \", f1*100, \"%.\\n\\n\")\n  return(f1)\n}\n\n#acc_complex <- (tb1 + tb4)/(tb1 + tb2 + tb3 + tb4)\n\nf1_complex <- calculate_stats(t0p0_complex, t1p0_complex, t0p1_complex, t1p1_complex, \"complex\")\nf1_healthy <- calculate_stats(t0p0_healthy, t1p0_healthy, t0p1_healthy, t1p1_healthy, \"healthy\")\nf1_rust <- calculate_stats(t0p0_rust, t1p0_rust, t0p1_rust, t1p1_rust, \"rust\")\nf1_scab <- calculate_stats(t0p0_scab, t1p0_scab, t0p1_scab, t1p1_scab, \"scab\")\nf1_frog_eye_leaf_spot <- calculate_stats(t0p0_frog_eye_leaf_spot, t1p0_frog_eye_leaf_spot, t0p1_frog_eye_leaf_spot, t1p1_frog_eye_leaf_spot, \"frog_eye_leaf_spot\")\nf1_powdery_mildew <- calculate_stats(t0p0_powdery_mildew, t1p0_powdery_mildew, t0p1_powdery_mildew, t1p1_powdery_mildew, \"powdery_mildew\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"#head(test)\n\ntest_data_gen <- image_data_generator(\n  rescale = 1/255\n)\n\nsample_submission <- read_csv(\"../input/plant-pathology-2021-fgvc8/sample_submission.csv\")\ntest_generator <- flow_images_from_dataframe(dataframe = sample_submission, \n                                              directory = \"../input/plant-pathology-2021-fgvc8/test_images\",\n                                              class_mode = NULL,\n                                              x_col = \"image\",\n                                              y_col = NULL,\n                                              target_size = target_size,\n                                              shuffle = FALSE,\n                                              generator = test_data_gen, \n                                              batch_size=32) #testar 1\n\nnum_test_images <- nrow(sample_submission)\n\npred <- model %>% predict_generator(test_generator, steps = num_test_images)\nhead(pred)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preddf <- as.data.frame(pred)\ncolnames(preddf) <- c(\"complex_p\", \"healthy_p\",\"rust_p\", \"scab_p\", \"frog_eye_leaf_spot_p\", \"powdery_mildew_p\")\n\n\npreddf <- preddf %>% mutate(complex_p = ifelse(complex_p>=th_complex, 1, 0),\n                            healthy_p = ifelse(healthy_p>=th_healthy,1,0),\n                            rust_p = ifelse(rust_p>=th_rust, 1, 0),\n                            scab_p = ifelse(scab_p>=th_scab, 1, 0),\n                            frog_eye_leaf_spot_p = ifelse(frog_eye_leaf_spot_p>=th_frog_eye_leaf_spot, 1, 0),\n                            powdery_mildew_p = ifelse(powdery_mildew_p>=th_powdery_mildew, 1, 0))\n\nhead(preddf)\n\n\npreddf %>% filter(complex_p==0 & healthy_p==0 & rust_p==0 & scab_p==0 & frog_eye_leaf_spot_p==0 & powdery_mildew_p==0)\n\nfor(i in 1:nrow(preddf)){\n    a <- preddf %>% slice(i) %>% filter(complex_p==0 & healthy_p==0 & rust_p==0 & scab_p==0 & frog_eye_leaf_spot_p==0 & powdery_mildew_p==0)\n    if(nrow(a)!=0){\n        aux <- as.data.frame(pred) %>% slice(i)\n        maiorp <- apply(aux, 1, which.max)\n        if(maiorp==1){preddf[i,] <- c(1,0,0,0,0,0)}else{\n            if(maiorp==2){preddf[i,] <- c(0,1,0,0,0,0)}else{\n                if(maiorp==3){preddf[i,] <- c(0,0,1,0,0,0)}else{\n                    if(maiorp==4){preddf[i,] <- c(0,0,0,1,0,0)}else{\n                        if(maiorp==5){preddf[i,] <- c(0,0,0,0,1,0)}else{\n                            if(maiorp==6){preddf[i,] <- c(0,0,0,0,0,1)}\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n\npreddf <- preddf %>% mutate(complex_p = ifelse(healthy_p==1, 0, complex_p),\n                            rust_p = ifelse(healthy_p==1, 0, rust_p),\n                            scab_p = ifelse(healthy_p==1, 0, scab_p),\n                            frog_eye_leaf_spot_p = ifelse(healthy_p==1, 0, frog_eye_leaf_spot_p),\n                            powdery_mildew_p = ifelse(powdery_mildew_p==1, 0, scab_p))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preddf <- preddf %>% mutate(labels = ifelse(complex_p == 1, \"complex,\", \" \"),\n                  labels = ifelse(healthy_p == 1, paste0(labels,\"healthy,\"), labels),\n                  labels = ifelse(rust_p == 1, paste0(labels,\"rust,\"), labels),\n                  labels = ifelse(scab_p == 1, paste0(labels,\"scab,\"), labels),\n                  labels = ifelse(frog_eye_leaf_spot_p == 1, paste0(labels,\"frog_eye_leaf_spot,\"), labels),\n                  labels = ifelse(powdery_mildew_p == 1, paste0(labels,\"powdery_mildew,\"), labels),\n                  labels = str_sub(labels,start=1,end=-2))\n\nlabelt <- preddf %>% pull(labels)\nlabelt\n\nprediction <- tibble(image = sample_submission$image, labels = labelt)\n\nhead(prediction)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"write_csv(prediction, file='submission.csv')","metadata":{},"execution_count":null,"outputs":[]}]}