{"cells":[{"metadata":{"id":"view-in-github"},"cell_type":"markdown","source":"<a href=\"https://colab.research.google.com/github/VigneshwaraChinnadurai/Competitions/blob/master/Cassava%20leaf%20disease%20classification/classifier.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.chdir('/kaggle/')\n!ls\nos.system(\"rm -rf \" + 'vic')\n!ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.chdir('/kaggle/')\n!ls\nos.system(\"mkdir \" + 'vic')\nos.system(\"chmod 777 \" + 'vic')\n!ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.chdir('/kaggle/vic')\n!ls\nos.system(\"mkdir \" + 'train_images')\nos.system(\"chmod 777 \" + 'train_images')\n!ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    n=0\n    for filename in filenames:\n        if n<5:\n            print(os.path.join(dirname, filename))\n            n+=1\n        else:\n            break","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import shutil\nimport glob\nimport pandas as pd\n\nos.chdir('/kaggle/input/cassava-leaf-disease-classification')\n\npred = pd.read_csv('train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ipath = r\"/kaggle/input/cassava-leaf-disease-classification/train_images\"\nopath = r\"/kaggle/vic/train_images\"\n\n\n# get the class label limit\nclass_limit = 5\n\n# variables to keep track\nlabel = 0\n\n# class names\nclass_names = [\"0\", \"1\", \"2\", \"3\",\"4\"]\n\n# change the current working directory\nos.chdir(opath)\n\n# creating the directories as required.\nfor x in range(1, class_limit+1):\n    os.system(\"mkdir \" + class_names[label])\n    label += 1\n\n# loop over the images in the dataset    \nos.chdir(ipath)\nfor n in pred['image_id']:\n    try:\n        c=str(pred[pred['image_id']==n].iloc[0,1])\n        shutil.copy(n,opath+\"/\"+c+\"/\"+n)\n    except FileNotFoundError:\n        pass","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.chdir('/kaggle/vic')\n!ls\nos.system(\"mkdir \" + 'eval_images')\nos.system(\"chmod 777 \" + 'eval_images')\n!ls\nos.chdir('/kaggle/vic/train_images')\n!ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.chdir('/kaggle/vic/train_images/0')\n!ls\npath = r\"/kaggle/vic/train_images\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"eval_path=r\"/kaggle/vic/eval_images\"\nos.chdir(eval_path)\nlabel=0\nfor x in range(1, class_limit+1):\n    os.system(\"mkdir \" + class_names[label])\n    label += 1\nfor i in class_names:\n    p, dirs, files = next(os.walk(path+\"/\"+i+\"/\"))\n    arr = os.listdir(path+\"/\"+i+\"/\")\n    file_count = len(files)\n    f_2_move=int(file_count*0.2)\n    initial=0\n    while True:\n        os.chdir(path+\"/\"+i+\"/\")\n        shutil.move(arr[initial],eval_path+\"/\"+i+\"/\"+arr[initial])\n        initial+=1\n        if initial >f_2_move:\n            break","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.chdir('/kaggle/vic/eval_images/0')\n!ls","execution_count":null,"outputs":[]},{"metadata":{"id":"8Gin3Fitqtfg","outputId":"a1c4edf5-32f2-4dce-f873-95bcb1dc220e","trusted":true},"cell_type":"code","source":"import keras\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.layers import Conv2D, MaxPool2D,Dropout,Dense,Flatten,BatchNormalization\n\nimport warnings\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"id":"T05FjzPaqtfh","outputId":"a71b1d66-4ee0-4ef5-c6f9-168423827e6a","trusted":true},"cell_type":"code","source":"model = Sequential()  \nmodel.add(Conv2D(16, (3, 3), input_shape = (64, 64, 3),kernel_initializer='normal', activation='relu'))\nmodel.add(MaxPool2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(32, (3, 3), activation='relu'))\nmodel.add(MaxPool2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.4))\n\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.4))\n\nmodel.add(Flatten())\n\nmodel.add(Dense(1024, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(5,activation='softmax'))\n\nada = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)\nsgd = keras.optimizers.SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)\n#model.compile(loss=\"mean_squared_error\", optimizer=sgd, metrics=['accuracy'])\nmodel.compile(loss=\"categorical_crossentropy\", optimizer=ada, metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"id":"u1J00qUDqtfh","trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(shear_range = 0.2,\n                                   channel_shift_range = 0.2,\n                                   zoom_range = 0.2,\n                                   rotation_range=10,\n                                   validation_split=0.9,\n                                   horizontal_flip = True)\n\ntest_datagen = ImageDataGenerator(validation_split=0.9)","execution_count":null,"outputs":[]},{"metadata":{"id":"5QZdfgUOqtfh","outputId":"a492a847-3dd7-42d7-d203-4d4a1e46fc72","trusted":true},"cell_type":"code","source":"training_set = train_datagen.flow_from_directory('/kaggle/vic/train_images',\n                                                 target_size = (64, 64),\n                                                 batch_size = 64,\n                                                 shuffle=True,\n                                                 seed=101,\n                                                 #save_to_dir='Augumented/Train',\n                                                 #save_format='jpeg',\n                                                 interpolation='nearest',\n                                                 class_mode = 'categorical')\n\ntest_set = test_datagen.flow_from_directory('/kaggle/vic/eval_images',\n                                            target_size = (64, 64),\n                                            batch_size = 64,\n                                            shuffle=True,\n                                            seed=101,\n                                            #save_to_dir='Augumented/Test',\n                                            #save_format='jpeg',\n                                            interpolation='nearest',\n                                            class_mode = 'categorical')\n","execution_count":null,"outputs":[]},{"metadata":{"id":"mT8P57grqtfh","trusted":true},"cell_type":"code","source":"os.chdir('/kaggle/vic')\nfrom keras.callbacks import EarlyStopping\nfrom keras.callbacks import ModelCheckpoint\nes = EarlyStopping(monitor='val_accuracy', mode='max', patience=20)\nmc = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', save_best_only=True)","execution_count":null,"outputs":[]},{"metadata":{"id":"i8lO9CJ_qtfh","outputId":"4822d427-01bd-4dcf-bb57-d961548796a1","trusted":true},"cell_type":"code","source":"os.chdir('/kaggle/vic')\nmodel.fit_generator(training_set,\n                    steps_per_epoch = int(17115//64),\n                    epochs = 100,\n                    validation_data = test_set,\n                    validation_steps = int(4282//64),\n                    class_weight={0:1,1:0.5,2:0.5,3:0.1,4:0.5},\n                    callbacks=[es,mc])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import load_model\nsaved_model = load_model('best_model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"tnjRCineqtfh","outputId":"b0e43ff2-b0b3-4435-edc2-9cb3ea139f1a","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom keras.preprocessing import image\ntest_image = image.load_img('/kaggle/input/cassava-leaf-disease-classification/test_images/2216849948.jpg', target_size = (64, 64))\ntest_image = image.img_to_array(test_image)\ntest_image = np.expand_dims(test_image, axis = 0)\nresult = saved_model.predict(test_image)\nresult","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = [['2216849948.jpg', \"3\"]] \n  \n# Create the pandas DataFrame \nsubmission = pd.DataFrame(data, columns = ['image_id', 'label']) \nos.chdir('/kaggle/working/')\nsubmission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}