{"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":"# Cat vs. Dog Image Classification\n","metadata":{"id":"YHK6DyunSbs4"}},{"cell_type":"markdown","source":"## Explore the Example Data","metadata":{"id":"UY6KJV6z6l7_"}},{"cell_type":"code","source":"from google.colab import drive\ndrive.mount('/content/drive')","metadata":{"executionInfo":{"elapsed":1954,"status":"ok","timestamp":1653569463279,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"zcvWUFdfAeog","outputId":"2aee5987-5780-4c06-8118-6ac5ce22cee3","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%capture\n\nimport os\nimport zipfile\nfrom shutil import copyfile\nimport pandas as pd\n\n## remember to add kaggle.json file to /content before running this\n!mkdir ~/.kaggle\n!cp kaggle.json ~/.kaggle/\n!chmod 600 ~/.kaggle/kaggle.json\n!kaggle competitions download -c dogs-vs-cats\n\nzip_files = ['test1', 'train']\n\nfor zip_file in zip_files:\n    with zipfile.ZipFile(\"/content/input/dogs-vs-cats/{}.zip\".format(zip_file),\"r\") as z:\n        z.extractall(\".\")\n        print(\"{} unzipped\".format(zip_file))\n\nIMAGE_FOLDER_PATH = \"/content/working/train\"\nFILE_NAMES = os.listdir(IMAGE_FOLDER_PATH)\n\ntargets = list()\nfull_paths = list()\ntrain_cats_dir = list()\ntrain_dogs_dir = list()\n\n# finding each file's target\nfor file_name in FILE_NAMES:\n    target = file_name.split(\".\")[0] # target name\n    full_path = os.path.join(IMAGE_FOLDER_PATH, file_name)\n    \n    if(target == \"dog\"):\n        train_dogs_dir.append(full_path)\n    if(target == \"cat\"):\n        train_cats_dir.append(full_path)\n    \n    full_paths.append(full_path)\n    targets.append(target)\n\ndataset = pd.DataFrame() # make dataframe\ndataset['image_path'] = full_paths # file path\ndataset['target'] = targets # file's target\n\n","metadata":{"executionInfo":{"elapsed":13752,"status":"ok","timestamp":1653566726443,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"PLy3pthUS0D2","outputId":"d8c23854-f8de-40dd-f354-eef7520f8684","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(dataset.head())\nprint(\"total data counts:\", dataset['target'].count())\ncounts = dataset['target'].value_counts()\nprint(counts)","metadata":{"executionInfo":{"elapsed":309,"status":"ok","timestamp":1653566730222,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"FZy2AaRcK1Kc","outputId":"f405de7f-278b-4fa3-8ad7-1d6bb4615f38","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.optimizers import RMSprop\n\n%matplotlib inline\nimport matplotlib.image as mpimg\nimport matplotlib.pyplot as plt","metadata":{"executionInfo":{"elapsed":227,"status":"ok","timestamp":1653566933999,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"RBu73CbtxsG2","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 42\nnp.random.seed(seed)\ntf.random.set_seed(42)","metadata":{"executionInfo":{"elapsed":5,"status":"ok","timestamp":1653566935123,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"rvzkLbCAQtIj","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_train, dataset_test = train_test_split(dataset, test_size=0.2, random_state=seed)","metadata":{"executionInfo":{"elapsed":2,"status":"ok","timestamp":1653566936027,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"tuN-R9ktQgzW","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"WIDTH, HEIGHT = 150,150\ntrain_datagen=ImageDataGenerator(rotation_range=15,\n                                rescale=1./255,\n                                shear_range=0.1,\n                                zoom_range=0.2,\n                                horizontal_flip=True,\n                                width_shift_range=0.1,\n                                height_shift_range=0.1)\n\ntrain_datagenerator=train_datagen.flow_from_dataframe(dataframe=dataset_train,\n                                                     x_col=\"image_path\",\n                                                     y_col=\"target\",\n                                                     target_size=(WIDTH, HEIGHT),\n                                                     class_mode=\"binary\",\n                                                     batch_size=150)\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagenerator=test_datagen.flow_from_dataframe(dataframe=dataset_test,\n                                                   x_col=\"image_path\",\n                                                   y_col=\"target\",\n                                                   target_size=(WIDTH, HEIGHT),\n                                                   class_mode=\"binary\",\n                                                   batch_size=150)","metadata":{"executionInfo":{"elapsed":533,"status":"ok","timestamp":1653566983670,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"SiLqyJk8RHO_","outputId":"6649fbd7-1460-4747-d91d-8ad30808355e","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(16, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    tf.keras.layers.MaxPooling2D(2, 2),\n    tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2, 2),\n    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2, 2),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer=RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['acc'])\nmodel.summary()","metadata":{"executionInfo":{"elapsed":346,"status":"ok","timestamp":1653567025770,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"NMPu_GunBb21","outputId":"7dcb00ea-9bda-4e08-ee65-f95b019d5f27","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_datagenerator, epochs=15, steps_per_epoch=90,\n                    validation_data=test_datagenerator, validation_steps=6, verbose=1)","metadata":{"executionInfo":{"elapsed":1042817,"status":"ok","timestamp":1653569029189,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"Mm8jmb1dEWvO","outputId":"39e6dd7f-8792-4a7c-f7df-f4aa9b88641a","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%matplotlib inline\n\nimport matplotlib.image  as mpimg\nimport matplotlib.pyplot as plt\n\n#-----------------------------------------------------------\n# Retrieve a list of list results on training and test data\n# sets for each training epoch\n#-----------------------------------------------------------\nacc=history.history['acc']\nval_acc=history.history['val_acc']\nloss=history.history['loss']\nval_loss=history.history['val_loss']\n\nepochs=range(len(acc)) # Get number of epochs\n\n#------------------------------------------------\n# Plot training and validation accuracy per epoch\n#------------------------------------------------\nplt.plot(epochs, acc, 'r^', \"Training Accuracy\")\nplt.plot(epochs, val_acc, 'b', \"Validation Accuracy\")\nplt.title('Training and validation accuracy')\nplt.legend(['Training accuracy', \"Validation accuracy\"],loc =3)\nplt.figure()\n\n#------------------------------------------------\n# Plot training and validation loss per epoch\n#------------------------------------------------\nplt.plot(epochs, loss, 'r^', \"Training Loss\")\nplt.plot(epochs, val_loss, 'b', \"Validation Loss\")\nplt.legend(['Training loss', \"Validation loss\"],loc =3)\n\nplt.figure()\n\n\n# Desired output. Charts with training and validation metrics. No crash :)","metadata":{"executionInfo":{"elapsed":687,"status":"ok","timestamp":1653569251185,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"APNUbS3rEdgW","outputId":"e3d462ad-7d01-466b-84bc-0677e31f59b6","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"executionInfo":{"elapsed":1966,"status":"ok","timestamp":1653569386269,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"7HdRi5m3ZSB_","outputId":"1c8270ee-653f-4084-9078-7716e8b29c97","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Inferrence**","metadata":{"id":"ExjttCE0cCJX"}},{"cell_type":"code","source":"IMAGE_FOLDER_PATH = \"/content/working/test1\"\nFILE_NAMES = os.listdir(IMAGE_FOLDER_PATH)\n\ntargets = list()\nfull_paths = list()\nnames=list()\ntrain_cats_dir = list()\ntrain_dogs_dir = list()\n\n# finding each file's target\nfor file_name in FILE_NAMES:\n    target = file_name.split(\".\")[0] # target name\n    full_path = os.path.join(IMAGE_FOLDER_PATH, file_name)\n\n    full_paths.append(full_path)\n\ndataset_infer = pd.DataFrame() # make dataframe\ndataset_infer['image_path'] = full_paths # file path\n","metadata":{"executionInfo":{"elapsed":227,"status":"ok","timestamp":1653573241672,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"d8vUntCmam4S","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_infer.head()\ndataset_infer.shape","metadata":{"executionInfo":{"elapsed":202,"status":"ok","timestamp":1653573247952,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"hE7HgJeof8ED","outputId":"f952f8cc-1be1-45d4-b85b-843412a31c7d","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"infer_datagen=ImageDataGenerator(rotation_range=15,\n                                rescale=1./255,\n                                shear_range=0.1,\n                                zoom_range=0.2,\n                                horizontal_flip=True,\n                                width_shift_range=0.1,\n                                height_shift_range=0.1)\n\ninfer_datagenerator=infer_datagen.flow_from_dataframe(dataframe=dataset_infer,\n                                                     x_col=\"image_path\",\n                                                     class_mode=None,\n                                                     target_size=(WIDTH, HEIGHT),\n                                                     batch_size=150)\n\npredicted = model.predict_generator(infer_datagenerator,verbose=1)","metadata":{"executionInfo":{"elapsed":84667,"status":"ok","timestamp":1653573448025,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"D5GArBbag4nS","outputId":"f9f70ffa-49e2-42ff-8fc6-74fa64a9b9f5","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predicted.shape","metadata":{"executionInfo":{"elapsed":236,"status":"ok","timestamp":1653573452906,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"Kzwxvz_Th9OW","outputId":"0df15313-67db-42c5-86b4-5b9b0a5f1869","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_infer['probabilities'] = predicted\ndataset_infer.head()","metadata":{"executionInfo":{"elapsed":336,"status":"ok","timestamp":1653574257296,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"gKwK_guMig4Q","outputId":"f3fc90fc-8dba-4aa0-a6b5-86ff33eb9384","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndataset_infer['image_path'] = dataset_infer.apply(lambda row: row.image_path[23:].split('.')[0],axis=1)\ndataset_infer['label']= dataset_infer.apply(lambda row: 1 if row.probabilities>=0.5 else 0, axis=1)\ndataset_infer.head()\n","metadata":{"executionInfo":{"elapsed":567,"status":"ok","timestamp":1653574297752,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"lSTDyG3JqOq7","outputId":"e76eade4-0987-46a6-dc87-2f9e21e438ea","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_submission = pd.DataFrame()\nfinal_submission['id'] = dataset_infer['image_path']\nfinal_submission['label'] = dataset_infer['label']\nprint(final_submission.shape)\nfinal_submission.head(10)\n\nfinal_submission.to_csv(\"final.csv\")","metadata":{"executionInfo":{"elapsed":227,"status":"ok","timestamp":1653574567367,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"4FIbfjK5qQXL","outputId":"5c7fcb20-a996-4433-9055-cc12423845a4","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"executionInfo":{"elapsed":234,"status":"ok","timestamp":1653574583337,"user":{"displayName":"amirsepehr aminian","userId":"07551957595912031317"},"user_tz":-60},"id":"4zaSUQ9Ht_qU","outputId":"e1bc9f53-654f-4cf3-b91c-e920cf6a6eb9","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"Z3ef_B8vucCQ","vscode":{"languageId":"python"}},"execution_count":null,"outputs":[]}]}