diff --git "a/16_Object_Detection_Selective_Search.ipynb" "b/16_Object_Detection_Selective_Search.ipynb" new file mode 100644--- /dev/null +++ "b/16_Object_Detection_Selective_Search.ipynb" @@ -0,0 +1,656 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "bc541927", + "metadata": {}, + "source": [ + "---\n", + "title: 17 Object Detection using Selective Search\n", + "description: A basic object detection implementation using selective search on top of an image classifer\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "9d14fb02", + "metadata": {}, + "source": [ + "\"Colab\"" + ] + }, + { + "cell_type": "markdown", + "id": "eLSycsW4_Eba", + "metadata": { + "id": "eLSycsW4_Eba" + }, + "source": [ + "\"Kaggle\"" + ] + }, + { + "cell_type": "markdown", + "id": "0abd5bb3", + "metadata": { + "id": "0abd5bb3", + "papermill": { + "duration": 0.007939, + "end_time": "2022-04-01T17:59:21.907600", + "exception": false, + "start_time": "2022-04-01T17:59:21.899661", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Object Detection using Selective Search\n", + "\n", + "We will be using concepts of Selective Search and Non-Maxima Supression to turn almost any Image Classifier into an Object Detector\n", + "* **Selective Search**: \n", + " * Selective Search algorithm over-segments an image via:\n", + " * Color similarity: Computing a 25-bin histogram for each channel of an image, concatenating them together, and obtaining a final descriptor that is 25×3=75-d. Color similarity of any two regions is measured by the histogram intersection distance.\n", + " * Texture similarity: For texture, Selective Search extracts Gaussian derivatives at 8 orientations per channel (assuming a 3-channel image). These orientations are used to compute a 10-bin histogram per channel, generating a final texture descriptor that is 8x10x=240-d. To compute texture similarity between any two regions, histogram intersection is once again used.\n", + " * Size similarity: The size similarity metric that Selective Search uses prefers that smaller regions be grouped earlier rather than later. By enforcing smaller regions to merge earlier, we can help prevent a large number of clusters from swallowing up all smaller regions.\n", + " * Shape similarity: The idea behind shape similarity in Selective Search is that they should be compatible with each other. Two regions are considered “compatible” if they “fit” into each other (thereby filling gaps in our regional proposal generation). Furthermore, shapes that do not touch should not be merged.\n", + " * A final meta-similarity measure: A final meta-similarity acts as a linear combination of the color similarity, texture similarity, size similarity, and shape similarity/compatibility.\n", + "* **Non-Maxima Supression**:\n", + " * When performing object detection, our object detector will typically produce multiple, overlapping bounding boxes surrounding an object in an image.\n", + " * We somehow need to collapse/remove the extraneous bounding boxes.\n", + " * Non-maxima suppression (NMS) collapses weak, overlapping bounding boxes in favor of the more confident ones.\n", + " \n", + "**Credits**: [PyImageSearch](https://pyimagesearch.com/2020/07/06/region-proposal-object-detection-with-opencv-keras-and-tensorflow/)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "435bedea", + "metadata": { + "_kg_hide-input": true, + "_kg_hide-output": true, + "execution": { + "iopub.execute_input": "2022-04-01T17:59:21.929326Z", + "iopub.status.busy": "2022-04-01T17:59:21.927605Z", + "iopub.status.idle": "2022-04-01T17:59:33.061284Z", + "shell.execute_reply": "2022-04-01T17:59:33.060586Z", + "shell.execute_reply.started": "2022-04-01T17:56:56.833245Z" + }, + "id": "435bedea", + "papermill": { + "duration": 11.144723, + "end_time": "2022-04-01T17:59:33.061452", + "exception": false, + "start_time": "2022-04-01T17:59:21.916729", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install imutils huggingface_hub" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70bb9929", + "metadata": { + "execution": { + "iopub.execute_input": "2022-04-01T17:59:33.081237Z", + "iopub.status.busy": "2022-04-01T17:59:33.080636Z", + "iopub.status.idle": "2022-04-01T17:59:39.231510Z", + "shell.execute_reply": "2022-04-01T17:59:39.231016Z", + "shell.execute_reply.started": "2022-04-01T17:57:05.635264Z" + }, + "id": "70bb9929", + "papermill": { + "duration": 6.163174, + "end_time": "2022-04-01T17:59:39.231652", + "exception": false, + "start_time": "2022-04-01T17:59:33.068478", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import argparse\n", + "import imutils\n", + "import time\n", + "import cv2\n", + "\n", + "import tensorflow as tf\n", + "from huggingface_hub import from_pretrained_keras\n", + "\n", + "from imutils.object_detection import non_max_suppression\n", + "\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd95239f", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 188 + }, + "execution": { + "iopub.execute_input": "2022-04-01T17:59:39.252080Z", + "iopub.status.busy": "2022-04-01T17:59:39.251435Z", + "iopub.status.idle": "2022-04-01T17:59:40.185265Z", + "shell.execute_reply": "2022-04-01T17:59:40.184797Z", + "shell.execute_reply.started": "2022-04-01T17:57:05.643277Z" + }, + "id": "fd95239f", + "outputId": "eb45e615-d3de-4174-84df-5e16386efd3a", + "papermill": { + "duration": 0.946754, + "end_time": "2022-04-01T17:59:40.185403", + "exception": false, + "start_time": "2022-04-01T17:59:39.238649", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", + "11493376/11490434 [==============================] - 0s 0us/step\n", + "11501568/11490434 [==============================] - 0s 0us/step\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n", + "\n", + "orig = np.zeros((28, 112))\n", + "orig[:, :28] = x_train[0]\n", + "orig[:, 28:56] = x_train[1]\n", + "orig[:, 56:84] = x_train[2]\n", + "orig[:, 84:] = x_train[3]\n", + "(H, W) = orig.shape[:2]\n", + "plt.imshow(orig, cmap='gray');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06e9e075", + "metadata": { + "execution": { + "iopub.execute_input": "2022-04-01T17:59:40.224590Z", + "iopub.status.busy": "2022-04-01T17:59:40.223536Z", + "iopub.status.idle": "2022-04-01T17:59:40.225541Z", + "shell.execute_reply": "2022-04-01T17:59:40.225991Z", + "shell.execute_reply.started": "2022-04-01T17:58:17.699949Z" + }, + "id": "06e9e075", + "papermill": { + "duration": 0.030648, + "end_time": "2022-04-01T17:59:40.226160", + "exception": false, + "start_time": "2022-04-01T17:59:40.195512", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "class SelectiveSearchObjectDetection():\n", + " def __init__(self, pretrained_classifier_path, **kwargs):\n", + " self.model = from_pretrained_keras(pretrained_classifier_path)\n", + " self.kwargs = kwargs\n", + " \n", + " def selective_search(self, image, method=\"fast\"):\n", + " ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()\n", + " ss.setBaseImage(image)\n", + " if method == \"fast\":\n", + " ss.switchToSelectiveSearchFast()\n", + " else:\n", + " ss.switchToSelectiveSearchQuality()\n", + " return ss.process()\n", + " \n", + " def get_rois_and_locs(self, rects):\n", + " rois = []\n", + " locs = []\n", + " for (x, y, w, h) in rects:\n", + " if w / float(W) < 0.1 or h / float(H) < 0.1:\n", + " continue\n", + " roi = orig[y:y + h, x:x + w]\n", + " roi = cv2.resize(roi, self.kwargs['INPUT_SIZE'])\n", + " rois.append(roi)\n", + " locs.append((x, y, w, h))\n", + " return rois, locs\n", + " \n", + " def visualize_rois(self, rois):\n", + " fig, axes = plt.subplots(1, len(rois), figsize=(20, 6))\n", + " for ax, roi in zip(axes, rois):\n", + " ax.imshow(roi, cmap='gray')\n", + " \n", + " def get_preds(self, rois, locs):\n", + " rois = np.array(rois, dtype=\"float32\")\n", + " preds = self.model.predict(rois)\n", + " preds = list(zip(preds.argmax(axis=1).tolist(), preds.max(axis=1).tolist()))\n", + " labels = {}\n", + "\n", + " for (i, p) in enumerate(preds):\n", + " (label, prob) = p\n", + " if prob >= self.kwargs['MIN_CONF']:\n", + " box = locs[i]\n", + " L = labels.get(label, [])\n", + " L.append((box, prob))\n", + " labels[label] = L\n", + " return preds, labels\n", + " \n", + " def apply_nms(self, labels):\n", + " nms_labels = {}\n", + " for label in sorted(labels.keys()):\n", + " boxes = np.array([p[0] for p in labels[label]])\n", + " proba = np.array([p[1] for p in labels[label]])\n", + " boxes = non_max_suppression(boxes, proba)\n", + " nms_labels[label] = boxes.tolist()\n", + " return nms_labels\n", + " \n", + " def visualize_preds(self, img, nms_labels):\n", + " for label in sorted(nms_labels.keys()):\n", + " clone = img.copy()\n", + " fig, ax = plt.subplots(figsize=(20, 6))\n", + " boxes = nms_labels[label]\n", + " for (startX, startY, width, height) in boxes:\n", + " cv2.rectangle(clone, (startX, startY), (startX+width, startY+height), (255, 255, 255), 1)\n", + " y = startY - 10 if startY - 10 > 10 else startY + 10\n", + " cv2.putText(clone, str(label), (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 255, 255), 1)\n", + "\n", + " ax.imshow(clone, cmap='gray')\n", + " ax.set_title(\"After\")\n", + " \n", + " def __call__(self, img):\n", + " rects = self.selective_search(np.dstack([img, img, img]).astype(np.float32))\n", + " rois, locs = self.get_rois_and_locs(rects)\n", + " if self.kwargs['VIZ_ROIS']:\n", + " self.visualize_rois(rois)\n", + " preds, labels = self.get_preds(rois, locs)\n", + " nms_labels = self.apply_nms(labels)\n", + " \n", + " if self.kwargs['VISUALIZE']:\n", + " self.visualize_preds(img, nms_labels)\n", + " return nms_labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2a5b43d", + "metadata": { + "execution": { + "iopub.execute_input": "2022-04-01T17:59:40.248487Z", + "iopub.status.busy": "2022-04-01T17:59:40.247927Z", + "iopub.status.idle": "2022-04-01T17:59:40.250911Z", + "shell.execute_reply": "2022-04-01T17:59:40.251362Z", + "shell.execute_reply.started": "2022-04-01T17:58:18.899820Z" + }, + "id": "c2a5b43d", + "papermill": { + "duration": 0.015914, + "end_time": "2022-04-01T17:59:40.251516", + "exception": false, + "start_time": "2022-04-01T17:59:40.235602", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "kwargs = dict(INPUT_SIZE=(28, 28), MIN_CONF=0.9, VISUALIZE=True, VIZ_ROIS=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f92e6df0", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "c83b3a4e54c3414e89060cf2b8a776eb", + "592a4c1528d54865869a8d819aa4b7e0", + "8316ee7a05004bac99c314f44d3f36bd", + "3788681052c348318758fffcfb9f4505", + "c8eccb9a76ce4dbda3d06f923241ef0f", + "ccfce87d03cb498485889d42646b866d", + "fce78648334846a3a4b93e13f85f1249", + "ecd322dcbb5c4bad89ce5ccd9b5102a1", + "0f4d47898748410f9256b198249f018c", + "bee937739d434856be31a0ad574e45c8", + "37beabd5f6514c1e81258919a2f43465", + "6b0856aeb06c432a93fd27f5dca288fb", + "375a139157894ba3a8d7da4dd218fcc7", + "35f595ffbbb849ffb5f58aa34c69a271", + "527f61743f294cf98f3b381c3f074719", + "0d2b257fdeee431fb8226a0bff0d48f1", + "9d7e74bc7b06460ca0907cc96f8ca515", + "65f9968fe69d48ec90a14604c7b7a23b", + "bcbe9ab251b54b5aa1ca5f541eec65d3", + "9714ea1b2989433e918833c399960e30", + "26aa289306c34d69bb70aa1e044c1eee", + "3aa717727b3d4cb3a3f35cf0753727a0", + "905936a8272245ea867df8ee79c2e2b8", + "8eb8bc73a72c4539bc505793cbc80fce", + "ae6a74c2e023427db28603436a2cac2a", + "29b4076e3b504f23af2ec80317fb2bcc", + "a5ce1e4e44664155a11d2228f5f70b7a", + "f5fa8d23adb3437eb8cacaedcbf89135", + "1cc16501cf6346f6be25286d95e8ce97", + "4af13621bbe94290b5cae7ef8749e88c", + "e4d365ae924740689b23d0cac91fa89f", + "a0e6441a752642f3bb84b73fd54eb46d", + "01fd5ae9265c45dd9daf169efeb11794", + "8a0ee0a9afc74bcb9586abd937165987", + "990afb2fb9334943917470bc9fceed3f", + "48ef80a7c14046bfa07c9fc7fe34aa67", + "269313ea387b492b973fcbe5d1eaa31e", + "ab9e50159a0c4f27b543d4fc1491e43b", + "fc25f4e912f04b85b620e705373f8858", + "6687a31b9b1e41be98d02305adf3ad00", + "da84a215bf654a8b9c43c2ef09c652b0", + "f269fa9966cb4edba00dd969993a39be", + "28f868157d6d422a98cabc2289f13a15", + "fa56497bde744d5e8facd42adeabfc41", + "6e704ce9517242dbbd179eef9c4b83ec", + "4d404afad73b4eec9c1bf70ba95f55be", + "7699955af3a043208211b9dc926e68de", + "02cc2af8127f48648889b4819219dce3", + "7bf7631812b4450280532265f6ae3586", + "f28372b2045145ea8db43e66d52e740d", + "9c69a30e766a479f9b2e506f67eb0d3c", + "ae7e127423774356ac38c4b656ba126f", + "6464f8c5c4bf4230bb349ba0675368a7", + "0ea9422cc9e144158b30b490e0e22ff9", + "85e64bc8846a4f50822199934eb442c7", + "d01407ec1c5e4548b553676ff7c3059f", + "7875457ade384e97a3c63eb086387f24", + "7121a4533aa04021a725a61564e088d7", + "b1c46dbcb9de490299ca9aad831a2948", + "d278ed188eca43ef836966abaeb3044b", + "7a6abc817e84489ebf5123d0c81cb0e3", + "9306b0ed01844203a86f24c988371ea7", + "67a8f1b771fe41488fa5c384f6f08993", + "bcbef9e603e7432a8ac6d5650d8fb3fd", + "427e9b10f0b1436b944014168fe4d0d8", + "ed0af336b5f54b72a7eea332cd0de4fc" + ] + }, + "execution": { + "iopub.execute_input": "2022-04-01T17:59:40.272816Z", + "iopub.status.busy": "2022-04-01T17:59:40.272251Z", + "iopub.status.idle": "2022-04-01T17:59:47.406903Z", + "shell.execute_reply": "2022-04-01T17:59:47.406292Z", + "shell.execute_reply.started": "2022-04-01T17:58:19.755854Z" + }, + "id": "f92e6df0", + "outputId": "d3596abb-5e33-4b15-e795-d212664f4f45", + "papermill": { + "duration": 7.146192, + "end_time": "2022-04-01T17:59:47.407041", + "exception": false, + "start_time": "2022-04-01T17:59:40.260849", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "config.json not found in HuggingFace Hub\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c83b3a4e54c3414e89060cf2b8a776eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading: 0%| | 0.00/1.29k [00:00" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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H12VW7duXVXu3nvvrcrdeuutVTkYbwYHB6typZSqXO2++/zzz1fldtlll6pc7dfvu+66qypXO1/t/xe6c8ghh1Tlav++LFy4sJtxGEfe9ra3VeXuuOOOEZ4EGAknnnhiVe7000+vytV+X1XL9xmbr9vHuQMAAAAwRil+AAAAABql+AEAAABolOIHAAAAoFGKHwAAAIBGKX4AAAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYN9HsAImbMmFGVu/nmm6tykyZN6maccW1wcLAqd8YZZ1Tlnn766arcFVdcUZVbvXp1Ve6JJ56oyi1fvrwqB5sjM6ty22+/fVVu/fr13YwzJqxYsaIq99d//ddVuSuvvLIq9y//8i9VudqvaV/84hercoyOWbNmVeWmTZtWlVu4cGEX09CCCRPqfia89957V+X22muvqlztcQMYHbX77mte85oRnoReccYPAAAAQKMUPwAAAACNUvwAAAAANErxAwAAANAoxQ8AAABAoxQ/AAAAAI1S/AAAAAA0SvEDAAAA0CjFDwAAAECjBvo9ABGPPvpoVe7xxx+vyk2aNKmbccaEJUuWVOXWrl1blXvPe95TlXv++eerct/+9rercsCmXXjhhf0eYZMmTKj7uciLL75Yldt///2rcjvuuGNV7tZbb63KzZo1qyo3ffr0qhxjywknnFCV+8EPfjDCk9CK3XbbrSp30kknVeX+9m//tir34IMPVuWA7syePbsq9yd/8ic93W7tPn7kkUdW5dasWdPNOOOSM34AAAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYpfgAAAAAapfgBAAAAaJTiBwAAAKBRih8AAACARil+AAAAABo10O8BiPjFL35RlTvttNOqckceeWRV7u67767KzZ8/vypX65577hk2c9hhh1Wta/369VW53/7t367KzZs3ryoH41FmVuUOOOCAqtxxxx1XlRscHKzKTZgw+j/LqP1/8u///u9Vudqvy0888URV7r3vfW9Vrva/g7GlH3/nadvFF1/c0/WtWLGip+sDNm7mzJlVuQULFlTlJk2a1M04r/DlL3+5KvfII4/0dLv8ku8YAAAAABql+AEAAABolOIHAAAAoFGKHwAAAIBGKX4AAAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYpfgAAAAAaNdDvAah39dVXV+Vuvvnm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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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c6nX5Ii4svOM+oGI+JtSyj/2ZCoAAAAAurbOxU8p5eGI2KWHswAAAADQQ93e3JkxtP3221flNthgg6rcBz/4warcPvvsU5XbfPPNq3JHHXVUVW48W7p0aVVu/vz5VbkjjzyyKvfMM89U5e66666q3MKFC6ty8Faw116vu83c61xxxRVV65o0aVJVrpRSlavdd1988cWq3FZbbVWV23vvvatyS5YsqcrVzsfY2HfffatytZ8vV155ZTfjMIHsueeeVbnbb799lCeBtetcmTKi2mP5RHL88cdX5U455ZSq3NDQUBfTvJ6/szev28e5AwAAADBOKX4AAAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYpfgAAAAAapfgBAAAAaJTiBwAAAKBRih8AAACARg30ewAiBgcHq3I33HBDVW7SpEndjDOhDQ0NVeXmzp1blXv22WercpdeemlVbvny5VW5J598sir3wAMPVOVgNGy88cZVud12260q953vfGfEzDbbbFO1rl578MEHq3J/+Zd/WZW77LLLqnL//M//XJWr/Zr2F3/xF1U5xsb06dOrclOnTq3KXXnllV1MQwvWW6/u34R33HHHqtwOO+xQlcvMqhyMhtrPv1LKKE8yftTuu29729tGeRJ6xRk/AAAAAI1S/AAAAAA0SvEDAAAA0CjFDwAAAECjFD8AAAAAjVL8AAAAADRK8QMAAADQKMUPAAAAQKMUPwAAAACNGuj3AEQ8+uijVbknnniiKjdp0qRuxhkXFi1aVJVbuXJlVe7DH/5wVe7FF1+syn3729+uygFrd+6551blZsyYMcqTjL7ddtutKrfppptW5RYuXFiVmz59elVu2rRpVTnGl+OOO64qd+utt47yJLRim222qcqdcMIJVbnvfOc7Vbn777+/Kgd054ADDqjK/dEf/VFPt1u7jx922GFVuRUrVnQzzoTkjB8AAACARil+AAAAABql+AEAAABolOIHAAAAoFGKHwAAAIBGKX4AAAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYN9HsAIn75y19W5ebMmVOVO+yww6pyP/rRj6py8+fPr8rVuvPOO0fMHHjggVXrWrVqVVXuN3/zN6tyJ510UlUOWLvdd9+9KnfooYdW5TKzm3FeZeHChVW5733ve1W5efPmVeX+7d/+rSpX+3X5ySefrMp95CMf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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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AAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYNDXoApr6zzjqrKrf//vtX5Q455JBxM4cddljVum688caqHExHW265ZVXuvPPOq8odddRRVbnHHnusKnfSSSdV5UZGRqpyW221VVWOjfeyl71s0COwnszsdH2llGm1vq7//qay2p/zs2bNqsr967/+a1Wu9ngA09Hs2bPHzSxatGjiBxnDRz7ykarcLbfcMsGT0BVn/AAAAAA0SvEDAAAA0CjFDwAAAECjFD8AAAAAjVL8AAAAADRK8QMAAADQKMUPAAAAQKMUPwAAAACNUvwAAAAANGpo0AMw9T3xxBNVuVNPPbUqt3z58nEzl156adW6brnllqrcyMhIVe7iiy+uypVSqnIwSPvuu29V7qijjup0u0cffXRVbsmSJZ1uF6ab2mPR4YcfXpW76aabOt1uZg5kfVPZNttsU5U78sgjq3InnHBCVe6II46oytX68z//86rc2rVrO90utKRmP99nn3063Wbtz/kLL7yw0+0yeM74AQAAAGiU4gcAAACgUYofAAAAgEYpfgAAAAAapfgBAAAAaJTiBwAAAKBRih8AAACARil+AAAAABo1NOgBaMf3vve9qtwpp5wybuaKK66oWteJJ57Yae7FL35xVe7qq6+uyq1ataoqBxPhggsuqMplZlVuyZIlneaYeJttVvf/d9atWzfBkzBI22+/fafrq/2Z0bXh4eGq3GGHHVaV23XXXatyW2yxxbiZ448/vmpdtfvkz372s6rcsmXLqnJPPfVUVW5oqO5Xg9tvv70qB9PRMcccU5U799xzO9vm17/+9arcySefXJV75JFH+hmHKcgZPwAAAACNUvwAAAAANErxAwAAANAoxQ8AAABAoxQ/AAAAAI1S/AAAAAA0SvEDAAAA0CjFDwAAAECjFD8AAAAAjRoa9ABMP9ddd924mXvvvbdqXRdccEFV7tBDD63KffCDH6zK7bbbblW5c845pyq3cuXKqhxERMybN68qNzw8XJUrpVTlFi9eXJVj6li3bl1VrvbfwB133NHPOHSs9r/b3/zN31TlzjjjjH7GmXDLly+vyj3zzDNVuSeffLIqd9ddd42bufzyy6vWNTIyUpVbsmRJVW716tVVuRUrVlTlttpqq6rcPffcU5WDlsyePbsqt2jRookdZAz3339/Va72ZwbtccYPAAAAQKPGLX4y8/LMfDAz71xv2VmZuTIz7+h9HDWxYwIAAADwQtWc8XNlRBw5xvK/LqUM9z6+1O1YAAAAAPRr3OKnlPK1iPjpJMwCAAAAQIf6ucbPgsz8du+tYNttKJSZp2XmSGaOrFmzpo/NAQAAAPBCbGzx8/GI+PWIGI6IVRFx/oaCpZRPlFLmlFLmzJw5cyM3BwAAAMALtVHFTylldSnl2VLKuoi4NCIO6HYsAAAAAPq1UcVPZu683sNjI+LODWUBAAAAGIyh8QKZ+ZmImBsRO2bmioj4s4iYm5nDEVEi4gcR8c4JnBEAAACAjTBu8VNKmT/G4k9OwCzw/915Z91JZG9961urcm9605uqcldccUVV7p3vrOs699xzz6rc4YcfXpWDiIitttqqKrfFFltU5R588MGq3Gc/+9mqHBtvyy23rMqdddZZnW735ptvrsp94AMf6HS79OeMM86oyh100EETPEl/Hnjggarc5z//+arc3XffXZW77bbbqnJT2WmnnVaVq73O5v3339/PONC0973vfVW5devWTfAkz3fuuedO+jbZtPRzVy8AAAAApjDFDwAAAECjFD8AAAAAjVL8AAAAADRK8QMAAADQKMUPAAAAQKMUPwAAAACNUvwAAAAANErxAwAAANCooUEPAP1Yu3ZtVe5Tn/pUVe6yyy6ryg0N1e06r3vd66pyc+fOrcp99atfrcrBC/HUU09V5VatWjXBk7Rryy23rMqdeeaZVbmFCxdW5VasWFGVO//886tyjz/+eFWOyfGhD31o0CMwYIceemin61u0aFGn64NNwfDwcFXuiCOOmOBJnu/666+vyn33u9+d4EnY1DnjBwAAAKBRih8AAACARil+AAAAABql+AEAAABolOIHAAAAoFGKHwAAAIBGKX4AAAAAGqX4AQAAAGiU4gcAAACgUUODHgDGss8++1Tl3vKWt1TlXvWqV1Xlhoa63SXuuuuuqtzXvva1TrcLL8TixYsHPcIma3h4uCq3cOHCqtzb3va2qtz1119flTvuuOOqcgAREdddd92gR4BJd+ONN1bltttuu063e9ttt42bOeWUUzrdJtOXM34AAAAAGqX4AQAAAGiU4gcAAACgUYofAAAAgEYpfgAAAAAapfgBAAAAaJTiBwAAAKBRih8AAACARil+AAAAABo1NOgBaMdee+1VlVuwYMG4mTe/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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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nq4PGNnee+9dlbv00kurclOnTu1mnNf50pe+VJV79NFHe7pdfsFPDAAAAACNUvwAAAAANErxAwAAANAoxQ8AAABAoxQ/AAAAAI1S/AAAAAA0SvEDAAAA0CjFDwAAAECjFD8AAAAAjcpSyvhtLHP8Nraa2t9jZo7xJONj0003rco988wzVbmhoaGe5o488shRM1dddVXVuphYJtu+NtkMDg5W5W6++eaqXO33qlrf+c53Rs3MnTu3al377rtvVW7mzJlVuYsvvrgq97Of/awqV+uVV16pyj3//PNVudr/LkuXLq3KMbLaP1e33357Ve6b3/xmVe6oo46qytGuRYsWVeX23HPPqtxee+1VlbvjjjuqcsDILrrooqrcxz72sZ5u99Zbb63KzZ49u6fbZY3uKqXsNtIbo57xk5mXZObjmXnPasu2yMzvZuZDnc+b93JaAAAAALpXc6nXZRFx4GuWfSYibiqlzIiImzqvAQAAAJhARi1+Sim3RcS/vWbxIRFxeefryyNiTo/nAgAAAKBLA2v566aVUlZ0vv5pRExbUzAzj4+I49dyOwAAAACspbUtfv5DKaW80U2bSykXRsSFEf27uTMAAADAZLS2j3NfmZlbR0R0Pj/eu5EAAAAA6IW1LX4WRMQxna+PiYjrejMOAAAAAL1S8zj3qyLi9ojYMTOXZebHI+KMiNg/Mx+KiP06rwEAAACYQEa9x08pZe4a3prd41kAAAAA6KGub+7MxPP000/3e4Q3dNxxx42aueaaa6rWNTQ01O04MOm9853vrMqdfPLJVbmpU6dW5Z544omq3IoVK0YPRcTll18+aubZZ5+tWtff//3f9zQ30U2ZMqUqd9JJJ1XljjjiiG7GmfQOOuigqlzt/zeYNm2ND+D9JTvssENPt7t8+fKerg8mm7e+9a1VuY997GNVudq/O61ataoq9+d//udVOfpvbe/xAwAAAMAEp/gBAAAAaJTiBwAAAKBRih8AAACARil+AAAAABql+AEAAABolOIHAAAAoFGKHwAAAIBGKX4AAAAAGjXQ7wEmklJKVS4zx3iS8VH7+91kk02qctdff31Vbt999x01s99++1Wt68Ybb6zKwWS04YYbVuXOPPPMqtxBBx1UlXvmmWeqckcffXRVbsmSJVW5KVOmVOVYe9ttt12/R5gUdtxxx56u79577+3p+lj31H6f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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Ritvik19/mnist-net is a convnet trained on mnist data read more: https://huggingface.co/Ritvik19/mnist-net\n", + "model = SelectiveSearchObjectDetection('Ritvik19/mnist-net', **kwargs)\n", + "preds = model(orig)\n", + "print(\"Predictions: \", preds)" + ] + }, + { + "cell_type": "markdown", + "id": "b143ea92", + "metadata": { + "id": "b143ea92", + "papermill": { + "duration": 0.015668, + "end_time": "2022-04-01T17:59:47.438879", + "exception": false, + "start_time": "2022-04-01T17:59:47.423211", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Ending Notes\n", + "* The above approach simplifies what happens in an RCNN\n", + "* We can build a Fast RCNN using the same approach, with few additional steps:\n", + " * Data Preparation:\n", + " * Use selective search to detect objects in your image dataset\n", + " * Label those images with appropriate classes and Bounding boxes\n", + " * Modelling:\n", + " * Use a pretrained CNN to extract feature maps from the input image\n", + " * Use selective search to identify ROIs in the input image\n", + " * Use ROI Pooling to project the ROIs into the feature maps\n", + " * Train a downstream classifier to classify the images, and a bounding box regression model" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "Object-Detection-Selective-Search.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "papermill": { + "default_parameters": {}, + "duration": 37.438617, + "end_time": "2022-04-01T17:59:50.957667", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2022-04-01T17:59:13.519050", + "version": "2.3.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}