{"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 numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\n\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.python.keras.preprocessing.image import ImageDataGenerator\n\nfrom sklearn.metrics import classification_report, log_loss, accuracy_score\nfrom sklearn.model_selection import train_test_split\nfrom tqdm import tqdm","metadata":{"papermill":{"duration":5.579884,"end_time":"2021-04-25T07:07:55.709182","exception":false,"start_time":"2021-04-25T07:07:50.129298","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-16T11:32:29.535609Z","iopub.execute_input":"2022-02-16T11:32:29.536089Z","iopub.status.idle":"2022-02-16T11:32:35.669667Z","shell.execute_reply.started":"2022-02-16T11:32:29.535991Z","shell.execute_reply":"2022-02-16T11:32:35.668746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"directory = '../input/plant-pathology-2021-fgvc8/train_images/'\ndirectory2 = '../input/plant-pathology-2021-fgvc8/test_images/'","metadata":{"papermill":{"duration":0.022612,"end_time":"2021-04-25T07:07:55.749535","exception":false,"start_time":"2021-04-25T07:07:55.726923","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-16T11:32:35.671281Z","iopub.execute_input":"2022-02-16T11:32:35.671717Z","iopub.status.idle":"2022-02-16T11:32:35.675759Z","shell.execute_reply.started":"2022-02-16T11:32:35.671665Z","shell.execute_reply":"2022-02-16T11:32:35.675029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainfile=[]\nfor file in os.listdir(directory):\n    trainfile+=[file]\nprint(len(trainfile))\n\ntestfile=[]\nfor file in os.listdir(directory2):\n    testfile+=[file]\nprint(len(testfile))","metadata":{"papermill":{"duration":0.15222,"end_time":"2021-04-25T07:07:55.917393","exception":false,"start_time":"2021-04-25T07:07:55.765173","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-16T11:32:35.678362Z","iopub.execute_input":"2022-02-16T11:32:35.678857Z","iopub.status.idle":"2022-02-16T11:32:36.672811Z","shell.execute_reply.started":"2022-02-16T11:32:35.678809Z","shell.execute_reply":"2022-02-16T11:32:36.671998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\ntrain","metadata":{"papermill":{"duration":0.022341,"end_time":"2021-04-25T07:07:55.99641","exception":false,"start_time":"2021-04-25T07:07:55.974069","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-16T11:32:36.674416Z","iopub.execute_input":"2022-02-16T11:32:36.674986Z","iopub.status.idle":"2022-02-16T11:32:36.736774Z","shell.execute_reply.started":"2022-02-16T11:32:36.674954Z","shell.execute_reply":"2022-02-16T11:32:36.735747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Name=train['labels'].unique()\nprint(train['labels'].unique())\nprint(train['labels'].nunique())","metadata":{"execution":{"iopub.status.busy":"2022-02-16T11:32:36.738355Z","iopub.execute_input":"2022-02-16T11:32:36.73879Z","iopub.status.idle":"2022-02-16T11:32:36.755395Z","shell.execute_reply.started":"2022-02-16T11:32:36.738744Z","shell.execute_reply":"2022-02-16T11:32:36.754619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N=[]\nfor i in range(len(Name)):\n    N+=[i]\n    \nmapping=dict(zip(Name,N)) \nreverse_mapping=dict(zip(N,Name)) \n\ndef mapper(value):\n    return reverse_mapping[value]","metadata":{"execution":{"iopub.status.busy":"2022-02-16T11:32:36.75669Z","iopub.execute_input":"2022-02-16T11:32:36.757098Z","iopub.status.idle":"2022-02-16T11:32:36.762187Z","shell.execute_reply.started":"2022-02-16T11:32:36.757068Z","shell.execute_reply":"2022-02-16T11:32:36.761438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imdata=[]\ntrain_imfile=[]\n\nfor im in tqdm(os.listdir(directory)):\n    image=load_img(os.path.join(directory,im), \n                   grayscale=False,\n                   color_mode='rgb',\n                   target_size=(60,60))\n    image=img_to_array(image)\n    image=image/255.0\n    train_imdata.append(image)\n    train_imfile.append(im)","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","papermill":{"duration":14.785601,"end_time":"2021-04-25T07:08:10.798527","exception":false,"start_time":"2021-04-25T07:07:56.012926","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-16T11:32:36.763245Z","iopub.execute_input":"2022-02-16T11:32:36.763656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imdata=[]\ntest_imfile=[]\n\nfor im in tqdm(os.listdir(directory2)):\n    image=load_img(os.path.join(directory2,im),\n                   grayscale=False, \n                   color_mode='rgb', \n                   target_size=(60,60))\n    image=img_to_array(image)\n    image=image/255.0\n    test_imdata.append(image)\n    test_imfile.append(im)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_num=[]\nfor item in train['labels']:\n    value=mapping[item]\n    label_num+=[value]\ntrain['label_num']=label_num\ntrain","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data=np.array(train_imdata)\nprint(data.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test=np.array(test_imdata)\nprint(test.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label0=[]\nfor item in train_imfile:\n    label0+=[train[train['image']==item].iloc[0,2]]\n#print(label0)\n\nlabels1=to_categorical(label0)\nlabels=np.array(labels1)\n#print(labels.shape)","metadata":{"papermill":{"duration":0.137825,"end_time":"2021-04-25T07:08:11.135337","exception":false,"start_time":"2021-04-25T07:08:10.997512","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainx,testx,trainy,testy=train_test_split(data,labels,test_size=0.2,random_state=44)","metadata":{"papermill":{"duration":0.120415,"end_time":"2021-04-25T07:08:11.460311","exception":false,"start_time":"2021-04-25T07:08:11.339896","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(trainx.shape)\nprint(testx.shape)\nprint(trainy.shape)\nprint(testy.shape)","metadata":{"papermill":{"duration":0.027242,"end_time":"2021-04-25T07:08:11.506602","exception":false,"start_time":"2021-04-25T07:08:11.47936","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 추가함\nfrom keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(horizontal_flip=True,\n                             rotation_range=5,\n                             zoom_range=0.1,\n                             shear_range=0.05,\n                             horizontal_flip=True,\n                             validation_split=0.2)\n\ntrain_generator = datagen.flow_from_dataframe(\n    df,\n    directory='../input/resized-plant2021/img_sz_256',\n    subset='training',\n    x_col='image',\n    y_col='labels',\n    target_size=(224,224),\n    color_mode='rgb',\n    class_mode='categorical',\n    batch_size=32,\n    shuffle=True,\n    seed=444)\n\n#'../input/plant-pathology-2021-fgvc8/train_images'\nvalid_generator = datagen.flow_from_dataframe(\n    df,\n    directory='../input/resized-plant2021/img_sz_256',\n    subset='validation',\n    x_col='image',\n    y_col='labels',\n    target_size=(224,224),\n    color_mode='rgb',\n    class_mode='categorical',\n    batch_size=32,\n    shuffle=True,\n    seed=444)","metadata":{"papermill":{"duration":0.025748,"end_time":"2021-04-25T07:08:11.55027","exception":false,"start_time":"2021-04-25T07:08:11.524522","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"densenet_weights_path = '../input/densenet201/densenet201_notop.h5'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pretrained_model3 = tf.keras.applications.DenseNet201(input_shape=(60,60,3),\n                                                      include_top=False,\n                                                      weights=densenet_weights_path,\n                                                      pooling='avg')\npretrained_model3.trainable = False","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs3 = pretrained_model3.input\nx3 = tf.keras.layers.Dense(128, activation='relu')(pretrained_model3.output)\noutputs3 = tf.keras.layers.Dense(12, activation='softmax')(x3)\nmodel = tf.keras.Model(inputs=inputs3, outputs=outputs3)","metadata":{"papermill":{"duration":0.063718,"end_time":"2021-04-25T07:08:17.169902","exception":false,"start_time":"2021-04-25T07:08:17.106184","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f1 = tfa.metrics.F1Score(num_classes=6,average='macro')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy', f1])","metadata":{"papermill":{"duration":0.041368,"end_time":"2021-04-25T07:08:17.231582","exception":false,"start_time":"2021-04-25T07:08:17.190214","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(generator=train_generator,\n                    validation_data=valid_generator,\n                    epochs=50,\n                    steps_per_epoch=train_generator.samples//128,\n                    validation_steps=valid_generator.samples//128,\n                    callbacks=callbacks)","metadata":{"papermill":{"duration":369.170719,"end_time":"2021-04-25T07:14:26.422069","exception":false,"start_time":"2021-04-25T07:08:17.25135","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred=model.predict(testx)\npred=np.argmax(y_pred,axis=1)\nground = np.argmax(testy,axis=1)\nprint(classification_report(ground,pred))","metadata":{"papermill":{"duration":3.53915,"end_time":"2021-04-25T07:14:30.789745","exception":false,"start_time":"2021-04-25T07:14:27.250595","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_acc = history.history['accuracy']\nvalue_acc = history.history['val_accuracy']\nget_loss = history.history['loss']\nvalidation_loss = history.history['val_loss']\n\nepochs = range(len(get_acc))\nplt.plot(epochs, get_acc, 'r', label='Accuracy of Training data')\nplt.plot(epochs, value_acc, 'b', label='Accuracy of Validation data')\nplt.title('Training vs validation accuracy')\nplt.legend(loc=0)\nplt.figure()\nplt.show()","metadata":{"papermill":{"duration":0.995914,"end_time":"2021-04-25T07:14:32.648575","exception":false,"start_time":"2021-04-25T07:14:31.652661","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = range(len(get_loss))\nplt.plot(epochs, get_loss, 'r', label='Loss of Training data')\nplt.plot(epochs, validation_loss, 'b', label='Loss of Validation data')\nplt.title('Training vs validation loss')\nplt.legend(loc=0)\nplt.figure()\nplt.show()","metadata":{"papermill":{"duration":0.971858,"end_time":"2021-04-25T07:14:34.468705","exception":false,"start_time":"2021-04-25T07:14:33.496847","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"load_img(\"../input/plant-pathology-2021-fgvc8/test_images/85f8cb619c66b863.jpg\",target_size=(60,60))","metadata":{"papermill":{"duration":0.857299,"end_time":"2021-04-25T07:14:36.189773","exception":false,"start_time":"2021-04-25T07:14:35.332474","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image=load_img(\"../input/plant-pathology-2021-fgvc8/test_images/85f8cb619c66b863.jpg\",target_size=(60,60))\n\nimage=img_to_array(image) \nimage=image/255.0\nprediction_image=np.array(image)\nprediction_image= np.expand_dims(image, axis=0)","metadata":{"papermill":{"duration":0.887719,"end_time":"2021-04-25T07:14:37.940876","exception":false,"start_time":"2021-04-25T07:14:37.053157","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction=model.predict(prediction_image)\nvalue=np.argmax(prediction)\nmove_name=mapper(value)\n#print(prediction)\n#print(value)\nprint(\"Prediction is {}.\".format(move_name))","metadata":{"papermill":{"duration":1.22121,"end_time":"2021-04-25T07:14:41.900362","exception":false,"start_time":"2021-04-25T07:14:40.679152","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test.shape)\nprediction2=model.predict(test)\nprint(prediction2.shape)\n\nPRED=[]\nfor item in prediction2:\n    value2=np.argmax(item)\n    name2=mapper(value2)\n    PRED+=[name2]","metadata":{"papermill":{"duration":2.585739,"end_time":"2021-04-25T07:14:45.326559","exception":false,"start_time":"2021-04-25T07:14:42.74082","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample=pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\nsample","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample['image']=test_imfile\nsample['labels']=PRED\nsubm=sample.sort_values('image').reset_index(drop=True)\nsubm.to_csv('submission.csv', index=False)\nsubm","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}