{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30615,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<h2 style=\"color:#000000; border:2px solid #6D7E86; text-align:center; border-radius:8px; background-color:rgb(199,239,0,0.5);text-transform:uppercase;padding:0.7rem\">🚀Upvote if you find it useful!</h2>\n","metadata":{}},{"cell_type":"markdown","source":"# Importing Essential Packages 📦🔍\n","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nimport os\nimport cv2","metadata":{"execution":{"iopub.status.busy":"2023-12-09T11:54:23.839696Z","iopub.execute_input":"2023-12-09T11:54:23.840078Z","iopub.status.idle":"2023-12-09T11:54:37.627159Z","shell.execute_reply.started":"2023-12-09T11:54:23.840048Z","shell.execute_reply":"2023-12-09T11:54:37.626089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Importing Images 📦📸\n","metadata":{}},{"cell_type":"code","source":"folder_path_train = \"..\\data\\dogs-vs-cats\\\\train\"\ncurrent_directory = os.getcwd()\nfull_path_train = os.path.join(current_directory, folder_path_train)\nfull_path_train = os.path.normpath(full_path_train)\nprint(full_path_train)\n\nfolder_path_test = \"..\\data\\dogs-vs-cats\\\\test\"\ncurrent_directory = os.getcwd()\nfull_path_test = os.path.join(current_directory, folder_path_test)\nfull_path_test = os.path.normpath(full_path_test)\nprint(full_path_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Importing all images\n","metadata":{}},{"cell_type":"code","source":"train_images_df = []\ntrain_labels_df = []\n# plt.figure(figsize=(16, 9))\nfor filename in os.listdir(full_path_train):\n    if filename.endswith(\".jpg\"):\n        image_path = os.path.join(full_path_train, filename)\n        if len(train_images_df) % 100 == 0:\n            print(len(train_images_df))\n        img = cv2.imread(image_path)\n        # plt.subplot(5, 6, len(images) + 1)\n        # plt.imshow(img)\n        if len(train_images_df) == 1000:\n            break\n        train_images_df.append(img)\n        train_labels_df.append(filename.split(\".\")[0])\nprint(\"Shape of images array:\", len(train_images_df))\nprint(\"Shape of labels array:\", train_labels_df[:10])\n# plt.imshow(img)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Imported only 1000 images for train\n","metadata":{}},{"cell_type":"code","source":"train_images_df = []\ntrain_labels_df = []\n\nnum_dogs = 0\nnum_cats = 0\ntarget_images = 2500\n\nfor filename in os.listdir(full_path_train):\n    if filename.endswith(\".jpg\"):\n        image_path = os.path.join(full_path_train, filename)\n        img = cv2.imread(image_path)\n\n        label = filename.split(\".\")[0]\n        if label == \"cat\" and num_cats < target_images / 2:\n            train_images_df.append(img)\n            train_labels_df.append(label)\n            num_cats += 1\n        elif label == \"dog\" and num_dogs < target_images / 2:\n            train_images_df.append(img)\n            train_labels_df.append(label)\n            num_dogs += 1\n\n        # Break if we have enough images\n        if num_cats + num_dogs == target_images:\n            break\n\nprint(\"Number of cat images:\", num_cats)\nprint(\"Number of dog images:\", num_dogs)\nprint(\"Shape of images array:\", len(train_images_df))\nprint(\"Shape of labels array:\", len(train_labels_df))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_labels_df[0:10])\nprint(train_labels_df[2490:])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(40, 100))\n# for i, img in enumerate(train_images):\n#     plt.subplot(50, 20, i + 1)\n#     plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))\n#     plt.axis('off')\n\n# plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Imported only 250 images for test\n","metadata":{}},{"cell_type":"code","source":"predication_images = []\nfor filename in os.listdir(full_path_test):\n    if filename.endswith(\".jpg\"):\n        image_path = os.path.join(full_path_test, filename)\n        if len(predication_images) % 100 == 0:\n            print(len(predication_images))\n        img = cv2.imread(image_path)\n        if len(predication_images) == 250:\n            break\n        predication_images.append(img)\nprint(\"Shape of images array:\", len(predication_images))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(25, 50))\n# for i, img in enumerate(predication_images):\n#     plt.subplot(25, 10, i + 1)\n#     plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))\n#     plt.axis('off')\n\n# plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## sample Submission pattern\n","metadata":{}},{"cell_type":"code","source":"sample_submission = pd.read_csv(\n    '../data/dogs-vs-cats/sampleSubmission.csv').head(250)\nsample_submission","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Building and Training Models 🏗️🤖\n","metadata":{}},{"cell_type":"code","source":"train_labels_df = np.array(train_labels_df)\ntrain_labels_df[train_labels_df == 'cat'] = 0\ntrain_labels_df[train_labels_df == 'dog'] = 1\ntrain_labels_df = train_labels_df.astype(np.int32)\nprint(train_labels_df[0:10])\nprint(train_labels_df[2490:])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_size_pixels = 120","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_df = [cv2.resize(img, (image_size_pixels, image_size_pixels)) for img in train_images_df]\npredication_images = [cv2.resize(img, (image_size_pixels, image_size_pixels))\n                      for img in predication_images]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_df = np.array(train_images_df)\ntrain_images_df = train_images_df /(image_size_pixels-1)\npredication_images = np.array(predication_images)\npredication_images = predication_images / (image_size_pixels-1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_df.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train, x_test, y_train, y_test = train_test_split(\n    train_images_df, train_labels_df, test_size=0.2, random_state=42)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_test.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Convolutional Neural Network (CNN) 🌐🔍\n","metadata":{}},{"cell_type":"code","source":"cnn_model = keras.Sequential([\n    keras.layers.Conv2D(filters=32, kernel_size=3,\n                        input_shape=(image_size_pixels, image_size_pixels, 3), activation='relu'),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu'),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Conv2D(filters=128, kernel_size=3, activation='relu'),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Flatten(),\n    keras.layers.Dense(64, activation='relu'),\n    keras.layers.Dense(1, activation='sigmoid')\n])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model.compile(optimizer='adam',\n                  loss='binary_crossentropy',\n                  metrics=['accuracy'])\n\ncnn_model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model.fit(x_train, y_train, epochs=15,\n              batch_size=16, verbose=1, validation_split=0.15)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evalute_and_cm(model, x_test, y_test):\n    test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=1)\n    print(\"Accuracy on test set is: {}\".format(test_accuracy))\n\n    predictions = model.predict(x_test)\n    predictions = np.round(predictions).astype(int).reshape(x_test.shape[0])\n\n    cm = confusion_matrix(y_test, predictions)\n\n    plt.figure(figsize=(4, 3))\n    sns.heatmap(cm, annot=True, fmt='d')\n    plt.xlabel('Predicted')\n    plt.ylabel('Truth')\n    plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"evalute_and_cm(cnn_model, x_test, y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 0.7150 , 135,64,50,151","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Making Predictions 🚀🔮\n","metadata":{}},{"cell_type":"code","source":"y_predicted_x_test_df = cnn_model.predict(predication_images)\ny_predicted_x_test_df = np.round(y_predicted_x_test_df).astype(int).reshape(predication_images.shape[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission['label'] = y_predicted_x_test_df\n\nsample_submission.head(10)\n\nsample_submission.to_csv('submission.csv', index=False)\n\nprint(\"Visualizing Predictions 📊📈\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Implementing Dropout for Regularization 🕳️🔄\n","metadata":{}},{"cell_type":"code","source":"cnn_model_dropout = keras.Sequential([\n    keras.layers.Conv2D(filters=32, kernel_size=3,\n                        input_shape=(image_size_pixels, image_size_pixels, 3), activation='relu'),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Dropout(0.2),\n    keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu'),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Dropout(0.2),\n    keras.layers.Conv2D(filters=128, kernel_size=3, activation='relu'),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Dropout(0.2),\n    keras.layers.Flatten(),\n    keras.layers.Dense(64, activation='relu'),\n    keras.layers.Dropout(0.2),\n    keras.layers.Dense(1, activation='sigmoid')\n])\n\ncnn_model_dropout.compile(optimizer='adam',\n                          loss='binary_crossentropy',\n                          metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model_dropout.fit(x_train, y_train, epochs=5,\n              batch_size=16, verbose=1, validation_split=0.2)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"evalute_and_cm(cnn_model_dropout, x_test, y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Implementing batch for Regularization 🕳️🔄\n","metadata":{}},{"cell_type":"code","source":"cnn_model_batch = keras.Sequential([\n    keras.layers.Conv2D(filters=32, kernel_size=3,\n                        input_shape=(image_size_pixels, image_size_pixels, 3), activation='relu'),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Dropout(0.2),\n    keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu'),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Dropout(0.2),\n    keras.layers.Conv2D(filters=128, kernel_size=3, activation='relu'),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPooling2D(pool_size=2),\n    keras.layers.Dropout(0.2),\n    keras.layers.Flatten(),\n    keras.layers.Dense(64, activation='relu'),\n    keras.layers.Dropout(0.2),\n    keras.layers.Dense(1, activation='sigmoid')\n])\n\ncnn_model_batch.compile(optimizer='adam',\n                        loss='binary_crossentropy',\n                        metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model_batch.fit(x_train, y_train, epochs=5,\n              batch_size=16, verbose=1, validation_split=0.2)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"evalute_and_cm(cnn_model_batch, x_test, y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Augmentation for Improved Generalization 🔄📸\n","metadata":{}},{"cell_type":"code","source":"print(\"Data Augmentation for Improved Generalization 🔄📸\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Conclusion 🎉🏁\n","metadata":{}},{"cell_type":"markdown","source":"## **Score: 0.7100**\n","metadata":{}}]}