{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import tensorflow as tf\nfrom math import ceil\nimport cv2\nimport matplotlib.pyplot as plt\nfrom albumentations import RandomCrop, Compose, HorizontalFlip, VerticalFlip, OneOf\nfrom sklearn.model_selection import StratifiedKFold\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer, GlobalAveragePooling2D, Input, BatchNormalization\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.models import Model\n\nimport tensorflow as tf\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom tensorflow.keras.applications import ResNet50, InceptionResNetV2\nfrom tensorflow.keras.layers import Dense, Input, Lambda\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.optimizers import Adam","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# def create_model(input_shape):\n#     input = Input(shape = input_shape)\n    \n#     #Create and complite model and show sumarry\n    \n#     x_model = ResNet50(weights = None, include_top = False, input_tensor = input, pooling = None,\n#                             classes = None)\n#     for layer in x_model.layers:\n#         layer.trainable = True\n        \n#     x = GlobalAveragePooling2D()(x_model.output)\n#     x = BatchNormalization()(x)\n    \n#     x = Dense(1024, activation = \"relu\")(x)\n#     x = BatchNormalization()(x)\n#     x = Dense(512, activation = \"relu\")(x)\n    \n#     healthy = Dense(5, activation = \"softmax\", name=\"output_layer\")(x)\n    \n#     model = Model(inputs = x_model.input, outputs = healthy)\n    \n#     return model ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gm_exp = tf.Variable(3.0, dtype = tf.float32)\ndef generalized_mean_pool_2d(X):\n    pool = (tf.reduce_mean(tf.abs(X**(gm_exp)),\n                                axis = [1, 2],\n                                keepdims = False) + 1.e-7)**(1./gm_exp)\n    return pool\n\n\ndef create_model(input_shape):\n    input = Input(shape = input_shape)\n\n    #Create and complite model and show summary\n\n    x_model = ResNet50(weights = None , include_top = False, input_tensor = input, pooling = None,\n                        classes = None)\n    for layer in x_model.layers:\n        layer.trainable = True\n\n    # Gem\n    lambda_layer = Lambda(generalized_mean_pool_2d)\n    lambda_layer.trainable_weights.extend([gm_exp])\n    x = lambda_layer(x_model.output)\n\n    #output\n    # x = Dense(1024, activation = \"relu\")(x)\n    # x = Dense(512, activation = \"relu\")(x)\n\n    #output\n    healthy = Dense(5, activation = 'softmax', name = 'plan_diseases')(x)\n\n\n    #model\n    model = Model(inputs = x_model.input, outputs = healthy )\n\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"path = \"/kaggle/input/cassava-leaf-disease-classification/\"\nimg_dir = path + \"test_images/\"\nsample_submission = pd.read_csv(\"../input/cassava-leaf-disease-classification/sample_submission.csv\")\n# train = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\n# sample_submission = pd.DataFrame()\n# sample_submission['image_id'] = train['image_id']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"### HELPER FUNCTIONS\n\ndef pred_checker(m, arr):\n    for index, i in enumerate(arr):\n        if i == m:\n            return index + 1\n    \ndef max_in_numpy(arr):\n    m = arr[0]\n    for i in arr:\n        if m < i:\n            m = i\n    return m","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"### TEST_DATA_GENERATOR\n# augmentation should be function already, ec HorizontalFlip()\ndef _read(path):\n    img = cv2.imread(path)    \n    return img\n\nclass TestDataGenerator(tf.keras.utils.Sequence):\n    \n# img_dir deleted, restore if needed.    \n    \n    def __init__(self , X_set, ids, augmentation = None, img_dir = \"../input/cassava-leaf-disease-classification/test_images/\",\n                                                            batch_size = 8, img_size = (224,224,3), do_aug = False):\n        self.X = X_set\n        self.batch_size = batch_size\n        self.ids = ids\n        self.img_size  = img_size  \n        self.img_dir = img_dir\n        self.on_epoch_end()\n        self.augmentation = augmentation\n        self.do_aug = do_aug\n        \n            \n    def __len__(self):\n        return int(ceil(len(self.ids)/self.batch_size))\n\n    def __getitem__(self, index):\n        indices = self.ids[index*self.batch_size:(index+1)*self.batch_size]\n        X = self.__generator__(indices)\n        return X\n    \n    def on_epoch_end(self):\n        self.indices = np.arange(len(self.ids))\n        \n\n    def __generator__(self, indices):\n        X = np.empty((self.batch_size, *self.img_size))\n        for i, index in enumerate(indices):\n            ID = self.X['image_id'][index]\n            image = cv2.imread(self.img_dir + self.X['image_id'][i])\n            image = cv2.resize(image, (224,224))\n            if self.do_aug:\n                for augments in self.augmentation:\n                    image = augments(image=image)['image']\n            X[i,] = image/255\n        return X\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# ids_test = sample_submission.index\n# X_set = sample_submission\n# for X in TestDataGenerator(X_set,ids_test, img_dir=img_dir, do_aug=True,\n#                             augmentation=[VerticalFlip()]):\n#     break\n    \n\n# print(X.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# prediction = []\n# prediction_horizontal = []\n# prediction_vertical = []\n# prediction_h_v = []\n# names = [\"0_Cassava_Leaf_Disease_solo_seresnet50 (1).h5\", \"1_Cassava_Leaf_Disease_solo_seresnet50 (1).h5\", \"2_Cassava_Leaf_Disease_solo_seresnet50 (1).h5\"]\n# test_set = sample_submission\n# del test_set[\"label\"]\n# ids = sample_submission.index\n# for i in names:\n#     model = create_model((224, 224, 3))\n#     model.load_weights(\"../input/weights/\" + i)\n#     data_generator = TestDataGenerator(X_set = test_set, ids = ids, batch_size = 1)\n    \n# #     data_generator_horizontal = TestDataGenerator(X_set = test_set, ids = ids, batch_size = 1,\n# #                                                   augmentation = [HorizontalFlip()], do_aug = True)\n    \n# #     data_generator_vertical = TestDataGenerator(X_set = test_set, ids = ids, batch_size = 1,\n# #                                                 augmentation = [VerticalFlip()], do_aug = True)\n    \n# #     data_generator_v_h = TestDataGenerator(X_set = test_set, ids = ids, batch_size = 1,\n# #                                           augmentation = [HorizontalFlip(), VerticalFlip()])\n    \n    \n    \n    \n#     pred = model.predict_generator(data_generator, verbose = 1)\n# #     pred_h = model.predict_generator(data_generator_horizontal, verbose = 1)\n# #     pred_v = model.predict_generator(data_generator_vertical, verbose = 1)\n# #     pred_h_v = model.predict_generator(data_generator_v_h, verbose = 1)\n# #    all_current_preds = (pred)\n#     prediction.append(pred)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_set = sample_submission\ndel X_set['label']\npath_weights = \"../input/weights/\"\nmodels = os.listdir(path_weights)\nids_test = sample_submission.index","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndata_generator_test = TestDataGenerator(X_set, ids_test, img_dir=img_dir)\ndata_generator_test_v = TestDataGenerator(X_set, ids_test, img_dir=img_dir, do_aug = True, \n                                          augmentation = [HorizontalFlip()])\ndata_generator_test_h = TestDataGenerator(X_set, ids_test, img_dir=img_dir, do_aug = True, \n                                          augmentation = [VerticalFlip()])\ndata_generator_test_h_v = TestDataGenerator(X_set, ids_test, img_dir=img_dir, do_aug = True, \n                                          augmentation = [VerticalFlip(), HorizontalFlip()])\nall_pred = []\ninput_shape = (224, 224, 3) ### I FORGOT THE FUCKIN SIZE LOL\n\nfor w in models:\n    model = create_model(input_shape)\n    model.load_weights(path_weights + w)\n    preds = model.predict_generator(data_generator_test, verbose = 1)\n    preds_v = model.predict_generator(data_generator_test_v, verbose = 1)\n    preds_h = model.predict_generator(data_generator_test_h, verbose = 1)\n    preds_h_v = model.predict_generator(data_generator_test_h_v, verbose = 1)\n    preds_v = preds_v[:sample_submission.shape[0]]\n    preds_h = preds_h[:sample_submission.shape[0]]\n    preds_h_v = preds_h_v[:sample_submission.shape[0]]\n    preds = preds[:sample_submission.shape[0]]\n    preds = (preds + preds_v + preds_h + preds_h_v) / 4\n    all_pred.append(preds)\n    \nsum_pred = 0\nfor p in all_pred:\n    sum_pred += p\nsum_pred = sum_pred/len(all_pred)\n\ndiagnos = []\nfor pr in sum_pred:\n    diagnos.append(np.argmax(np.array(pr)))  \n    \nsample_submission.label = diagnos","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"all_pred","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{"trusted":true},"cell_type":"code","source":"# from sklearn.metrics import accuracy_score\n# predicted = sample_submission.label\n# truth = train.head(100).label\n# accuracy_score(truth, predicted)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_submission['label'] = diagnos","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_submission.to_csv('submission.csv', index = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# prediction = []\n# ids = sample_submission.index\n# test_set = sample_submission\n# data_generator_test = TestDataGenerator(X_set = test_set, ids = ids, batch_size = 1)\n# pred = model.predict_generator(data_generator_test, verbose = 1)\n# for i in pred:\n#     m = max_in_numpy(i)\n#     ind = pred_checker(m, i)\n#     prediction.append(ind)\n# sample_submission['label'] = prediction\n# sample_submission","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# img = cv2.imread(\"../kaggle/input/cassava-leaf-disease-classification/test_images/2216849948.jpg\")\n# img2 = cv2.imread(\"../input/cassava-leaf-disease-classification/test_images/2216849948.jpg\")\n# print(img)\n# print(img2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# normal_image = cv2.imread(\"../input/cassava-leaf-disease-classification/test_images/2216849948.jpg\")\n# plt.imshow(normal_image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# a = [ VerticalFlip()]\n# image = cv2.imread(\"../input/cassava-leaf-disease-classification/test_images/2216849948.jpg\")\n# for i in a:\n#     image = i(image=image)[\"image\"]\n# plt.imshow(image)","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}