{"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":"from fastai.vision.all import *\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport tensorflow as tf \nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import AveragePooling2D, Conv2D, Input, Dense, Dropout,MaxPooling2D \nimport tensorflow_addons as tfa\n \nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'  ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-20T13:51:49.536874Z","iopub.execute_input":"2022-05-20T13:51:49.537194Z","iopub.status.idle":"2022-05-20T13:51:57.187195Z","shell.execute_reply.started":"2022-05-20T13:51:49.537115Z","shell.execute_reply":"2022-05-20T13:51:57.186443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PATH_DATASET  = '../input/sorghum-id-fgvc-9'\nINPUT_HEIGHT = 512 \nINPUT_WIDTH  = 512\nPATH_MODEL  = '../input/clf-plnt-06' ","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:51:57.188825Z","iopub.execute_input":"2022-05-20T13:51:57.18908Z","iopub.status.idle":"2022-05-20T13:51:57.195192Z","shell.execute_reply.started":"2022-05-20T13:51:57.189045Z","shell.execute_reply":"2022-05-20T13:51:57.192509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_df = pd.read_csv( os.path.join(PATH_DATASET,'train_cultivar_mapping.csv'))\ndataset_df = dataset_df.dropna()\ncls_str = sorted(dataset_df[\"cultivar\"].unique()) \nnum_classes = len(cls_str)\nindex_to_cls_str = dict(zip( range(num_classes)   ,cls_str ))","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:51:57.196477Z","iopub.execute_input":"2022-05-20T13:51:57.196926Z","iopub.status.idle":"2022-05-20T13:51:57.261237Z","shell.execute_reply.started":"2022-05-20T13:51:57.19689Z","shell.execute_reply":"2022-05-20T13:51:57.260547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clf = keras.models.load_model(PATH_MODEL)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:51:57.264529Z","iopub.execute_input":"2022-05-20T13:51:57.264749Z","iopub.status.idle":"2022-05-20T13:52:17.450082Z","shell.execute_reply.started":"2022-05-20T13:51:57.264725Z","shell.execute_reply":"2022-05-20T13:52:17.449331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AugmentationLayer(tf.keras.layers.Layer):\n    def __init__(self, processing):\n        super(AugmentationLayer, self).__init__()\n        self.processing = processing\n    def call(self, inputs):\n        return self.processing(inputs)\n    \ndef crop_impage(image):\n    image = tf.image.central_crop(image, 0.95)\n    image = tf.image.resize(image, ( INPUT_HEIGHT  , INPUT_WIDTH))\n    return image\n\ndef create_ttl_model(model, augmentations):\n    inputs = keras.Input(shape=(INPUT_HEIGHT, INPUT_WIDTH, 3))\n    outputs = []\n    for augmentation in augmentations: \n        x = AugmentationLayer(crop_impage)(inputs)\n        x = clf(x)\n        outputs.append(x)\n    x = clf(inputs)\n    outputs.append(x)\n    outputs = tf.keras.layers.Average()(outputs)\n    return keras.Model(inputs, outputs)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:52:17.451315Z","iopub.execute_input":"2022-05-20T13:52:17.451914Z","iopub.status.idle":"2022-05-20T13:52:17.461972Z","shell.execute_reply.started":"2022-05-20T13:52:17.451876Z","shell.execute_reply":"2022-05-20T13:52:17.461258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 0.604 => 0.612  crop , flip_left_right , original \n# 0.604 => 0.600  crop , flip_left_right , original ,rot90, brightness(0.1) ,contrast(2.) contrast(0.5)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:52:17.463451Z","iopub.execute_input":"2022-05-20T13:52:17.463769Z","iopub.status.idle":"2022-05-20T13:52:17.471582Z","shell.execute_reply.started":"2022-05-20T13:52:17.463734Z","shell.execute_reply":"2022-05-20T13:52:17.470752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ttl_clf = create_ttl_model(clf,[tf.image.flip_left_right,\n                               crop_impage,\n                               tf.image.rot90,\n                               tf.image.flip_up_down])\n                                   \n                                 \nttl_clf.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:52:17.472939Z","iopub.execute_input":"2022-05-20T13:52:17.47327Z","iopub.status.idle":"2022-05-20T13:52:21.639699Z","shell.execute_reply.started":"2022-05-20T13:52:17.473231Z","shell.execute_reply":"2022-05-20T13:52:21.639005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.DataFrame ( glob.glob( os.path.join(PATH_DATASET,\"test\", '*.png') ), columns=['path'])\ndf_test['filename'] = df_test['path'].apply(lambda x: x.split('/')[-1])\n\n# need clear: preprocessing_function = lambda x : x[:,:,::-1]\ntest_datagen = tf.keras.preprocessing.image.ImageDataGenerator( preprocessing_function = lambda x : x[:,:,::-1])\ntest_generator = test_datagen.flow_from_dataframe(df_test,\n                                                  x_col='path',\n                                                  target_size=(INPUT_HEIGHT, INPUT_WIDTH),\n                                                  y_col=None,\n                                                  shuffle = False,\n                                                  class_mode=None,\n                                                  batch_size=1)\nfilenames = test_generator.filenames\nnb_samples = len(filenames)\n\n\npredict = ttl_clf.predict_generator(test_generator,steps = nb_samples,verbose=1)\n\ndf_test['class']  = list(map(np.argmax,predict))\ndf_test['cultivar'] = df_test['class'].apply(lambda x: index_to_cls_str[x])\nans = df_test.drop(columns=['path', 'class'])\nans.to_csv(\"submission.csv\",index=False)\nans","metadata":{"execution":{"iopub.status.busy":"2022-05-20T13:52:21.643443Z","iopub.execute_input":"2022-05-20T13:52:21.64566Z","iopub.status.idle":"2022-05-20T14:31:13.939507Z","shell.execute_reply.started":"2022-05-20T13:52:21.64562Z","shell.execute_reply":"2022-05-20T14:31:13.938793Z"},"trusted":true},"execution_count":null,"outputs":[]}]}