{"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":"code","source":"import numpy as np\nimport pandas as pd\n\n\nimport tensorflow as tf\nimport tensorflow_addons as tfa\nfrom tensorflow import keras as kr\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator as idg\nfrom tensorflow.keras.models import Sequential as sql\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, Flatten, Dense, Dropout, BatchNormalization, LeakyReLU\nfrom tensorflow.keras.callbacks import ModelCheckpoint as mcp\nimport matplotlib.pyplot as pt\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-05T09:22:50.68855Z","iopub.execute_input":"2023-01-05T09:22:50.688974Z","iopub.status.idle":"2023-01-05T09:22:52.414898Z","shell.execute_reply.started":"2023-01-05T09:22:50.688889Z","shell.execute_reply":"2023-01-05T09:22:52.413927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bsPth = '/kaggle/input/plant-pathology-2021-fgvc8/'\ndownScale = '/kaggle/input/plant-pathology-2021resized-512-x-512/images'\n\n\n# train = pd.read_csv(os.path.join(os.path.abspath(bsPth+'../train.csv')))\n# train = pd.read_csv(bsPth+'../plant-pathology-2021-fgvc8/train.csv')\ntrain = pd.read_csv(bsPth+'train.csv')\n# print(train.head())\n\nlbl = train['labels'].unique()\n# print(lbl)\n\nuni_lbl = []\nfor l in lbl:\n    z = [lb for lb in l.split(\" \")]\n    uni_lbl.extend(lb for lb in z)\n\n#  uni_lbl = [k for l in train[\"labels\"] for k in l.split()]    \n    \nuni_lbl[0:] = [l for l in set(uni_lbl)]\nprint(uni_lbl) #or by using len(uni_lbl) and ':' operator","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:24:12.014027Z","iopub.execute_input":"2023-01-05T09:24:12.014459Z","iopub.status.idle":"2023-01-05T09:24:12.042218Z","shell.execute_reply.started":"2023-01-05T09:24:12.014423Z","shell.execute_reply":"2023-01-05T09:24:12.040994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[uni_lbl] = 0\ntrain.head()\n\ntrain[\"labels\"] = train[\"labels\"].apply(lambda x:x.split())\ntrain\n\nfor i in range(len(train)):\n    for it in uni_lbl:\n        if it in train.iloc[i, 1]:\n            train.loc[i,it] = 1\n        else:\n            pass\n            \ntrain","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:24:13.906141Z","iopub.execute_input":"2023-01-05T09:24:13.906575Z","iopub.status.idle":"2023-01-05T09:24:21.804245Z","shell.execute_reply.started":"2023-01-05T09:24:13.906539Z","shell.execute_reply":"2023-01-05T09:24:21.803121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" datagen = idg(\n     rescale=1./255,\n     shear_range=0.2,\n     zoom_range=0.2,\n     rotation_range=20,\n     horizontal_flip=True,\n     validation_split=0.2)\n    \ntr_ds = datagen.flow_from_dataframe(train, directory=downScale, x_col='image', y_col='labels', target_size=(128, 128), batch_size=64, shuffle=True, subset='training')\n\nvd_ds = datagen.flow_from_dataframe(train, directory=downScale, x_col='image', y_col='labels', target_size=(128,128), batch_size=64, shuffle=True, subset='validation')\n\n# print(tr_ds[0][0])","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:24:21.806324Z","iopub.execute_input":"2023-01-05T09:24:21.806747Z","iopub.status.idle":"2023-01-05T09:24:29.727459Z","shell.execute_reply.started":"2023-01-05T09:24:21.806707Z","shell.execute_reply":"2023-01-05T09:24:29.726428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = sql()\n\nmodel.add(Conv2D(filters=8, kernel_size=(3,3), activation='relu', input_shape=(128,128,3)))\nmodel.add(Conv2D(filters=16, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(Conv2D(filters=16, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(MaxPooling2D())   #default pool=2\n\n\nmodel.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(MaxPooling2D())   #default pool=2\n\nmodel.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(MaxPooling2D())   #default pool=2\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=128, kernel_size=(3,3), activation='relu', kernel_regularizer=kr.regularizers.L1L2(l1=1e-4, l2=1e-4)))\nmodel.add(MaxPooling2D())\nmodel.add(BatchNormalization())\n\n# flatten\nmodel.add(Flatten())\n\n# densify\nmodel.add(Dense(units=128, activation='relu'))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(units=48, activation='relu'))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(units=6, activation='softmax'))\n\n    \nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:24:31.033332Z","iopub.execute_input":"2023-01-05T09:24:31.034649Z","iopub.status.idle":"2023-01-05T09:24:32.364237Z","shell.execute_reply.started":"2023-01-05T09:24:31.034588Z","shell.execute_reply":"2023-01-05T09:24:32.362116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metrics = [  \n        kr.metrics.CategoricalAccuracy(name='accuracy'),\n        kr.metrics.Precision(name='precision'),\n        kr.metrics.Recall(name='recall')\n    ]\n\n# f1 = tfa.metrics.F1Score(num_classes=6,average='macro')\n","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:24:49.899451Z","iopub.execute_input":"2023-01-05T09:24:49.900161Z","iopub.status.idle":"2023-01-05T09:24:49.917497Z","shell.execute_reply.started":"2023-01-05T09:24:49.900124Z","shell.execute_reply":"2023-01-05T09:24:49.916332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.optimizers import SGD\n\n# opt = SGD(learning_rate=0.0045, momentum=0.95, nesterov=True, clipnorm=1.)\n# opt = 'adam'\nopt = kr.optimizers.RMSprop()\nmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=[metrics])\nfitmt = model.fit(tr_ds,\n            batch_size=64, \n            steps_per_epoch=96,\n            epochs = 5,\n            verbose = 1, \n            validation_data=vd_ds, use_multiprocessing=True,\n            shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:25:09.48194Z","iopub.execute_input":"2023-01-05T09:25:09.482387Z","iopub.status.idle":"2023-01-05T09:33:06.748093Z","shell.execute_reply.started":"2023-01-05T09:25:09.482347Z","shell.execute_reply":"2023-01-05T09:33:06.746661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(tr_ds,\n            batch_size=64,\n            epochs = 10,\n            steps_per_epoch = 96,\n            verbose = 1, \n            validation_data=vd_ds, use_multiprocessing=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:33:22.363975Z","iopub.execute_input":"2023-01-05T09:33:22.364437Z","iopub.status.idle":"2023-01-05T09:48:00.745667Z","shell.execute_reply.started":"2023-01-05T09:33:22.364389Z","shell.execute_reply":"2023-01-05T09:48:00.744547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import PIL\ntester = pd.read_csv(bsPth+'sample_submission.csv')\n\nfor img_name in tester['image']:\n    path = bsPth+'test_images/'+str(img_name)\n    with PIL.Image.open(path) as img:\n        img = img.resize((225,225))\n        img.save(f'./{img_name}')","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:48:18.275629Z","iopub.execute_input":"2023-01-05T09:48:18.276031Z","iopub.status.idle":"2023-01-05T09:48:19.088738Z","shell.execute_reply.started":"2023-01-05T09:48:18.275987Z","shell.execute_reply":"2023-01-05T09:48:19.087731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = datagen.flow_from_dataframe(tester, directory = './', x_col=\"image\", y_col= None, color_mode=\"rgb\", target_size = (128,128), classes=None, class_mode=None, batch_size=64, shuffle=False, seed=40)\n\npreds = model.predict(test_data)\nprint(preds)\npreds = preds.tolist()\n\nindices = []\nfor pred in preds:\n    temp = []\n    for category in pred:\n        if category>=0.6:\n            temp.append(pred.index(category))\n    if temp!=[]:\n        indices.append(temp)\n    else:\n        temp.append(np.argmax(pred))\n        indices.append(temp)\n    \nprint(indices)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:49:29.317093Z","iopub.execute_input":"2023-01-05T09:49:29.317495Z","iopub.status.idle":"2023-01-05T09:49:29.404906Z","shell.execute_reply.started":"2023-01-05T09:49:29.317445Z","shell.execute_reply":"2023-01-05T09:49:29.40393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = (tr_ds.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\nprint(labels)\n\ntestlabels = []\n\n\nfor image in indices:\n    temp = []\n    for i in image:\n        temp.append(str(labels[i]))\n    testlabels.append(' '.join(temp))\n\nprint(testlabels)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T09:49:32.042571Z","iopub.execute_input":"2023-01-05T09:49:32.042938Z","iopub.status.idle":"2023-01-05T09:49:32.049756Z","shell.execute_reply.started":"2023-01-05T09:49:32.042907Z","shell.execute_reply":"2023-01-05T09:49:32.048658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"deleter = tf.io.gfile.glob('./*.jpg')\n\nfor file in deleter:\n    os.remove(file)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv(bsPth+'sample_submission.csv')\nsub['labels'] = testlabels\nsub.to_csv('submission.csv', index=False)\nsub","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}