{"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":"seed = 32\ntarget_size = (380, 380)\nbatch_size = 16","metadata":{"id":"FwLwiQmOWBv4","execution":{"iopub.status.busy":"2021-07-25T02:27:18.621842Z","iopub.execute_input":"2021-07-25T02:27:18.622259Z","iopub.status.idle":"2021-07-25T02:27:18.632366Z","shell.execute_reply.started":"2021-07-25T02:27:18.62218Z","shell.execute_reply":"2021-07-25T02:27:18.631396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ntrain = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\nprint(train.shape)\ntrain['labels'].value_counts()","metadata":{"id":"Yao530ly1jgr","executionInfo":{"status":"ok","timestamp":1626917544204,"user_tz":-480,"elapsed":529,"user":{"displayName":"41林厚廷","photoUrl":"","userId":"03565498750792486502"}},"outputId":"90fb0070-5486-451a-aeda-56a853945db9","execution":{"iopub.status.busy":"2021-07-25T02:27:22.32545Z","iopub.execute_input":"2021-07-25T02:27:22.327694Z","iopub.status.idle":"2021-07-25T02:27:22.466442Z","shell.execute_reply.started":"2021-07-25T02:27:22.325828Z","shell.execute_reply":"2021-07-25T02:27:22.465596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train_dir = \"../input/resized-plant2021/img_sz_384\"    #384*384\ntest_img = '../input/plant-pathology-2021-fgvc8/test_images'\nsubmission = pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\nsubmission.head()","metadata":{"id":"uPiOJX--wOhr","executionInfo":{"status":"ok","timestamp":1626917565371,"user_tz":-480,"elapsed":586,"user":{"displayName":"41林厚廷","photoUrl":"","userId":"03565498750792486502"}},"outputId":"df6c9746-e6fb-4ebe-c7ab-36a31dca67b7","execution":{"iopub.status.busy":"2021-07-25T02:27:25.032973Z","iopub.execute_input":"2021-07-25T02:27:25.033411Z","iopub.status.idle":"2021-07-25T02:27:25.05626Z","shell.execute_reply.started":"2021-07-25T02:27:25.033378Z","shell.execute_reply":"2021-07-25T02:27:25.055267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"將Train與Test分成 各12類別0.8/0.2","metadata":{"id":"rGHmKCYTWIjW"}},{"cell_type":"code","source":"import sklearn\nfrom sklearn.model_selection import train_test_split\n'''\nlabel_list = train['labels'].value_counts().index\nn_train = pd.DataFrame()\nn_test = pd.DataFrame()\nfor i in label_list.tolist():\n    i = train[train['labels']==i]\n    x_train,x_test = train_test_split(i,test_size=0.2,random_state=CFG.seed)\n    n_train = n_train.append(x_train)\n    #n_train = sklearn.utils.shuffle(n_train)\n    n_train.reset_index(drop=True, inplace=True)\n\n    n_test = n_test.append(x_test)\n    #n_test = sklearn.utils.shuffle(n_test)\n    n_test.reset_index(drop=True, inplace=True)\n\nprint(n_train.shape)\nprint(n_test.shape)\nprint(n_train['labels'].head())\n'''","metadata":{"id":"f0aWYO3_IJwB","executionInfo":{"status":"ok","timestamp":1626917547625,"user_tz":-480,"elapsed":354,"user":{"displayName":"41林厚廷","photoUrl":"","userId":"03565498750792486502"}},"outputId":"4705fab2-ab6e-4b43-a926-353b977c8295","execution":{"iopub.status.busy":"2021-07-25T02:27:29.525896Z","iopub.execute_input":"2021-07-25T02:27:29.52631Z","iopub.status.idle":"2021-07-25T02:27:30.346468Z","shell.execute_reply.started":"2021-07-25T02:27:29.526276Z","shell.execute_reply":"2021-07-25T02:27:30.345666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Train轉為MultiLabel","metadata":{"id":"6YkKOfFPl02o"}},{"cell_type":"code","source":"import numpy as np\nimport sklearn\nfrom sklearn.preprocessing import MultiLabelBinarizer\nmb = MultiLabelBinarizer()\nlabels = pd.DataFrame(mb.fit_transform(train.labels.apply(lambda x : x.split())), columns = mb.classes_)  \n             \nmuti_train = pd.concat([train['image'], labels], axis=1)\nprint('muti_train')\nprint(\"-\"*30)\nfor i in muti_train.columns[1:]:\n    print(f\"{i} : {np.count_nonzero(muti_train[i]==1)}\")\nprint(\"-\"*30)\nmuti_train","metadata":{"execution":{"iopub.status.busy":"2021-07-25T02:27:34.026222Z","iopub.execute_input":"2021-07-25T02:27:34.026621Z","iopub.status.idle":"2021-07-25T02:27:34.105707Z","shell.execute_reply.started":"2021-07-25T02:27:34.026587Z","shell.execute_reply":"2021-07-25T02:27:34.104926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"CV","metadata":{}},{"cell_type":"code","source":"import cv2\nimport numpy as np\ndef get_cut_image(image):\n    img = cv2.blur(image,(2,2))\n    copy = np.uint8(img)\n    canny = cv2.Canny(copy, 145, 165)\n    box = np.argwhere(canny>0)\n    y1,x1 = box.min(axis=0)\n    y2,x2 = box.max(axis=0)\n    cut_img = img[y1:y2, x1:x2]\n    cut_img = cv2.resize(cut_img, target_size)\n    #cut_img = cut_img.astype(\"float32\")*(1.)/255\n    return cut_img","metadata":{"execution":{"iopub.status.busy":"2021-07-25T02:38:24.339718Z","iopub.execute_input":"2021-07-25T02:38:24.34012Z","iopub.status.idle":"2021-07-25T02:38:24.348181Z","shell.execute_reply.started":"2021-07-25T02:38:24.340065Z","shell.execute_reply":"2021-07-25T02:38:24.347332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### ImageDataGenerator","metadata":{"id":"t1Dug9U7XjNf"}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n'''\npre = ImageDataGenerator(\n    featurewise_center=True,\n    featurewise_std_normalization=True,\n    brightness_range=[0.5, 1.5],\n    rotation_range=45,\n    shear_range=0.2,\n    zoom_range=0.2, \n    horizontal_flip=True,\n    vertical_flip=True,\n    width_shift_range=0.2,\n    height_shift_range=0.2)\n    #preprocessing_function = get_cut_image)\n'''\npos =ImageDataGenerator(\n    rescale=1./255,\n    brightness_range=[0.5, 1.5],\n    rotation_range=45,\n    shear_range=0.2,\n    zoom_range=0.2, \n    horizontal_flip=True,\n    vertical_flip=True,\n    width_shift_range=0.2,\n    height_shift_range=0.2)","metadata":{"id":"jJHzxnaT1xUI","execution":{"iopub.status.busy":"2021-07-25T02:38:27.26615Z","iopub.execute_input":"2021-07-25T02:38:27.266479Z","iopub.status.idle":"2021-07-25T02:38:27.271406Z","shell.execute_reply.started":"2021-07-25T02:38:27.266452Z","shell.execute_reply":"2021-07-25T02:38:27.270601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\ntrain_generator = pre.flow_from_dataframe(\n                  new_train,\n                  directory = train_dir, \n                  x_col = 'image',\n                  y_col = CFG.classes,\n                  color_mode = \"rgb\",\n                  target_size = (CFG.img_size,CFG.img_size),\n                  class_mode = \"raw\",\n                  batch_size = CFG.batch_size,\n                  shuffle = True,\n                  seed = CFG.seed\n                  )\n\nvalid_generator = pre.flow_from_dataframe(\n                  new_test,\n                  directory = train_dir,\n                  x_col = 'image',\n                  y_col = CFG.classes,\n                  color_mode = \"rgb\",\n                  target_size = (CFG.img_size,CFG.img_size),\n                  class_mode = \"raw\",\n                  batch_size = CFG.batch_size,\n                  shuffle = True,\n                  seed = CFG.seed)\n                  '''","metadata":{"id":"VX-qLmbHnScr","executionInfo":{"status":"ok","timestamp":1626917582599,"user_tz":-480,"elapsed":9562,"user":{"displayName":"41林厚廷","photoUrl":"","userId":"03565498750792486502"}},"outputId":"f9ae8e90-a90f-4040-906d-0b33dea00f31","execution":{"iopub.status.busy":"2021-07-25T02:31:05.832477Z","iopub.execute_input":"2021-07-25T02:31:05.832816Z","iopub.status.idle":"2021-07-25T02:31:05.839042Z","shell.execute_reply.started":"2021-07-25T02:31:05.832785Z","shell.execute_reply":"2021-07-25T02:31:05.838082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator = pos.flow_from_dataframe(\n                  submission,\n                  directory = test_img,\n                  x_col = 'image',\n                  y_col = 'labels',\n                  class_mode = \"raw\",\n                  batch_size=batch_size,\n                  target_size = target_size,\n                  color_mode=\"rgb\",\n                  shuffle = False,\n                  seed = seed)","metadata":{"execution":{"iopub.status.busy":"2021-07-25T02:38:31.311629Z","iopub.execute_input":"2021-07-25T02:38:31.312022Z","iopub.status.idle":"2021-07-25T02:38:31.326012Z","shell.execute_reply.started":"2021-07-25T02:38:31.311973Z","shell.execute_reply":"2021-07-25T02:38:31.324904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import backend as K\n\ndef f1(y_true, y_pred):\n    def recall(y_true, y_pred):\n        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n        recall = true_positives / (possible_positives + K.epsilon())\n        return recall\n    def precision(y_true, y_pred):\n        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n        precision = true_positives / (predicted_positives + K.epsilon())\n        return precision\n\n    precision = precision(y_true, y_pred)\n    recall = recall(y_true, y_pred)\n    return 2*((precision*recall)/(precision+recall+K.epsilon()))","metadata":{"execution":{"iopub.status.busy":"2021-07-25T02:31:14.381547Z","iopub.execute_input":"2021-07-25T02:31:14.38186Z","iopub.status.idle":"2021-07-25T02:31:14.391225Z","shell.execute_reply.started":"2021-07-25T02:31:14.381831Z","shell.execute_reply":"2021-07-25T02:31:14.390131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nimport tensorflow_addons as tfa\nmodel = keras.models.load_model(\"../input/b4-4fold-ncv-bc1/B4_4fold_nCV_BC1.h5\",compile=False)\npred = model.predict(test_generator)\npred","metadata":{"id":"EU2MnD-otdWH","execution":{"iopub.status.busy":"2021-07-25T02:39:07.650989Z","iopub.execute_input":"2021-07-25T02:39:07.651342Z","iopub.status.idle":"2021-07-25T02:39:17.470212Z","shell.execute_reply.started":"2021-07-25T02:39:07.651312Z","shell.execute_reply":"2021-07-25T02:39:17.469402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"perdict = (pred>0.33)\nn_label = muti_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":{"execution":{"iopub.status.busy":"2021-07-25T02:39:38.505492Z","iopub.execute_input":"2021-07-25T02:39:38.50586Z","iopub.status.idle":"2021-07-25T02:39:38.513154Z","shell.execute_reply.started":"2021-07-25T02:39:38.505826Z","shell.execute_reply":"2021-07-25T02:39:38.512133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nsubmission['labels'] = np.array(answer)\nsubmission","metadata":{"execution":{"iopub.status.busy":"2021-07-25T02:39:41.765415Z","iopub.execute_input":"2021-07-25T02:39:41.765731Z","iopub.status.idle":"2021-07-25T02:39:41.775248Z","shell.execute_reply.started":"2021-07-25T02:39:41.765702Z","shell.execute_reply":"2021-07-25T02:39:41.774251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('./submission.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}