{"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 cv2 as cv\nimport matplotlib.pyplot as plt\nfrom scipy.cluster.vq import *\nfrom scipy.stats import mode\nimport sklearn.preprocessing\nimport os\nimport random","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-26T14:06:50.946037Z","iopub.execute_input":"2023-01-26T14:06:50.946411Z","iopub.status.idle":"2023-01-26T14:06:52.026628Z","shell.execute_reply.started":"2023-01-26T14:06:50.946302Z","shell.execute_reply":"2023-01-26T14:06:52.025261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /kaggle/input/dogs-vs-cats/train.zip\n!unzip /kaggle/input/dogs-vs-cats/test1.zip","metadata":{"_kg_hide-input":false,"_kg_hide-output":true,"scrolled":true,"execution":{"iopub.status.busy":"2023-01-26T14:06:52.033918Z","iopub.execute_input":"2023-01-26T14:06:52.036489Z","iopub.status.idle":"2023-01-26T14:07:14.907429Z","shell.execute_reply.started":"2023-01-26T14:06:52.036446Z","shell.execute_reply":"2023-01-26T14:07:14.906203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = ['cat', 'dog']\ntrain_path = '/kaggle/working/train'\ntrain_paths = os.listdir(train_path)\ntrain_image_list = []\ntrain_image_class = []\ntrain_samples = random.sample(range(0, 25000), 10000)\nfor index in train_samples:\n  train_image_list.append(cv.imread(train_path + '/' + train_paths[index]))\n  if 'cat' in train_paths[index]:\n    train_image_class.append(0)\n  else:\n    train_image_class.append(1)","metadata":{"execution":{"iopub.status.busy":"2023-01-26T14:07:14.909304Z","iopub.execute_input":"2023-01-26T14:07:14.910435Z","iopub.status.idle":"2023-01-26T14:07:35.800697Z","shell.execute_reply.started":"2023-01-26T14:07:14.910393Z","shell.execute_reply":"2023-01-26T14:07:35.799638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (20, 70))\nfor i in range(20):\n    plt.subplot(20, 5, i + 1)\n    plt.imshow(cv.cvtColor(train_image_list[i], cv.COLOR_BGR2RGB))\n    plt.title(labels[train_image_class[i]])\nplt.suptitle('First 100 Images in Train Dataset')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-01-26T14:07:35.802369Z","iopub.execute_input":"2023-01-26T14:07:35.802765Z","iopub.status.idle":"2023-01-26T14:07:38.488155Z","shell.execute_reply.started":"2023-01-26T14:07:35.802725Z","shell.execute_reply":"2023-01-26T14:07:38.487122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sift = cv.SIFT_create()\ntrain_descriptors = []\nfor image in train_image_list:\n  _, descriptor = sift.detectAndCompute(image, None)\n  train_descriptors.append(descriptor)\n\nstacked_descriptors = train_descriptors[0]\nfor descriptor in train_descriptors[1:]:\n  stacked_descriptors = np.vstack((stacked_descriptors, descriptor))\nstacked_descriptors = np.float32(stacked_descriptors)","metadata":{"execution":{"iopub.status.busy":"2023-01-26T14:07:38.491032Z","iopub.execute_input":"2023-01-26T14:07:38.491377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"centroids, _ = kmeans(stacked_descriptors, 7, 100)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_V = np.zeros((len(train_image_list), len(centroids)), \"float32\")\n\nfor i in range(len(train_image_list)):\n  words, _ = vq(train_descriptors[i], centroids)\n  for w in words:\n    train_V[i, w] += 1\n\ntrain_V_normalized = sklearn.preprocessing.normalize(train_V, 'l1')\nprint(train_V_normalized[0:100])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def euclidean(x1, x2):\n  return np.sqrt(np.sum((x1 - x2) ** 2))\n\nclass KNNClassification:\n  def __init__(self, k):\n    self.k = k\n  \n  def fit(self, X_train, y_train):\n    self.X_train = X_train\n    self.y_train = y_train\n\n  def predict(self, X_test):\n    y_pred = [self._predict(x_test) for x_test in X_test]\n    return np.array(y_pred)\n\n  def _predict(self, x_test):\n    dist = [euclidean(x_test, x_train) for x_train in self.X_train]\n    k_nearest = np.argsort(dist)[:self.k]\n    k_nearest_class = [self.y_train[i] for i in k_nearest]\n    most_common = mode(k_nearest_class)\n    return most_common[0][0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_path = '/kaggle/working/test1'\ntest_paths = os.listdir(test_path)\ntest_samples = random.sample(range(0, 12500), 100)\ntest_image_list = []\nfor index in test_samples:\n  test_image_list.append(cv.imread(test_path + '/' + test_paths[index]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_descriptors = []\nfor image in test_image_list:\n  _, descriptor = sift.detectAndCompute(image, None)\n  test_descriptors.append(descriptor)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_V = np.zeros((len(test_image_list), len(centroids)), \"float32\")\n\nfor i in range(len(test_image_list)):\n  words, _ = vq(test_descriptors[i], centroids)\n  for w in words:\n    test_V[i, w] += 1\n\ntest_V_normalized = sklearn.preprocessing.normalize(test_V, 'l1')\nprint(test_V_normalized[0:100])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (20, 70))\nfor i in range(200):\n    plt.subplot(20, 5, i + 1)\n    plt.imshow(cv.cvtColor(test_image_list[i], cv.COLOR_BGR2RGB))\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = KNNClassification(9)\nmodel.fit(train_V, train_image_class)\ny_pred = model.predict(test_V)\n\nplt.figure(figsize = (20, 70))\nfor i in range(20):\n    plt.subplot(20, 5, i + 1)\n    plt.imshow(cv.cvtColor(test_image_list[i], cv.COLOR_BGR2RGB))\n    plt.title(labels[y_pred[i]])\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}