{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nINPUT_DIR = '../input/cassava-leaf-disease-classification/'\nOUTPUT_DIR = './'\n#MODEL_DIR = '../input/cassava-resnext50-32x4d-weights/'\nif not os.path.exists(OUTPUT_DIR):\n    os.makedirs(OUTPUT_DIR)\n    \nTRAIN_PATH = '../input/cassava-leaf-disease-classification/train_images'\nTEST_PATH = '../input/cassava-leaf-disease-classification/test_images'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn import preprocessing\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import StratifiedKFold\nimport albumentations as A\nfrom albumentations import (\n    Compose, RandomBrightness, JpegCompression, HueSaturationValue, RandomContrast, HorizontalFlip,\n    Rotate\n)\nimport tensorflow as tf\nAUTOTUNE = tf.data.experimental.AUTOTUNE\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing.image import img_to_array\nfrom tensorflow.keras.preprocessing.image import load_img\nfrom keras.utils import to_categorical\nfrom keras.models import Model\nfrom keras.preprocessing.image import load_img\nfrom keras.callbacks import ReduceLROnPlateau,EarlyStopping, ModelCheckpoint\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.optimizers import Adam, SGD\nfrom PIL import Image\nimport numpy as np\nimport scipy as sp\nimport cv2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ntrain","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import json\n\nwith open('../input/cassava-leaf-disease-classification/label_num_to_disease_map.json') as f:\n    classes = json.load(f)\n    \nclasses","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['class']=train['label'].apply(lambda x:classes[str(x)])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (15,7))\nax =sns.countplot(x=train['class'],order=train['class'].value_counts().index )\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['path'] = train['image_id'].apply(lambda x:'../input/cassava-leaf-disease-classification/train_images/'+str(x))\ntrain= train.astype('str')\ntrain, val = train_test_split(train, test_size = 0.05, random_state = 100,\n                                    stratify = train['label'].values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size=4\ndef transform(image):\n    aug = A.Compose([\n        A.Flip(),\n        A.Rotate(limit=40),\n        A.HorizontalFlip(),\n        A.Transpose(p=0.5)\n        \n    ])\n    return aug(image=image)['image']\n\n\ndatagen = ImageDataGenerator(preprocessing_function=transform)\\\n    .flow_from_dataframe(batch_size=batch_size,\n        dataframe=train,\n        directory=os.path.join(INPUT_DIR, 'train_images'),\n        shuffle=True,\n        x_col='image_id',\n        y_col='label',\n        target_size=(512,512), \n        class_mode='categorical'\n    )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val_datagen = ImageDataGenerator()\\\n    .flow_from_dataframe(batch_size=batch_size,\n        dataframe=val,\n        directory=os.path.join(INPUT_DIR, 'train_images'),\n        shuffle=True,\n        x_col='image_id',\n        y_col='label',\n        target_size=(512,512), \n        class_mode='categorical'\n    )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model = tf.keras.applications.EfficientNetB7(\n    include_top=False,\n    weights=\"imagenet\",\n    input_tensor=None,\n    input_shape=(512, 512, 3),\n    pooling=None,\n    #classes=1000,\n    classifier_activation=\"softmax\",\n)\n\n\nfor layer in model.layers:\n   layer.trainable = True\n\nx = model.output\n\n\npool1=tf.keras.layers.GlobalAveragePooling2D()(x)\nflat1 = tf.keras.layers.Flatten()(pool1)\n\nclass1 = tf.keras.layers.Dense(512, activation='relu')(flat1)\nbatch1 = tf.keras.layers.BatchNormalization()(class1)\ndropout1=tf.keras.layers.Dropout(0.3)(batch1)\nclass2 = tf.keras.layers.Dense(512, activation='relu')(dropout1)\nbatch2 = tf.keras.layers.BatchNormalization()(class2)\ndropout2=tf.keras.layers.Dropout(0.4)(batch2)\npredictions = tf.keras.layers.Dense(5, activation='softmax')(dropout2)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"new_modelf = tf.keras.Model(inputs=model.input, outputs=predictions)\nnew_modelf.compile(loss='categorical_crossentropy',\n              optimizer=tf.keras.optimizers.Adam(\n                learning_rate=0.0000012,\n                beta_1=0.9,\n                beta_2=0.999)\n                ,\n              metrics=['accuracy'])\nnew_modelf.summary()"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"checkpoint = ModelCheckpoint(\"./weightEffnetB4_v6.h5\",\n\n                         monitor='val_accuracy', \n                         #verbose=1, \n                         save_best_only=True, \n                         mode='max', \n                         save_freq='epoch')\nearly = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=3, verbose=1, mode='auto') \nreduce_lr = ReduceLROnPlateau(monitor = 'val_loss', factor = 0.3, patience = 2, min_delta = 0.001, mode = 'min', verbose = 1)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"new_modelf.load_weights('../input/pass-3/weightEffnetB4_v5.h5')"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"batch_size=4\nhistfinal3 =new_modelf.fit(datagen, steps_per_epoch=20327// batch_size,\n                            validation_data= val_datagen, validation_steps=1070// batch_size, epochs=3, callbacks=[checkpoint,early,reduce_lr])"},{"metadata":{"trusted":true},"cell_type":"code","source":"TEST_DIR = '../input/cassava-leaf-disease-classification/test_images/'\ntest_images = os.listdir(TEST_DIR)\npredictions = []\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import load_model\nmodel = load_model(\"../input/test-5/weightEffnetB7_v6.h5\")\nmodel2=load_model(\"../input/mdpa56/initialweightInceptionResnet4.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def agg_preds(predictions, y):\n    y_classes = np.argmax(y, axis=1)\n    acc_hist = []\n\n    for i in range(predictions.shape[0]):\n        pred_agg = np.mean(predictions[:i+1], axis=0)\n        preds = np.argmax(pred_agg, axis=1)\n        acc = preds == y_classes\n        acc = np.mean(acc)\n        acc_hist.append(acc)\n    return acc_hist\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def agg_acc(predictions, y):\n    pred_agg = np.mean(predictions, axis=0)\n    preds = np.argmax(pred_agg, axis=1)\n    acc = np.mean(preds == y)\n    return acc","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def transfor(transfo,images):\n    test=[]\n    for i in images:\n        test.append(transfo(i))\n    return test\ndef flip_lr(image):\n    aug = A.Compose([\n        A.VerticalFlip(p=1)\n        \n    ])\n    return aug(image=image)['image']\n\ndef rotate(image):\n    aug = A.Compose([\n         A.Rotate(limit=50,p=1)\n        \n    ])\n    return aug(image=image)['image']\ndef flip_hor(image):\n\n    aug = A.Compose([\n        A.HorizontalFlip(p=1)\n        \n    ])\n    return aug(image=image)['image']\n    \ndef dropout(image):\n        aug = A.Compose([\n            A.augmentations.transforms.GridDropout (ratio=0.25, \n                                            unit_size_min=None, \n                                            unit_size_max=None, \n                                            holes_number_x=None, \n                                            holes_number_y=None, \n                                            shift_x=0, \n                                            shift_y=0, \n                                            random_offset=False, \n                                            fill_value=0, \n                                            mask_fill_value=None, \n                                            always_apply=False, \n                                            p=1)\n             ])\n        return aug(image=image)['image']\ndef perspec(image):\n        aug = A.Compose([\n            A.augmentations.geometric.transforms.Perspective (scale=(0.02, 0.1),p=1)\n        ])\n        return aug(image=image)['image']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val=val.reset_index()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_image=val['path'].to_list()\nlist_image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"plt.imshow(dropout(cv2.imread(list_image[0])))\nplt.show()\nplt.imshow(rotate(cv2.imread(list_image[0])))\nplt.show()\nplt.imshow(flip_lr(cv2.imread(list_image[0])))"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"x_test=val1\n#model"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"def predict2(model,b):\n    test=[]\n    for i in b:\n        test.append(model.predict(np.expand_dims(i,axis=0))[0])\n    return test"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"y_test=val['label'].to_list()"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"def agg_acc(stacked,y_test):\n    #preds_f = np.stack((pred, pred_v))\n    predi=np.mean(stacked,axis=0)\n    preds = np.argmax(predi, axis=1)\n    #acc=np.mean(preds==y_test)\n    return accuracy_score(preds,y_test)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"val2=[]\nfor image in test_images:\n    img=np.expand_dims(((cv2.cvtColor(cv2.imread(TEST_DIR + image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred = model2.predict(img)+model.predict(img)\n    pred_v = model2.predict(flip_lr(img))+model.predict(flip_lr(img))\n    pred_k = model2.predict(rotate(img))+model.predict(rotate(img))\n    pred_h = model2.predict(flip_hor(img))+ model.predict(flip_hor(img))\n    pred_dropout = model2.predict(dropout(img))+model.predict(dropout(img))\n    preds_fhw = np.stack((pred, pred_h, pred_v, pred_dropout,pred_k))\n    predi=np.mean(preds_fhw,axis=0)\n    preds = np.argmax(predi, axis=1)\n    val2.append(preds[0])"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"val2=[]\nvalv=[]\nval1=[]\nvalk=[]\nvalh=[]\nvaldrop=[]\nvalfhw=[]\nfor image in list_image:\n    img=np.expand_dims(((cv2.cvtColor(cv2.imread(image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred = model2.predict(img)#+model.predict(img)\n    val1.append(np.argmax(pred, axis=1))\n    pred_v = model2.predict(flip_lr(img))#+model.predict(flip_lr(img))\n    pred_v=np.stack((pred_v,pred))\n    pred_v=np.mean(pred_v,axis=0)\n    valv.append(np.argmax(pred_v, axis=1)[0])\n    img2=np.expand_dims((rotate(cv2.cvtColor(cv2.imread(image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred_k = model2.predict(img2)#+model.predict(img2)\n    pred_k=np.stack((pred_k,pred))\n    pred_k=np.mean(pred_k,axis=0)\n    valk.append(np.argmax(pred_k, axis=1)[0])\n    pred_h = model2.predict(flip_hor(img))#+# model.predict(flip_hor(img))\n    pred_h=np.stack((pred_h,pred))\n    pred_h=np.mean(pred_h,axis=0)\n    valh.append(np.argmax(pred_h, axis=1)[0])\n    pred_dropout = model2.predict(dropout(img))#+model.predict(dropout(img))\n    pred_dropout = np.stack((pred,pred_dropout))\n    pred_dropout=np.mean(pred_dropout,axis=0)\n    valdrop.append(np.argmax(pred_dropout, axis=1)[0])\n    preds_fhw = np.stack((pred, pred_h, pred_v, pred_dropout,pred_k))\n    preds_fhw=np.mean(preds_fhw,axis=0)\n    valfhw.append(np.argmax(preds_fhw, axis=1)[0])\n"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"valtot=[val1,valv,valk,valh,valdrop,valfhw]\naccuracy1=[]\ny=[]\nfor i in val['label'].to_list():\n    y.append(int(i))\nfor i in range(len(valtot)):\n    accuracy1.append(accuracy_score(y,valtot[i]))\n\nplt.axis([-1,6, 0.83, 0.95])\nplt.title('accuracy with TTA')\nplt.bar(x=['base','vert','rotate','hor','dropout','all'],height=accuracy1)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"val2=[]\nvalv=[]\nval1=[]\nvalk=[]\nvalh=[]\nvaldrop=[]\nvalfhw=[]\nfor image in list_image:\n    img=np.expand_dims(((cv2.cvtColor(cv2.imread(image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred = model2.predict(img)+model.predict(img)\n    val1.append(np.argmax(pred, axis=1))\n    pred_v = model2.predict(flip_lr(img))+model.predict(flip_lr(img))\n    pred_v=np.stack((pred_v,pred))\n    pred_v=np.mean(pred_v,axis=0)\n    valv.append(np.argmax(pred_v, axis=1)[0])\n    img2=np.expand_dims((rotate(cv2.cvtColor(cv2.imread(image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred_k = model2.predict(img2)+model.predict(img2)\n    pred_k=np.stack((pred_k,pred))\n    pred_k=np.mean(pred_k,axis=0)\n    valk.append(np.argmax(pred_k, axis=1)[0])\n    pred_h = model2.predict(flip_hor(img))+ model.predict(flip_hor(img))\n    pred_h=np.stack((pred_h,pred))\n    pred_h=np.mean(pred_h,axis=0)\n    valh.append(np.argmax(pred_h, axis=1)[0])\n    pred_dropout = model2.predict(dropout(img))+model.predict(dropout(img))\n    pred_dropout = np.stack((pred,pred_dropout))\n    pred_dropout=np.mean(pred_dropout,axis=0)\n    valdrop.append(np.argmax(pred_dropout, axis=1)[0])\n    preds_fhw = np.stack((pred, pred_h, pred_v, pred_dropout,pred_k))\n    preds_fhw=np.mean(preds_fhw,axis=0)\n    valfhw.append(np.argmax(preds_fhw, axis=1)[0])"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"val2=[]\nvalv=[]\nval1=[]\nvalk=[]\nvalh=[]\nvaldrop=[]\nvalfhw=[]\nfor image in list_image:\n    img=np.expand_dims(((cv2.cvtColor(cv2.imread(image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred = model2.predict(img)+model.predict(img)\n    val1.append(np.argmax(pred, axis=1))\n    pred_v = model2.predict(flip_lr(img))+model.predict(flip_lr(img))\n    pred_v=np.stack((pred_v,pred))\n    pred_v=np.mean(pred_v,axis=0)\n    valv.append(np.argmax(pred_v, axis=1)[0])\n    img2=np.expand_dims((rotate(cv2.cvtColor(cv2.imread(image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred_k = model2.predict(img2)+model.predict(img2)\n    pred_k=np.stack((pred_k,pred))\n    pred_k=np.mean(pred_k,axis=0)\n    valk.append(np.argmax(pred_k, axis=1)[0])\n    pred_h = model2.predict(flip_hor(img))+ model.predict(flip_hor(img))\n    pred_h=np.stack((pred_h,pred))\n    pred_h=np.mean(pred_h,axis=0)\n    valh.append(np.argmax(pred_h, axis=1)[0])\n    pred_dropout = model2.predict(dropout(img))+model.predict(dropout(img))\n    pred_dropout = np.stack((pred,pred_dropout))\n    pred_dropout=np.mean(pred_dropout,axis=0)\n    valdrop.append(np.argmax(pred_dropout, axis=1)[0])\n    preds_fhw = np.stack((pred, pred_h, pred_v, pred_dropout,pred_k))\n    preds_fhw=np.mean(preds_fhw,axis=0)\n    valfhw.append(np.argmax(preds_fhw, axis=1)[0])"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"preds_hw = np.stack((pred, pred_dropout2))\nagg_acc(preds_hw, y_test)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"accuracy"},{"metadata":{"trusted":true},"cell_type":"code","source":"val2=[]\nfor image in test_images:\n    img=np.expand_dims(((cv2.cvtColor(cv2.imread(TEST_DIR + image),cv2.COLOR_BGR2RGB))),axis=0)\n    pred = model2.predict(img)+model.predict(img)\n    pred_v = model2.predict(flip_lr(img))+model.predict(flip_lr(img))\n    img2=rotate((cv2.cvtColor(cv2.imread(TEST_DIR + image),cv2.COLOR_BGR2RGB)))\n    img2=np.expand_dims(img2,axis=0)\n    pred_k = model2.predict(img2)+model.predict(img2)\n    pred_h = model2.predict(flip_hor(img))+ model.predict(flip_hor(img))\n    #pred_dropout = model2.predict(dropout(img))+model.predict(dropout(img))\n    preds_fhw = np.stack((pred, pred_h, pred_v,pred_k))\n    predi=np.mean(preds_fhw,axis=0)\n    preds = np.argmax(predi, axis=1)\n    val2.append(preds[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"pred = predict2(model2,val2)\n\npred_v = predict2(model2,transfor(flip_lr,val2))\n\npred_h = predict2(model2,transfor(flip_hor,val2))\npred_dropout = predict2(model2,transfor(dropout,val2))\n"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"preds_fhw = np.stack((pred, pred_h, pred_v, pred_dropout))\npredi=np.mean(preds_fhw,axis=0)\npreds = np.argmax(predi, axis=1)\n"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"for image in test_images:\n    \n    for i in range(len(tta)):\n        preds = model.predict_generator(train_datagen.flow\n        img=Image.open(TEST_DIR + image)\n        img = np.expand_dims(img, axis=0)\n    predictions.extend((model.predict(img)+model2.predict(img)).argmax(axis = 1))"},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame({'image_id': test_images, 'label': val2})\nsubmission.to_csv('submission.csv', index = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}