{"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 google.colab import drive\n# drive.mount('/content/drive')","metadata":{"id":"r2mXLt5-v2s0","outputId":"55895393-761a-4e24-9a17-03aacc200ad1"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ! mkdir -p plant-pathology-2021-fgvc8\n# ! unzip -q ../input/cut500-350 -d plant-pathology-2021-fgvc8","metadata":{"id":"p3wl2fkx_12t","execution":{"iopub.status.busy":"2021-07-15T04:18:30.649135Z","iopub.execute_input":"2021-07-15T04:18:30.649491Z","iopub.status.idle":"2021-07-15T04:18:31.911174Z","shell.execute_reply.started":"2021-07-15T04:18:30.64945Z","shell.execute_reply":"2021-07-15T04:18:31.910277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\ntrain = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\n# train = pd.read_csv('/content/drive/MyDrive/01python工研院課程/專題/data/train.csv')\n\ntrain.head()","metadata":{"id":"Q19brw5I4lZJ","outputId":"9c27e717-9bb0-4cca-aac2-9369cdf9e2a2","execution":{"iopub.status.busy":"2021-07-15T08:52:28.894951Z","iopub.execute_input":"2021-07-15T08:52:28.895261Z","iopub.status.idle":"2021-07-15T08:52:29.023008Z","shell.execute_reply.started":"2021-07-15T08:52:28.895185Z","shell.execute_reply":"2021-07-15T08:52:29.022082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import MultiLabelBinarizer\nmb = MultiLabelBinarizer().fit(train.labels.apply(lambda x : x.split()))\nlabels = pd.DataFrame(mb.transform(train.labels.apply(lambda x : x.split())), columns = mb.classes_)\nnew_train = pd.concat([train['image'], labels], axis=1)\nnew_train.head()","metadata":{"id":"jd8rLNbw4lZN","outputId":"e6db6644-f276-42d5-fc2b-c13821b7b598","execution":{"iopub.status.busy":"2021-07-15T08:52:36.873516Z","iopub.execute_input":"2021-07-15T08:52:36.873880Z","iopub.status.idle":"2021-07-15T08:52:37.772016Z","shell.execute_reply.started":"2021-07-15T08:52:36.873849Z","shell.execute_reply":"2021-07-15T08:52:37.768707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\npre = ImageDataGenerator(\n    rescale = 1/255.,\n    rotation_range = 15,\n    width_shift_range=0.2, \n    height_shift_range=0.2,\n    zoom_range = 0.2,\n    shear_range=0.3,\n    featurewise_center=True,\n    featurewise_std_normalization=True,\n    horizontal_flip=True,\n    vertical_flip=True,\n    validation_split= 0.2,)\npos = ImageDataGenerator(rescale = 1./255)","metadata":{"id":"uaBlBmg54lZN","execution":{"iopub.status.busy":"2021-07-15T08:52:53.126226Z","iopub.execute_input":"2021-07-15T08:52:53.126530Z","iopub.status.idle":"2021-07-15T08:52:57.033048Z","shell.execute_reply.started":"2021-07-15T08:52:53.126500Z","shell.execute_reply":"2021-07-15T08:52:57.031982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nsubmission = pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\nsubmission.head()","metadata":{"id":"W8yV7Pan4lZO","outputId":"80047ed7-91f6-4a4d-ec35-d2210ff05c91","execution":{"iopub.status.busy":"2021-07-15T08:53:29.249034Z","iopub.execute_input":"2021-07-15T08:53:29.249434Z","iopub.status.idle":"2021-07-15T08:53:29.271809Z","shell.execute_reply.started":"2021-07-15T08:53:29.249403Z","shell.execute_reply":"2021-07-15T08:53:29.271055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\nimg_counts = submission.shape[0]\n\nfor i in range(img_counts):\n    img = cv2.imread('../input/plant-pathology-2021-fgvc8/test_images/' + submission.loc[i,'image'])\n    img = cv2.resize(img,(500,350))\n    #cv2.imshow('img'+str(i),img)\n    b,g,r = cv2.split(img)\n\n    kernel_size = 5\n    blur = cv2.GaussianBlur(g,(kernel_size, kernel_size), 0)\n    blur = cv2.GaussianBlur(blur,(kernel_size, kernel_size), 0)\n    \n    edges = cv2.Canny(blur, 30, 200)\n    #cv2.imshow('edges'+str(i),edges)\n    edge_box = []\n    for x in range(edges.shape[0]):\n        for y in range(edges.shape[1]):\n            if edges[x][y] != 0:\n                edge_box.append((x, y))\n                \n    row_min = edge_box[np.argsort([box[0] for box in edge_box])[0]][0]\n    row_max = edge_box[np.argsort([box[0] for box in edge_box])[-1]][0]\n    col_min = edge_box[np.argsort([box[1] for box in edge_box])[0]][1]\n    col_max = edge_box[np.argsort([box[1] for box in edge_box])[-1]][1]\n\n    test_img= img[row_min:row_max, col_min:col_max]\n    #cv2.imshow('cut'+str(i),new_img)\n    test_img_resize = cv2.resize(test_img,(512,512))\n    \n    path = './test_img_500_350'\n    if not os.path.isdir(path):\n        os.makedirs(path)\n    \n    cv2.imwrite( './test_img_500_350/' + submission.loc[i,'image'],test_img_resize)","metadata":{"id":"pEKfh7iXLzrI","execution":{"iopub.status.busy":"2021-07-15T08:53:39.608256Z","iopub.execute_input":"2021-07-15T08:53:39.608571Z","iopub.status.idle":"2021-07-15T08:53:42.079020Z","shell.execute_reply.started":"2021-07-15T08:53:39.608542Z","shell.execute_reply":"2021-07-15T08:53:42.078144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 88\ntarget_size = (500, 350)\nbatch_size = 16\nresize_img = '../input/cut500-350/cut_500x350'\ntest_img = './test_img_500_350'\nsubmission = pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-07-15T08:53:47.962137Z","iopub.execute_input":"2021-07-15T08:53:47.962454Z","iopub.status.idle":"2021-07-15T08:53:47.971324Z","shell.execute_reply.started":"2021-07-15T08:53:47.962424Z","shell.execute_reply":"2021-07-15T08:53:47.970470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = pre.flow_from_dataframe(\n                  new_train,\n                  directory = resize_img, \n                  x_col = 'image',\n                  y_col = new_train.columns.tolist()[1:],\n                  subset = \"training\",\n                  color_mode = \"rgb\",\n                  target_size = target_size,\n                  class_mode = \"raw\",\n                  batch_size = batch_size,\n                  shuffle = True,\n                  seed = seed,)\nvalid_generator = pre.flow_from_dataframe(\n                  new_train,\n                  directory = resize_img,\n                  x_col = 'image',\n                  y_col = new_train.columns.tolist()[1:],\n                  subset = \"validation\",\n                  color_mode = \"rgb\",\n                  target_size = target_size,\n                  class_mode = \"raw\",\n                  batch_size = batch_size,\n                  shuffle = True,\n                  seed = seed,)\ntest_generator = pos.flow_from_dataframe(\n                  submission,\n                  directory = test_img,\n                  x_col = 'image',\n                  y_col = 'labels',\n                  class_mode = None,\n                  batch_size=8,\n                  target_size = target_size,\n                  color_mode=\"rgb\",\n                  shuffle = False,\n                  seed = seed,)","metadata":{"id":"2qzpa52m4lZO","outputId":"c2be23c9-e176-47e0-d8fb-4d9ac3be82cf","execution":{"iopub.status.busy":"2021-07-15T08:54:00.890055Z","iopub.execute_input":"2021-07-15T08:54:00.890377Z","iopub.status.idle":"2021-07-15T08:54:59.129052Z","shell.execute_reply.started":"2021-07-15T08:54:00.890347Z","shell.execute_reply":"2021-07-15T08:54:59.128166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nexample = next(train_generator)\nprint(example[0].shape)\nplt.imshow(example[0][0,:,:,:])\nplt.show()","metadata":{"id":"y-9GfAiH4lZP","outputId":"af35f599-b61c-4543-f438-8c0bf705d1a5","execution":{"iopub.status.busy":"2021-07-15T08:55:06.726114Z","iopub.execute_input":"2021-07-15T08:55:06.726451Z","iopub.status.idle":"2021-07-15T08:55:07.568551Z","shell.execute_reply.started":"2021-07-15T08:55:06.726422Z","shell.execute_reply":"2021-07-15T08:55:07.567748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nexample = next(test_generator)\nprint(example[0].shape)\nplt.imshow(example[0])\nplt.show()","metadata":{"id":"1Ile26Jr4lZP","outputId":"6301febe-c9ee-4cd1-d3de-7ce3eeaa7806","execution":{"iopub.status.busy":"2021-07-15T08:55:13.421105Z","iopub.execute_input":"2021-07-15T08:55:13.421429Z","iopub.status.idle":"2021-07-15T08:55:13.579949Z","shell.execute_reply.started":"2021-07-15T08:55:13.421398Z","shell.execute_reply":"2021-07-15T08:55:13.579013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import tensorflow as tf\n# from tensorflow import keras\n# from tensorflow.keras.applications import EfficientNetB4\n# from tensorflow.keras import layers, optimizers\n# from tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D, BatchNormalization\n# from keras import Model\n# base_model = EfficientNetB4(include_top=False, \n#                 weights='imagenet',\n#                 pooling='avg', \n#                 input_shape=(500,350,3))","metadata":{"id":"6f2y78WA4lZQ","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_pre = tf.keras.Sequential([\n#         base_model,\n#         layers.BatchNormalization(),\n#         layers.Dense(32,activation='relu'),\n#         layers.Dropout(0.4),\n#         layers.Dense(16,activation='relu'),\n#         layers.Dropout(0.4),\n#         layers.Dense(6,activation='sigmoid')\n# ])","metadata":{"id":"YE3HN-V-4lZQ","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from keras.callbacks import ModelCheckpoint, EarlyStopping\n# model_pre.compile(\n#     optimizer=tf.keras.optimizers.Adam(learning_rate=0.001, decay=0.001/20),\n#     loss='binary_crossentropy',\n#     metrics=[tf.keras.metrics.BinaryAccuracy(name='binary_accuracy'),tf.keras.metrics.AUC(name='auc')])\n# model_checkpoint = ModelCheckpoint(\n#             filepath=\"/content/drive/MyDrive/01python工研院課程/專題/data/0714_500_350_B4.h5\", \n#             mode='max',\n#             monitor='val_auc', \n#             save_best_only=True, \n#             save_freq=\"epoch\", \n#             verbose=1)\n# early_stopping = EarlyStopping(\n#             monitor='val_loss',\n#             mode='min', \n#             min_delta=0.003,\n#             patience=10, \n#             verbose=1, \n#             restore_best_weights=True)\n# model_pre = model_pre.fit(train_generator,\n#             validation_data=valid_generator,\n#             # steps_per_epoch=1000,\n#             epochs=30,\n#             callbacks=[model_checkpoint, early_stopping])\n\n# WARNING:tensorflow:Early stopping conditioned on metric `val_acc` which is not available. \n# Available metrics are: loss,binary_accuracy,auc,val_loss,val_binary_accuracy,val_auc","metadata":{"id":"j6NDnVs24lZQ","outputId":"243569c4-66f8-4760-b135-c608acad0a91","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import matplotlib.pyplot as plt\n\n# pre_history = model_pre.history\n\n# plt.figure()\n# plt.plot(pre_history['binary_accuracy'])\n# plt.plot(pre_history['val_binary_accuracy'])\n# plt.title('model binary_accuracy')\n# plt.ylabel('accuracy')\n# plt.xlabel('epoch')\n# plt.legend(['train', 'validation'])\n# plt.savefig('accuracy')\n# plt.show()","metadata":{"id":"KVD0fV_t4lZR","outputId":"6bedddf1-e6ca-41ad-e8a0-984280b8bbcb","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pre_history = model_pre.history\n\n# plt.figure()\n# plt.plot(pre_history['auc'])\n# plt.plot(pre_history['val_auc'])\n# plt.title('model auc')\n# plt.ylabel('auc')\n# plt.xlabel('epoch')\n# plt.legend(['train', 'validation'])\n# plt.savefig('auc')\n# plt.show()","metadata":{"id":"zedJQTPH3tfd","outputId":"00638738-a33d-4c1e-f29a-04c7970b5a77"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure()\n# plt.plot(pre_history['loss'])\n# plt.plot(pre_history['val_loss'])\n# plt.title('model loss')\n# plt.ylabel('loss')\n# plt.xlabel('epoch')\n# plt.legend(['train', 'validation'])\n# plt.savefig('loss')\n# plt.show()","metadata":{"id":"Hv9w4qgP4lZR","outputId":"9bde8b5b-1102-4da7-cb04-b0f7b3d748aa","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\ndef load_model():\n    model_pre = keras.models.load_model(\"../input/0714-500-350-b4/0714_500_350_B4.h5\")\n    return model_pre\nmodel = load_model()","metadata":{"id":"aGqy9lEr4lZS","execution":{"iopub.status.busy":"2021-07-15T08:55:36.903187Z","iopub.execute_input":"2021-07-15T08:55:36.903506Z","iopub.status.idle":"2021-07-15T08:55:49.286234Z","shell.execute_reply.started":"2021-07-15T08:55:36.903476Z","shell.execute_reply":"2021-07-15T08:55:49.285370Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# base_model.trainable = True\n# ###\n# from keras.callbacks import ModelCheckpoint, EarlyStopping\n\n# model_checkpoint = ModelCheckpoint(\n#             filepath=\"/content/drive/MyDrive/01python工研院課程/專題/data/0714_500_350_B4.h5\", \n#             mode='max',\n#             monitor='val_auc', \n#             save_best_only=True, \n#             save_freq=\"epoch\", \n#             verbose=1)\n# early_stopping = EarlyStopping(\n#             monitor='val_loss',\n#             mode='min', \n#             min_delta=0.003,\n#             patience=10, \n#             verbose=1, \n#             restore_best_weights=True)\n# ###\n# model.compile(\n#     optimizer=keras.optimizers.Adam(1e-5, decay=1e-5/10),\n#     loss=keras.losses.BinaryCrossentropy(from_logits=True),\n#     metrics=[tf.keras.metrics.BinaryAccuracy(name='binary_accuracy'),tf.keras.metrics.AUC(name='auc')])\n# model = model.fit(\n#     train_generator,\n#     validation_data=valid_generator,\n#     epochs=10,\n#     callbacks=[model_checkpoint, early_stopping])","metadata":{"id":"sKbOgN7k4lZS","outputId":"448de4f0-8cf9-41c7-a2d9-1fa517688a25","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_history = model.history\n\n# plt.figure()\n# plt.plot(model_history['binary_accuracy'])\n# plt.plot(model_history['val_binary_accuracy'])\n# plt.title('model binary_accuracy')\n# plt.ylabel('accuracy')\n# plt.xlabel('epoch')\n# plt.legend(['train', 'validation'])\n# plt.savefig('accuracy')\n# plt.show()","metadata":{"id":"zGSFR2lc4lZS","outputId":"327ef549-2de8-4fbf-e493-cef4bdb03a1e","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = load_model()\npred = model.predict(test_generator)","metadata":{"id":"SKnxmDRT4lZT","execution":{"iopub.status.busy":"2021-07-15T08:55:59.409454Z","iopub.execute_input":"2021-07-15T08:55:59.409804Z","iopub.status.idle":"2021-07-15T08:56:17.642200Z","shell.execute_reply.started":"2021-07-15T08:55:59.409775Z","shell.execute_reply":"2021-07-15T08:56:17.641028Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"perdict = (pred>0.40)\nn_label = new_train.columns.tolist()[1:]\nanswer = []\n\nfor i in range(perdict.shape[0]):\n    temp = []\n    for j, k in enumerate(n_label):\n        if perdict[i, j]:\n            temp.append(k)\n    answer.append(temp)\n    \nanswer = [' '.join(n) for n in answer]","metadata":{"id":"BfdudNBq4lZT","execution":{"iopub.status.busy":"2021-07-15T08:56:20.647654Z","iopub.execute_input":"2021-07-15T08:56:20.647994Z","iopub.status.idle":"2021-07-15T08:56:20.654034Z","shell.execute_reply.started":"2021-07-15T08:56:20.647961Z","shell.execute_reply":"2021-07-15T08:56:20.653078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# np.around(pred, decimals=１, out=None)\npred","metadata":{"id":"eNJweZzMHxr5","outputId":"6866a28a-c676-47e5-e3ac-8557ffad57ce","execution":{"iopub.status.busy":"2021-07-15T08:56:24.126409Z","iopub.execute_input":"2021-07-15T08:56:24.126755Z","iopub.status.idle":"2021-07-15T08:56:24.134221Z","shell.execute_reply.started":"2021-07-15T08:56:24.126722Z","shell.execute_reply":"2021-07-15T08:56:24.133293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['labels'] = np.array(answer)\nsubmission","metadata":{"id":"Qbv9SGm74lZT","outputId":"21953f0f-1f71-4889-e6b7-9d2f46fe1112","execution":{"iopub.status.busy":"2021-07-15T08:56:27.091505Z","iopub.execute_input":"2021-07-15T08:56:27.091940Z","iopub.status.idle":"2021-07-15T08:56:27.111356Z","shell.execute_reply.started":"2021-07-15T08:56:27.091902Z","shell.execute_reply":"2021-07-15T08:56:27.110619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"id":"H7KCvpCL4lZT","execution":{"iopub.status.busy":"2021-07-15T08:56:35.974312Z","iopub.execute_input":"2021-07-15T08:56:35.974647Z","iopub.status.idle":"2021-07-15T08:56:35.982801Z","shell.execute_reply.started":"2021-07-15T08:56:35.974594Z","shell.execute_reply":"2021-07-15T08:56:35.981922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !mv /content/content/drive/MyDrive/FGVC8/python工研院課程/專題/data/0713test_B4.h5 /content/drive/MyDrive/FGVC8/python工研院課程/專題/data","metadata":{"id":"fKu8VYrlLgL9"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"HgFXo9g6k2NS"},"execution_count":null,"outputs":[]}]}