{"cells":[{"metadata":{"id":"-EUvcZe83-cp"},"cell_type":"markdown","source":"# Pre-Processing Image"},{"metadata":{"id":"wpp53XW74lK3"},"cell_type":"markdown","source":"## import library"},{"metadata":{"id":"cZdYfYhG4BBU","trusted":true},"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport glob\n\nimport keras\nfrom keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"id":"xt8yGluz42Gx"},"cell_type":"markdown","source":"## Load data from GDrive"},{"metadata":{"id":"wPVHC14L46cs","trusted":true},"cell_type":"code","source":"train_dir = '../input/tomato-disease-ver2/tomato_disease_ready ver2/train'\nval_dir = '../input/tomato-disease-ver2/tomato_disease_ready ver2/validation'\ntest_dir = '../input/tomato-disease-ver2/tomato_disease_ready ver2/test'","execution_count":null,"outputs":[]},{"metadata":{"id":"_AvLjLEG6K7j"},"cell_type":"markdown","source":"## Menghitung jumlah dataset"},{"metadata":{"id":"78_VtIv55QdX","trusted":true},"cell_type":"code","source":"def get_files(directory):\n  if not os.path.exists(directory):\n    return 0\n  count = 0 \n  for current_path, dirs, files in os.walk(directory):\n    for dr in dirs:\n      count += len(glob.glob(os.path.join(current_path, dr+\"/*\")))\n  return count","execution_count":null,"outputs":[]},{"metadata":{"id":"b9nCJe0Q6teW","outputId":"8e002b2f-86dc-43e8-8c28-83b615c52261","trusted":true},"cell_type":"code","source":"data_training = get_files(train_dir)\ndata_validation = get_files(val_dir)\ndata_testing = get_files(test_dir)\nnum_classes = len(glob.glob(train_dir + \"/*\"))\n\nprint('Jumlah data training :', data_training)\nprint('Jumlah data validation :', data_validation)\nprint('Jumlah data testing :', data_testing)\nprint('Jumlah Kelas Dataset :', num_classes)","execution_count":null,"outputs":[]},{"metadata":{"id":"TOTKJXBp8Kki"},"cell_type":"markdown","source":"## Pre-Processing data input"},{"metadata":{"id":"bhRF-4f98RMl","trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1/255,\n                                   horizontal_flip=True,\n                                   zoom_range = 0.3)\n\nval_datagen = ImageDataGenerator(rescale=1/255,\n                                 horizontal_flip=True,\n                                 zoom_range = 0.3)\n\ntest_datagen = ImageDataGenerator(rescale=1/255,\n                                  horizontal_flip=False,\n                                  vertical_flip=False)","execution_count":null,"outputs":[]},{"metadata":{"id":"cnDpWmM780LH"},"cell_type":"markdown","source":"## Mengatur Ukuran dari image/citra input"},{"metadata":{"id":"YMv3IVGF85Xx","outputId":"0c012547-6ec4-4d7e-9642-9e6394a77d51","trusted":true},"cell_type":"code","source":"image_width = 400\nimage_height = 400\n\nmode = 'rgb'\n\ntrain_generator = train_datagen.flow_from_directory(train_dir,\n                                                    target_size=(image_width, image_height),\n                                                    batch_size=32,\n                                                    color_mode = mode)\n\nval_generator = val_datagen.flow_from_directory(val_dir,\n                                                target_size = (image_width, image_height),\n                                                batch_size=32,\n                                                color_mode = mode)\n\ntest_generator = test_datagen.flow_from_directory(test_dir,\n                                                  target_size = (image_width, image_height),\n                                                  batch_size=32,\n                                                  color_mode = mode)","execution_count":null,"outputs":[]},{"metadata":{"id":"AXXW9yrH-w0k"},"cell_type":"markdown","source":"# Build CNN Architecure"},{"metadata":{"id":"83DG6krH9DcY","outputId":"c31ac253-d720-4d01-f1cf-37494cb8a67b","trusted":true},"cell_type":"code","source":"train_generator.class_indices","execution_count":null,"outputs":[]},{"metadata":{"id":"Ilx5SWnv9Nty","trusted":true},"cell_type":"code","source":"import keras\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Flatten\nfrom keras.utils import plot_model\n\nfrom keras.layers import Conv2D, MaxPooling2D, Activation, AveragePooling2D, BatchNormalization","execution_count":null,"outputs":[]},{"metadata":{"id":"emC1r4tv9mr_","outputId":"c778961e-cba5-4d96-bf3d-3b5de45cc141","trusted":true},"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(32, (3,3), input_shape=(image_width, image_height, 3), padding='same', strides=1, activation='relu', name='konvolusi_1'))\n#model.add(Conv2D(64, (3,3), strides=1, activation='relu', name='konvolusi_1b'))\nmodel.add(MaxPooling2D(pool_size = (2, 2), name='pool_layer_1'))\n\n\nmodel.add(Conv2D(64, (3,3), padding='same', strides=1, activation='relu', name='konvolusi_2'))\n#model.add(Conv2D(256, (3,3), strides=1, activation='relu', name='konvolusi_2b'))\nmodel.add(MaxPooling2D(pool_size=(2, 2), name='pool_layer_2'))\n\nmodel.add(Conv2D(128, (3,3), padding='same', strides=1, activation='relu', name='konvolusi_3'))\n#model.add(Conv2D(512, (3,3), strides=1, activation='relu', name='konvolusi_3b'))\nmodel.add(MaxPooling2D(pool_size=(2, 2), name='pool_layer_3'))\n\nmodel.add(Conv2D(256, (3,3), padding='same', strides=1, activation='relu', name='konvolusi_4'))\n#model.add(Conv2D(256, (3,3), strides=1, activation='relu', name='konvolusi_4b'))\nmodel.add(MaxPooling2D(pool_size=(2, 2), name='pool_layer_4'))\n\nmodel.add(Conv2D(512, (3,3), padding='same', strides=1, activation='relu', name='konvolusi_5'))\n#model.add(Conv2D(512, (3,3), strides=1, activation='relu', name='konvolusi_5b'))\nmodel.add(MaxPooling2D(pool_size=(2, 2), name='pool_layer_5'))\n\nmodel.add(Flatten())\nmodel.add(Dense(1024, activation='relu', name='ANN_1'))\nmodel.add(Dense(1024, activation='relu', name='ANN_1b'))\nmodel.add(Dense(num_classes, activation='softmax', name='Output'))\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"id":"zNhAb995B_3u","outputId":"9bbe9511-2718-4f8e-e250-0a376d957085","trusted":true},"cell_type":"code","source":"plot_model(model, show_layer_names=True, show_shapes=True, to_file='ini_model.png')","execution_count":null,"outputs":[]},{"metadata":{"id":"FCOqnQuMDfuO"},"cell_type":"markdown","source":"## Visualisasi Layer Konvolusi"},{"metadata":{"id":"-Do0X7XsDxEe","outputId":"4e9f77f0-3ccf-49e9-b6ed-ac474d1fb11a","trusted":true},"cell_type":"code","source":"from keras.preprocessing import image\nimport numpy as np\n\nimg1 = image.load_img('../input/tomato-disease-ver2/tomato_disease_ready ver2/validation/healthy/000146ff-92a4-4db6-90ad-8fce2ae4fddd___GH_HL Leaf 259.1 - Copy.JPG')\nplt.imshow(img1)\n\nimg1 = image.load_img('../input/tomato-disease-ver2/tomato_disease_ready ver2/validation/healthy/000146ff-92a4-4db6-90ad-8fce2ae4fddd___GH_HL Leaf 259.1 - Copy.JPG', target_size=(image_width, image_height, 1), color_mode='rgb')\nimg = image.img_to_array(img1)\nimg = img/255\nimg = np.expand_dims(img, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"id":"tn6_z5K_Ecan","outputId":"ed524cf5-f690-475e-b6f3-fafbf9043a87","trusted":true},"cell_type":"code","source":"import matplotlib.image as mpig\nfrom keras.models import  Model\n\nconv_output = Model(inputs=model.input, outputs=model.get_layer('konvolusi_3').output)\nconv_features = conv_output.predict(img)\n\nfig = plt.figure(figsize= (28, 14))\ncolumns = 8\nrows = 4\n\nfor i in range (columns*rows):\n  fig.add_subplot(rows, columns, i+1)\n  plt.axis('off')\n  plt.title('filter ke-' + str(i))\n  plt.imshow(conv_features[0, :, :, i])\nplt.show","execution_count":null,"outputs":[]},{"metadata":{"id":"vgFsYmtAGYSS"},"cell_type":"markdown","source":"# Training CNN Architecture"},{"metadata":{"id":"aH7bb1yUGa_w","outputId":"07b1e9dd-e47a-4a9c-d17f-4d0190f9c225","trusted":true},"cell_type":"code","source":"opt = keras.optimizers.Adam(lr=0.001)\nmodel.compile(optimizer=opt,\n              loss = 'categorical_crossentropy',\n              metrics=['accuracy'])\n\nbatch_size = 32\n\ntrain = model.fit_generator(train_generator,\n                            epochs=10,\n                            steps_per_epoch = train_generator.samples // batch_size,\n                            validation_data = val_generator,\n                            validation_steps = val_generator.samples // batch_size,\n                            verbose = 1)","execution_count":null,"outputs":[]},{"metadata":{"id":"2IXKR6BzIwbC"},"cell_type":"markdown","source":"## Plot Training Process"},{"metadata":{"id":"zHg7g4Z5IwOX","trusted":true},"cell_type":"code","source":"acc = train.history['accuracy']\nval_acc = train.history['val_accuracy']\nloss = train.history['loss']\nval_loss = train.history['val_loss']\n\nepochs = range(1, len(acc) + 1)\n\n# Plot akurasi data taraining dan validation\nplt.plot(epochs, acc, 'b', label='Akurasi training')\nplt.plot(epochs, val_acc, 'r', label='Akurasi validasi')\nplt.title('Akurasi Training dan Validasi')\nplt.legend()\n\nplt.figure()\n\n# Plot loss taraining dan validation\nplt.plot(epochs, loss, 'b', label='Loss training')\nplt.plot(epochs, val_loss, 'r', label='Loss validasi')\nplt.title('Akurasi Training dan Validasi')\nplt.legend()\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"score, accuracy = model.evaluate(test_generator, verbose=1)\nprint(\"Score Testing adalah {}\".format(score))\nprint(\"Akurasi Testing adalah {}\".format(accuracy))","execution_count":null,"outputs":[]},{"metadata":{"id":"VgyBww_DKWYv"},"cell_type":"markdown","source":"## Menyimpan Model "},{"metadata":{"id":"vDefPLP3Kd68","trusted":true},"cell_type":"code","source":"model.save('./model_saya_2.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_generator = test_datagen.flow_from_directory(test_dir,\n                                                  target_size=(image_width,image_height),\n                                                  batch_size=batch_size,\n                                                  color_mode='rgb',\n                                                  shuffle=False)\n\nresolt = model.predict_classes(test_generator, batch_size=None, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"resolt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport seaborn as sn\nimport matplotlib.pyplot as plt\n\n\ndata = {'y_Actual':    test_generator.classes,\n        'y_Predicted': resolt\n        }\n\ndf = pd.DataFrame(data, columns=['y_Actual','y_Predicted'])\nconfusion_matrix = pd.crosstab(df['y_Actual'], df['y_Predicted'], rownames=['Actual'], colnames=['Predicted'])\n\nsn.heatmap(confusion_matrix, annot=True, fmt='.0f')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Test data baru"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Loading model\nfrom keras.models import load_model\nmodel = load_model('./model_saya_2.h5')\n\nClasses = ['bacterial_spot',\n           'early_blight',\n           'healthy',\n           'late_blight',\n           'leaf_mold',\n           'septoria_leaf_spot',\n           'spotted_spider_mite',\n           'target_spot',\n           'yellow_leaf_curl_virus']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\n# pre-processing test data sama dengan train data\nimg_width = 400\nimg_height = 400\n#model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])\n\nfrom keras.preprocessing import image\ndef prepare(img_path):\n    img = image.load_img(img_path, target_size=(384,384,3))\n    x = image.img_to_array(img)\n    x = x/255\n    return np.expand_dims(x, axis=0)\n\ninput_data = '../input/tomato-disease-ver2/tomato_disease_ready ver2/test/yellow_leaf_curl_virus/a2737028-9b65-4d23-900d-42f9f795f465___YLCV_GCREC 2489.JPG'\nresult = model.predict_classes([prepare(input_data)])\ndisease = image.load_img(input_data)\nplt.imshow(disease)\nprint ('Terdeteksi penyakit : ', Classes[int(result)])\n","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}