{"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":"!ls /kaggle/input/library4/ImageDataAugmentor-master\nimport sys\nsys.path.append('/kaggle/input/library4/ImageDataAugmentor-master') #/ImageDataAugmentor')\n\nfrom ImageDataAugmentor.image_data_augmentor import *","metadata":{"execution":{"iopub.status.busy":"2021-11-01T17:48:44.285404Z","iopub.execute_input":"2021-11-01T17:48:44.285739Z","iopub.status.idle":"2021-11-01T17:48:52.726922Z","shell.execute_reply.started":"2021-11-01T17:48:44.285634Z","shell.execute_reply":"2021-11-01T17:48:52.726084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SUBMISSION_MODE = 1\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nimport random\nimport os\nimport cv2\nimport sys\nfrom pylab import rcParams\nfrom PIL import Image\nwarnings.filterwarnings('ignore')\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import Input\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout, Activation, Input, GlobalAveragePooling2D\nfrom tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping\nfrom tensorflow.keras.applications import InceptionV3, Xception\nfrom tensorflow.keras.mixed_precision import experimental as mixed_precision\nfrom sklearn.model_selection import StratifiedShuffleSplit\n\n\n\npolicy = mixed_precision.Policy('mixed_float16')\nmixed_precision.set_policy(policy) #shortens training time by 2x\n\ndf_train = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\ndf_train.head()\n\ndf_train[\"label\"] = df_train[\"label\"].astype(str)\n\nbatch_size=32\nimage_size=300\n\ninput_shape = (image_size, image_size, 3)\ntarget_size = (image_size, image_size)\n\nimg_augmentation = tf.keras.Sequential(\n    [\n        tf.keras.layers.experimental.preprocessing.RandomCrop(image_size, image_size),\n        tf.keras.layers.experimental.preprocessing.RandomFlip(\"horizontal_and_vertical\"),\n        tf.keras.layers.experimental.preprocessing.RandomRotation(0.25),\n        tf.keras.layers.experimental.preprocessing.RandomZoom((-0.25, 0.25), (-0.25, 0.25)),\n    ])\n\n\n\npath = \"../input/cassava-leaf-disease-classification/train_images/\"\nimport tensorflow.keras.utils\nfrom ImageDataAugmentor.image_data_augmentor import *\nimport albumentations as A\n\ntrain_augmentations = A.Compose([\n            A.RandomCrop(image_size, image_size, p=1),\n            A.CoarseDropout(p=0.5),\n            A.Cutout(p=0.5),\n            A.Flip(p=0.5),\n            A.ShiftScaleRotate(p=0.5),\n            A.HueSaturationValue(p=0.5, hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2),\n            A.RandomBrightnessContrast(p=0.5, brightness_limit=(-0.2,0.2), contrast_limit=(-0.2, 0.2)),\n            A.ToFloat()\n            ], p=1)\n\nval_augmentations = A.Compose([\n                A.CenterCrop(image_size, image_size, p=1),\n                A.ToFloat()\n                ], p=1)\n\ndef TFDataGenerator(train_set, val_set):\n    train_generator = ImageDataAugmentor(augment=train_augmentations)\n    val_generator = ImageDataAugmentor(augment=val_augmentations)\n    \n    train_datagen = train_generator.flow_from_dataframe(\n                  dataframe = train_set,\n                  directory='../input/cassava-leaf-disease-classification/train_images',\n                  x_col='image_id',\n                  y_col='label',\n                  target_size=target_size,\n                  batch_size=batch_size,\n                  shuffle=True,\n                  class_mode='categorical',\n                  seed=2020)\n\n    val_datagen = val_generator.flow_from_dataframe(\n                dataframe = val_set,\n                directory='../input/cassava-leaf-disease-classification/train_images',\n                x_col='image_id',\n                y_col='label',\n                target_size=target_size,\n                batch_size=batch_size,\n                shuffle=False,\n                class_mode='categorical',\n                seed=2020)\n    \n    return train_datagen, val_datagen\n\ndf_train\ndf = df_train.groupby('label').count()\n\n\ntrain_set = df_train.iloc[:int(len(df_train)*0.8)]\nval_set = df_train.iloc[-int(len(df_train)*0.2):]\ntrain_datagen, val_datagen = TFDataGenerator(train_set, val_set)\n\n\ndef create_Inception():\n    base_model = InceptionV3(include_top=False, weights=\"imagenet\", input_shape=input_shape)\n\n    # Rebuild top\n    inputs = Input(shape=input_shape)\n\n    model = base_model(inputs)\n    pooling = GlobalAveragePooling2D()(model)\n    dropout = Dropout(0.2)(pooling)\n\n    outputs = Dense(5, activation=\"softmax\", name=\"dense\", dtype='float32')(dropout)\n\n    # Compile\n    inception = Model(inputs=inputs, outputs=outputs)\n    optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9, nesterov=True)\n    loss = tf.keras.losses.CategoricalCrossentropy(label_smoothing=0.2, from_logits=True)\n\n    inception.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])\n    return inception\n\ndef create_Xception():\n    base_model = Xception(include_top=False, weights=\"imagenet\", input_shape=input_shape)\n\n    # Rebuild top\n    inputs = Input(shape=input_shape)\n\n    model = base_model(inputs)\n    pooling = GlobalAveragePooling2D()(model)\n    dropout = Dropout(0.2)(pooling)\n\n    outputs = Dense(5, activation=\"softmax\", name=\"dense\", dtype='float32')(dropout)\n\n    # Compile\n    xception = Model(inputs=inputs, outputs=outputs)\n    optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9, nesterov=True)\n    loss = tf.keras.losses.CategoricalCrossentropy(label_smoothing=0.2, from_logits=True)\n\n    xception.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])\n    return xception\n\n\nif SUBMISSION_MODE == 0:\n\n    fold_number = 0\n    n_splits = 3\n    epochs = 8\n\n    tf.keras.backend.clear_session()\n    KFoldSplit = StratifiedShuffleSplit(n_splits=n_splits, test_size=0.1, random_state=2020)\n    for train_index, val_index in KFoldSplit.split(df_train[\"image_id\"], df_train[\"label\"]):\n        train_set = df_train.loc[train_index]\n        val_set = df_train.loc[val_index]\n        train_datagen, val_datagen = TFDataGenerator(train_set, val_set)\n        model = create_Inception()\n        print(\"Training fold no.: \" + str(fold_number+1))\n\n        model_name = \"inception \"\n        fold_name = \"fold.h5\"\n        filepath = model_name + str(fold_number+1) + fold_name\n        callbacks = [ReduceLROnPlateau(monitor='val_loss', patience=1, verbose=1, factor=0.2),\n                     EarlyStopping(monitor='val_loss', patience=3),\n                     ModelCheckpoint(filepath=filepath, monitor='val_loss', save_best_only=True)]\n\n        history = model.fit(train_datagen, epochs=epochs, validation_data=val_datagen, callbacks=callbacks)\n        fold_number += 1\n        if fold_number == n_splits:\n            print(\"Training finished!\")\n            \nif SUBMISSION_MODE == 1:\n    model = load_model(\"../input/models3/ResNet50V2 2fold.h5\")\n\n    SampleSubmit = pd.read_csv(os.path.join('../input/cassava-leaf-disease-classification', \"sample_submission.csv\"))\n    preds = []\n    results = []\n\n    for image_id in os.listdir('../input/cassava-leaf-disease-classification/test_images'):\n        image = Image.open(os.path.join('../input/cassava-leaf-disease-classification', \"test_images\", image_id))\n        image = image.resize((image_size, image_size))\n        image = np.expand_dims(image, axis = 0)/255.0\n        SampleSubmit.loc[len(SampleSubmit)] = [image_id , np.argmax(model.predict(image), axis=1).item()]\n    SampleSubmit.drop_duplicates().to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.status.busy":"2021-11-01T17:52:08.264982Z","iopub.execute_input":"2021-11-01T17:52:08.26542Z","iopub.status.idle":"2021-11-01T17:52:32.497696Z","shell.execute_reply.started":"2021-11-01T17:52:08.265374Z","shell.execute_reply":"2021-11-01T17:52:32.495944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2021-11-01T17:53:23.743235Z","iopub.execute_input":"2021-11-01T17:53:23.7435Z","iopub.status.idle":"2021-11-01T17:53:23.754498Z","shell.execute_reply.started":"2021-11-01T17:53:23.74347Z","shell.execute_reply":"2021-11-01T17:53:23.75354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}