{"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":"markdown","source":"This Kernel for someone want to deep dive into image classification. I use CNN for classification model. If you found this Kernel helpful please up vote it. If you have some feedback and question don't forget to comment below. \n\nI have simplier model with \n* https://www.kaggle.com/uysimty/get-start-image-classification","metadata":{}},{"cell_type":"markdown","source":"# Import Library","metadata":{"_uuid":"fe76d1d1ded592430e7548feacfa38dc42f085d9"}},{"cell_type":"code","source":"!python --version","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tensorflow==2.3.0","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nprint(tf.__version__)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nfrom keras.preprocessing.image import ImageDataGenerator, load_img\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport random\nimport os\nprint(os.listdir(\"../input\"))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nimport random\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom os.path import dirname, basename\nfrom PIL import Image","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import Sequence\nfrom imgaug import augmenters as iaa","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense\nfrom tensorflow.keras.models import  Model\nfrom tensorflow.keras.losses import SparseCategoricalCrossentropy\nfrom tensorflow.keras.metrics import SparseCategoricalAccuracy\nfrom tensorflow.keras.optimizers import Nadam, Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom tensorflow.keras.models import load_model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare Traning Data","metadata":{"_uuid":"7335a579cc0268fba5d34d6f7558f33c187eedb3"}},{"cell_type":"code","source":"list_train_filenames = glob.glob('../input/2ptk-dataset/2TPK/trn/*/*.jpg')\nlist_train_images = [np.array(Image.open(filename)) for filename in list_train_filenames]\n\nlist_valid_filenames = glob.glob('../input/2ptk-dataset/2TPK/val/*/*.jpg')\nlist_valid_images = [np.array(Image.open(filename)) for filename in list_valid_filenames]\n\nlist_labels_train = [int(basename(dirname(filename))) for filename in list_train_filenames]\nlist_labels_valid = [int(basename(dirname(filename))) for filename in list_valid_filenames]","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = np.stack(list_train_images)\ny_train = np.stack(list_labels_train)\nx_valid = np.stack(list_valid_images)\ny_valid = np.stack(list_labels_valid)","metadata":{"_uuid":"72bf69e817f67f5a2eaff8561217e22077248553","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DataGenerator(Sequence):\n    \"\"\"\n    Data Generator for Image\n    \"\"\"\n    def __init__(self, batch_size, np_images, np_labels):\n        self.batch_size = batch_size\n        self.np_labels = np_labels\n        self.np_images = np_images\n\n        self.num_images = len(self.np_images)\n        \n        self.preprocesser = iaa.Sequential(\n#              [\n# #                iaa.Affine.Rotate\n#              ],\n            random_order= True\n        )\n\n        self.indices = np.random.permutation(self.num_images)\n\n    def on_epoch_end(self):\n        self.indices = np.random.permutation(self.num_images)\n\n    def __len__(self):\n        return int(self.num_images / self.batch_size)\n\n    def __getitem__(self, index):\n        batch_indices = self.indices[index * self.batch_size: (index+1) * self.batch_size]\n        batch_images = self.np_images[batch_indices]\n        batch_labels = self.np_labels[batch_indices]\n\n        batch_preprocessed_images = self.preprocesser(images = batch_images)\n\n        \n        data_images = preprocess_input(np.concatenate([batch_preprocessed_images, batch_images]))\n        data_labels = np.concatenate([batch_labels, batch_labels])\n        return data_images, data_labels\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras\nimport tensorflow as tf","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class LeafClassifier:\n    def __init__(self):\n        self.model = None\n\n    def build_model(self):\n        input_layer = Input(shape = (128, 128, 3))\n\n        conv_layer_1 = (Conv2D(512, kernel_size = 2, padding='same', activation=\"relu\"))(input_layer)\n\n        max_pooling_2d_a = (MaxPooling2D(pool_size=(2, 2)))(conv_layer_1)\n\n        conv_layer_2 = (Conv2D(256, kernel_size = 2, padding='same', activation=\"relu\"))(max_pooling_2d_a)\n\n        max_pooling_2d_b = (MaxPooling2D(pool_size=(2, 2)))(conv_layer_2)\n\n        conv_layer_3 = (Conv2D(128, kernel_size = 2, padding='same', activation=\"relu\"))(max_pooling_2d_b)\n\n        max_pooling_2d_c = (MaxPooling2D(pool_size=(2, 2)))(conv_layer_3)\n\n        conv_layer_4 = (Conv2D(64, kernel_size = 2, padding='same',activation=\"relu\"))(max_pooling_2d_c)\n\n        max_pooling_2d_d = (MaxPooling2D(pool_size=(2, 2)))(conv_layer_4)\n\n        conv_layer_5 = (Conv2D(32, kernel_size = 2, padding='same',activation=\"relu\"))(max_pooling_2d_d)\n\n        max_pooling_2d_e = (MaxPooling2D(pool_size=(2, 2)))(conv_layer_5)\n\n        flat = Flatten()(max_pooling_2d_d)\n\n        dense_layer_1 = Dense(32, activation ='relu')(flat)\n\n        output_layer = Dense(2, activation = 'softmax')(dense_layer_1)\n\n        self.model = Model(input_layer, output_layer)\n        print(self.model.summary())\n        \n#         optimizer = keras.optimizers.Adam(learning_rate=0.001)\n        \n        self.model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['sparse_categorical_accuracy'])\n        \n    def save_model(self):\n       \n        pass  # delete this line and replace yours\n\n    def load_model(self):\n         self.model = load_model('model/leaf.hdf5')\n        \n\n    def train(self, train_generator, valid_generator,**kwargs):\n        save_best = tf.keras.callbacks.ModelCheckpoint(\n          'model/leaf.hdf5',monitor = 'val_sparse_categorical_accuracy',save_best_only = True, verbose = 1 )\n        self.model.fit_generator(\n            train_generator,\n            validation_data=valid_generator,\n            steps_per_epoch=50,\n            workers=2,\n            epochs=50,\n            validation_steps = 1,\n            callbacks = [save_best]\n        )\n\n    def predict(self, x_test):\n        \"\"\"\n        :param x_test: a numpy array with dimension (N,100,100,3)\n        :return: a numpy array with dimension (N,)\n        \"\"\"\n        # x = preprocess_input(x_test)\n        y_predict = self.model.predict(x_test)\n        return y_predict.argmax(axis=1)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = DataGenerator(16, x_train, y_train)\nvalid_generator = DataGenerator(16, x_valid, y_valid)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classifier = LeafClassifier()\nclassifier.build_model()","metadata":{"_uuid":"fa26f0bc7a6d835a24989790b20f3c6f32946f45","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classifier.train(train_generator, valid_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}