{"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 tensorflow as tf\nimport os","metadata":{"execution":{"iopub.status.busy":"2022-08-10T01:45:38.034395Z","iopub.execute_input":"2022-08-10T01:45:38.034805Z","iopub.status.idle":"2022-08-10T01:45:38.039595Z","shell.execute_reply.started":"2022-08-10T01:45:38.034741Z","shell.execute_reply":"2022-08-10T01:45:38.038574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Hyperparameters\noutput_dir = \"./\"\ntest_dir = \"../input/plant-pathology-2021-fgvc8/test_images/\"\nefficientB7 = \"../input/efficientb7/effb7\"\nefficientB7_weights = \"../input/conve01/eff7-e12/epoch-12\"\nresnet50 = \"../input/resnet50/Model-Resnet\"\nresnet50_weights = \"../input/resnet50weights/last_epoch-20\"\ninceptionv3 = \"../input/inceptionv3/Model-InceptionV3\"\ninceptionv3_weights = \"../input/inceptionv3-weights/epoch-12\"\n\nimage_dims = (300,300,3)\ndata_set = pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")\ndf_labels = data_set['labels']\none_hot = df_labels.str.get_dummies(sep=\" \")\ndataset_labels = one_hot.columns.to_list()\ntf.__version__","metadata":{"execution":{"iopub.status.busy":"2022-08-10T01:45:38.061880Z","iopub.execute_input":"2022-08-10T01:45:38.062528Z","iopub.status.idle":"2022-08-10T01:45:38.161298Z","shell.execute_reply.started":"2022-08-10T01:45:38.062493Z","shell.execute_reply":"2022-08-10T01:45:38.160432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import concat\nfrom tensorflow.keras import Sequential, Model\nfrom tensorflow.keras.layers import Dense, Flatten, BatchNormalization, Dropout, GlobalMaxPool2D, Conv2D, InputLayer\n\nclass MultiLabel(Model):\n    def __init__(self):\n        super().__init__()\n        self.model_backbone = tf.keras.models.load_model(filepath=resnet50)\n        self.model = Sequential()\n        self.model.add(InputLayer(input_shape=image_dims))\n        self.model.add(self.model_backbone)\n        self.model.add(Conv2D(filters=1024, kernel_size=(1, 1), padding='same'))\n        self.model.add(BatchNormalization(momentum=0.7))\n        self.model.add(Dropout(0.2))\n        self.model.add(Conv2D(filters=256, kernel_size=(1, 1), padding='same'))\n        self.model.add(BatchNormalization(momentum=0.7))\n        self.model.add(Dropout(0.1))\n        self.model.add(Conv2D(filters=128, kernel_size=(1, 1), padding='same'))\n        self.model.add(GlobalMaxPool2D())\n        self.model.add(Dense(units=6, activation='sigmoid'))\n\n\n    def call(self, predict_input):\n        predict_output = self.model(predict_input)\n        return predict_output\n\n    def create_model(self):\n        return self.model\n    \n\nclass MultiLabel_2(Model):\n    def __init__(self):\n        super().__init__()\n        self.model_backbone = tf.keras.models.load_model(filepath=inceptionv3)\n        self.model = Sequential()\n        self.model.add(InputLayer(input_shape=image_dims))\n        self.model.add(self.model_backbone)\n        self.model.add(Conv2D(filters=1024, kernel_size=(1, 1), padding='same'))\n        self.model.add(BatchNormalization(momentum=0.7))\n        self.model.add(Dropout(0.2))\n        self.model.add(Conv2D(filters=1024, kernel_size=(1, 1), padding='same'))\n        self.model.add(Conv2D(filters=2400, kernel_size=(1, 1), padding='same'))\n\n        self.model_pred1_2 = Conv2D(filters=256, kernel_size=(1, 1), padding='same')\n        self.model_pred1_3 = BatchNormalization()\n        self.model_pred1_4 = Conv2D(filters=128, kernel_size=(1, 1), padding='same')\n        self.model_pred1_5 = GlobalMaxPool2D()\n        self.model_pred1_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred2_2 = Conv2D(filters=256, kernel_size=(1, 1), padding='same')\n        self.model_pred2_3 = BatchNormalization()\n        self.model_pred2_4 = Conv2D(filters=128, kernel_size=(1, 1), padding='same')\n        self.model_pred2_5 = GlobalMaxPool2D()\n        self.model_pred2_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred3_2 = Conv2D(filters=256, kernel_size=(1, 1), padding='same')\n        self.model_pred3_3 = BatchNormalization()\n        self.model_pred3_4 = Conv2D(filters=128, kernel_size=(1, 1), padding='same')\n        self.model_pred3_5 = GlobalMaxPool2D()\n        self.model_pred3_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred4_2 = Conv2D(filters=256, kernel_size=(1, 1), padding='same')\n        self.model_pred4_3 = BatchNormalization()\n        self.model_pred4_4 = Conv2D(filters=128, kernel_size=(1, 1), padding='same')\n        self.model_pred4_5 = GlobalMaxPool2D()\n        self.model_pred4_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred5_2 = Conv2D(filters=256, kernel_size=(1, 1), padding='same')\n        self.model_pred5_3 = BatchNormalization()\n        self.model_pred5_4 = Conv2D(filters=128, kernel_size=(1, 1), padding='same')\n        self.model_pred5_5 = GlobalMaxPool2D()\n        self.model_pred5_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred6_2 = Conv2D(filters=256, kernel_size=(1, 1), padding='same')\n        self.model_pred6_3 = BatchNormalization()\n        self.model_pred6_4 = Conv2D(filters=128, kernel_size=(1, 1), padding='same')\n        self.model_pred6_5 = GlobalMaxPool2D()\n        self.model_pred6_6 = Dense(units=1, activation='sigmoid')\n\n    def call(self, predict_input):\n        predict_output = self.model(predict_input)\n        pred_1 = predict_output[:, :, :, :400]\n        pred_2 = predict_output[:, :, :, 400:800]\n        pred_3 = predict_output[:, :, :, 800:1200]\n        pred_4 = predict_output[:, :, :, 1200:1600]\n        pred_5 = predict_output[:, :, :, 1600:2000]\n        pred_6 = predict_output[:, :, :, 2000:2400]\n\n        pred_1 = self.model_pred1_2(pred_1)\n        pred_1 = self.model_pred1_3(pred_1)\n        pred_1 = self.model_pred1_4(pred_1)\n        pred_1 = self.model_pred1_5(pred_1)\n        pred_1 = self.model_pred1_6(pred_1)\n\n        pred_2 = self.model_pred2_2(pred_2)\n        pred_2 = self.model_pred2_3(pred_2)\n        pred_2 = self.model_pred2_4(pred_2)\n        pred_2 = self.model_pred2_5(pred_2)\n        pred_2 = self.model_pred2_6(pred_2)\n\n        pred_3 = self.model_pred3_2(pred_3)\n        pred_3 = self.model_pred3_3(pred_3)\n        pred_3 = self.model_pred3_4(pred_3)\n        pred_3 = self.model_pred3_5(pred_3)\n        pred_3 = self.model_pred3_6(pred_3)\n\n        pred_4 = self.model_pred4_2(pred_4)\n        pred_4 = self.model_pred4_3(pred_4)\n        pred_4 = self.model_pred4_4(pred_4)\n        pred_4 = self.model_pred4_5(pred_4)\n        pred_4 = self.model_pred4_6(pred_4)\n\n        pred_5 = self.model_pred5_2(pred_5)\n        pred_5 = self.model_pred5_3(pred_5)\n        pred_5 = self.model_pred5_4(pred_5)\n        pred_5 = self.model_pred5_5(pred_5)\n        pred_5 = self.model_pred5_6(pred_5)\n\n        pred_6 = self.model_pred6_2(pred_6)\n        pred_6 = self.model_pred6_3(pred_6)\n        pred_6 = self.model_pred6_4(pred_6)\n        pred_6 = self.model_pred6_5(pred_6)\n        pred_6 = self.model_pred6_6(pred_6)\n\n        return concat([pred_1, pred_2, pred_3, pred_4, pred_5, pred_6], axis=1)\n\n    def create_model(self):\n        return self.model\n    \nclass MultiLabel_3(Model):\n    def __init__(self):\n        super().__init__()\n        self.model_backbone = tf.keras.models.load_model(efficientB7)\n        self.model = Sequential()\n        self.model.add(InputLayer(input_shape=image_dims))\n        self.model.add(self.model_backbone)\n        self.model.add(Conv2D(filters=1024, kernel_size=(1, 1), padding='same'))\n        self.model.add(BatchNormalization(momentum=0.7))\n        self.model.add(Dropout(0.2))\n        self.model.add(Conv2D(filters=1024, kernel_size=(1, 1), padding='same'))\n        self.model.add(Conv2D(filters=2400, kernel_size=(1, 1), padding='same'))\n\n        self.model_pred1_2 = Conv2D(filters=1024, kernel_size=(1, 1), padding='same')\n        self.model_pred1_3 = BatchNormalization()\n        self.model_pred1_4 = Conv2D(filters=512, kernel_size=(1, 1), padding='same')\n        self.model_pred1_5 = GlobalMaxPool2D()\n        self.model_pred1_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred2_2 = Conv2D(filters=1024, kernel_size=(1,1), padding='same')\n        self.model_pred2_3 = BatchNormalization()\n        self.model_pred2_4 = Conv2D(filters=512, kernel_size=(1,1), padding='same')\n        self.model_pred2_5 = GlobalMaxPool2D()\n        self.model_pred2_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred3_2 = Conv2D(filters=1024, kernel_size=(1,1), padding='same')\n        self.model_pred3_3 = BatchNormalization()\n        self.model_pred3_4 = Conv2D(filters=512, kernel_size=(1,1), padding='same')\n        self.model_pred3_5 = GlobalMaxPool2D()\n        self.model_pred3_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred4_2 = Conv2D(filters=1024, kernel_size=(1,1), padding='same')\n        self.model_pred4_3 = BatchNormalization()\n        self.model_pred4_4 = Conv2D(filters=512, kernel_size=(1,1), padding='same')\n        self.model_pred4_5 = GlobalMaxPool2D()\n        self.model_pred4_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred5_2 = Conv2D(filters=1024, kernel_size=(1,1), padding='same')\n        self.model_pred5_3 = BatchNormalization()\n        self.model_pred5_4 = Conv2D(filters=512, kernel_size=(1,1), padding='same')\n        self.model_pred5_5 = GlobalMaxPool2D()\n        self.model_pred5_6 = Dense(units=1, activation='sigmoid')\n\n        self.model_pred6_2 = Conv2D(filters=1024, kernel_size=(1,1), padding='same')\n        self.model_pred6_3 = BatchNormalization()\n        self.model_pred6_4 = Conv2D(filters=512, kernel_size=(1,1), padding='same')\n        self.model_pred6_5 = GlobalMaxPool2D()\n        self.model_pred6_6 = Dense(units=1, activation='sigmoid')\n\n    def call(self, predict_input):\n        predict_output = self.model(predict_input)\n        pred_1 = predict_output[:, :, :, :400]\n        pred_2 = predict_output[:, :, :, 400:800]\n        pred_3 = predict_output[:, :, :, 800:1200]\n        pred_4 = predict_output[:, :, :, 1200:1600]\n        pred_5 = predict_output[:, :, :, 1600:2000]\n        pred_6 = predict_output[:, :, :, 2000:2400]\n\n        pred_1 = self.model_pred1_2(pred_1)\n        pred_1 = self.model_pred1_3(pred_1)\n        pred_1 = self.model_pred1_4(pred_1)\n        pred_1 = self.model_pred1_5(pred_1)\n        pred_1 = self.model_pred1_6(pred_1)\n\n        pred_2 = self.model_pred2_2(pred_2)\n        pred_2 = self.model_pred2_3(pred_2)\n        pred_2 = self.model_pred2_4(pred_2)\n        pred_2 = self.model_pred2_5(pred_2)\n        pred_2 = self.model_pred2_6(pred_2)\n\n        pred_3 = self.model_pred3_2(pred_3)\n        pred_3 = self.model_pred3_3(pred_3)\n        pred_3 = self.model_pred3_4(pred_3)\n        pred_3 = self.model_pred3_5(pred_3)\n        pred_3 = self.model_pred3_6(pred_3)\n\n        pred_4 = self.model_pred4_2(pred_4)\n        pred_4 = self.model_pred4_3(pred_4)\n        pred_4 = self.model_pred4_4(pred_4)\n        pred_4 = self.model_pred4_5(pred_4)\n        pred_4 = self.model_pred4_6(pred_4)\n\n        pred_5 = self.model_pred5_2(pred_5)\n        pred_5 = self.model_pred5_3(pred_5)\n        pred_5 = self.model_pred5_4(pred_5)\n        pred_5 = self.model_pred5_5(pred_5)\n        pred_5 = self.model_pred5_6(pred_5)\n\n        pred_6 = self.model_pred6_2(pred_6)\n        pred_6 = self.model_pred6_3(pred_6)\n        pred_6 = self.model_pred6_4(pred_6)\n        pred_6 = self.model_pred6_5(pred_6)\n        pred_6 = self.model_pred6_6(pred_6)\n\n        return concat([pred_1, pred_2, pred_3, pred_4, pred_5, pred_6], axis=1)\n\n    def create_model(self):\n        return self.model\n","metadata":{"execution":{"iopub.status.busy":"2022-08-10T01:45:38.165940Z","iopub.execute_input":"2022-08-10T01:45:38.168129Z","iopub.status.idle":"2022-08-10T01:45:38.235535Z","shell.execute_reply.started":"2022-08-10T01:45:38.168093Z","shell.execute_reply":"2022-08-10T01:45:38.234377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if __name__ == '__main__':\n\n    # Initialization of model and data creator class.\n    model = MultiLabel_3()\n    model.build(input_shape=[None, image_dims[0], image_dims[1], image_dims[2]])\n    model.load_weights(efficientB7_weights)\n    images_path_list = sorted(list(os.listdir(test_dir)))\n    def test_on_sub (index):\n        input_img = tf.io.read_file(test_dir+images_path_list[index])\n        image = tf.io.decode_image(contents=input_img, channels=3, dtype=tf.dtypes.float32)\n        tensor_image = tf.image.resize(image, [image_dims[0], image_dims[1]])\n        name_jpg = images_path_list[index].split(os.path.sep)[-1]\n        return name_jpg, tf.expand_dims(tensor_image, axis=0)\n    \n    values = []\n    for i in range(len(images_path_list)):\n        name, images = test_on_sub(index=i)\n        images = images * 255 #for efficiency model, as it have and normalization layer.\n        test_values = model.call(images)\n        print(test_values)\n        index_values = [i for i, v in enumerate(test_values[0]) if v > 0.5]\n        classes = dataset_labels\n        classes_img = \"\"\n        for i in index_values:\n            classes_img = str(classes[i])+\" \"+classes_img\n        values.append([name, classes_img])\n    csv_pd = pd.DataFrame(values, columns=['image', 'labels'], index=None)\n    csv_pd.to_csv(output_dir + 'submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T01:45:38.239453Z","iopub.execute_input":"2022-08-10T01:45:38.247649Z","iopub.status.idle":"2022-08-10T01:46:41.751607Z","shell.execute_reply.started":"2022-08-10T01:45:38.247618Z","shell.execute_reply":"2022-08-10T01:46:41.750458Z"},"trusted":true},"execution_count":null,"outputs":[]}]}