{"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 pandas as pd\nimport numpy as np\nimport os\nprint('number of training image')\nprint(len([name for name in os.listdir('/kaggle/input/plant-pathology-2021-fgvc8/train_images/')]))\nprint(len([name for name in os.listdir('/kaggle/input/plant-pathology-2021-fgvc8/test_images/')]))\ntraining_csv = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\ntraining_class = np.array([])\nfor labels in pd.unique(training_csv['labels']):\n    training_class = np.append(training_class,labels.split())\ntraining_class = np.unique(training_class)\nprint('\\nnumber of class')\nprint(training_class)\nprint(len(training_class))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict2strings(pred, threshold):\n    t = np.array(threshold)\n    return ' '.join(training_class[np.where(pred >= t)])\n\ndef predict2n_hot(pred, threshold):\n    t = np.array(threshold)\n    return np.where(pred >= t,np.ones(pred.shape),np.zeros(pred.shape))\n\ndef n_hot2string(n_hot):\n    return ' '.join(training_class[np.where(n_hot >= 1)])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nmodel_input = tf.keras.layers.Input(shape=(299, 299, 3))\nxception_layer = tf.keras.applications.Xception(\n    include_top=False,\n    weights=None,\n    input_shape= (299, 299, 3),\n    input_tensor= model_input\n).output\nat = tf.keras.layers.Conv2D(2048,3,padding='same',activation = 'relu', )(xception_layer)\nat = tf.keras.layers.BatchNormalization()(at)\nat = tf.keras.layers.Conv2D(2048,1,padding='same',activation = 'relu')(at)\nat = tf.keras.layers.BatchNormalization()(at)\nat = tf.keras.layers.Conv2D(1,1,padding='same',activation = 'relu')(at)\nattention_heatmap = tf.keras.layers.Softmax(name = 'attention_layer')(at)\nattention = tf.keras.layers.Multiply()([attention_heatmap,xception_layer])\nfusion_attention_spectrum = tf.keras.layers.Add()([attention,xception_layer])\nfusion_attention_spectrum = tf.keras.layers.BatchNormalization()(fusion_attention_spectrum)\nfc_1 = tf.keras.layers.Flatten()(fusion_attention_spectrum)\nfc_1 = tf.keras.layers.Dense(2048, activation = 'relu')(fc_1)\nfc_1 = tf.keras.layers.BatchNormalization()(fc_1)\nfc_2 = tf.keras.layers.Dense(4096 + 2048, activation = 'relu')(fc_1)\nfc_2 = tf.keras.layers.BatchNormalization()(fc_2)\naverage_pooling = tf.keras.layers.GlobalAveragePooling2D()(fusion_attention_spectrum)\nfc_2 = tf.keras.layers.concatenate([fc_2,average_pooling])\nmodel_output = tf.keras.layers.Dense(len(training_class),activation = 'sigmoid')(fc_2)\nmodel = tf.keras.Model(inputs = model_input,outputs = model_output)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_weights('../input/fork-of-cs5489-project-train-cont-12/my_model/attention_1')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"threshold =[0.9151549935340881, 0.028693564236164093, 0.22229868173599243, 0.987423300743103, 0.18797093629837036, 0.6855853796005249]\ntest_img_path = '../input/plant-pathology-2021-fgvc8/test_images/'\ndef write_csv_kaggle_tags():\n    import csv\n    tmp = [['image', 'labels']]\n    \n    for path in os.listdir(test_img_path):\n        image = tf.keras.preprocessing.image.load_img(test_img_path + path, target_size=(299,299))\n        image = tf.keras.preprocessing.image.img_to_array(image)\n        image = tf.image.per_image_standardization(image)\n        image = tf.expand_dims(image, axis=0,)\n        test_predscore = model(image)[0]\n        row = [path, predict2strings(test_predscore, threshold = threshold)]\n        tmp.append(row)\n    f = open(\"submission.csv\", 'w')\n    tmp\n    writer = csv.writer(f)\n    writer.writerows(tmp)\n    f.close()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"write_csv_kaggle_tags()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}