{"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":"## Index  \n* 1. [Import Liabraries](#section_1)    \n* 2. [Unzip the files](#section_2)  \n* 3. [Human Readable Lable](#label)  \n* 4. [Load Pretrained Model](#model)  \n* 5. [Predict Crop Image](#Bounding_Box)  \n* 6. [NMS](#NMS)\n","metadata":{}},{"cell_type":"markdown","source":"![flowchart for object detection.png](attachment:127637fa-9825-42b2-95e5-ed6fb42bcf8c.png)","metadata":{},"attachments":{"127637fa-9825-42b2-95e5-ed6fb42bcf8c.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAJQAAAGbCAYAAAAiHbm1AAAAAXNSR0IArs4c6QAABhN0RVh0bXhmaWxlACUzQ214ZmlsZSUyMGhvc3QlM0QlMjJhcHAuZGlhZ3JhbXMubmV0JTIyJTIwbW9kaWZpZWQlM0QlMjIyMDIxLTExLTA5VDIzJTNBMDklM0EwOS4wODdaJTIyJTIwYWdlbnQlM0QlMjI1LjAlMjAoV2luZG93cyUyME5UJTIwMTAuMCUzQiUyMFdpbjY0JTNCJTIweDY0KSUyMEFwcGxlV2ViS2l0JTJGNTM3LjM2JTIwKEtIVE1MJTJDJTIwbGlrZSUyMEdlY2tvKSUyMENocm9tZSUyRjk1LjAuNDYzOC42OSUyMFNhZmFyaSUyRjUzNy4zNiUyMiUyMGV0YWclM0QlMjJtdTA0RXQzQWVFMFRST1QxUFFNVSUyMiUyMHZlcnNpb24lM0QlMjIxNS41LjQlMjIlMjB0eXBlJTNEJTIyZGV2aWNlJTIyJTNFJTNDZGlhZ3JhbSUyMGlkJTNEJTIycEpYdXNmQ1dwS1V2TzBvLTJ3LTYlMjIlMjBuYW1lJTNEJTIyUGFnZS0xJTIyJTNFM1ZoUmM2SXdFUDQxUHRhQklGUWZUJTJCdTFOM04zY3pOT3I5ZkhIRVJJR3dnTm9lTDklMkJrdklJcUswOWFwWXp4ZGx2ODFDc2wlMkIlMkJ6VUxQbWNURnRjQnA5STBIaFBXUUZSUTk1NnFIME5BYnFsOE5MQTFnTzliSUlLR2dBV0ExTUtOJTJGQ0lBV29Ea05TTllZS0RsbmtxWk4wT2RKUW56WndMQVFmTkVjTnVlcyUyQmRRVWgyUUxtUG1ZYmFOM05KQVJvTFkzcWgwM2hJWVJQSHFJTG8wanh0VmdXRWtXNFlBdjFpQm4ybk1tZ25OcHJ1SmlRcGhPWHBVWEUlMkZmNUJlOXFZb0lrY3BlQTlQYngwWDFpQyUyRiUyRkJtOVBBUiUyQnoyNTgyRkRiTjl4aXlIRmNOczViSktBUWxVUnNEa1FrWTg1QWxtMHhvZEM1NG5BZEhQc1pSVmolMkZuS2VhcEFXNEVQUk1vbDBJdHp5UlVVeVppQmQ4NFRDVTU3b0d3ekIlMkYzZ0Z4Y0xVTVp6NFpQWFZnaWJCb3VReUZmR2VTdEsxRjRtUENaU0xGV2NJQXhMJTJCdHljQjRaTkZhN0cxWGxYRjVENmY2R2hoUVdQU2NoTWd3N3ZLZWVWNHlJcmMlMkZaSkRiQUhhVkU3MVZXbyUyRjclMkZFZW52RHJkVE16TjJNYjR2bkpvdUxpRW95UzNHWjNJVVNkNU14bURBUmtoU3ZjN1NkVXdod2tHdENvRFpjT0tDVVJTMjBJVURSbXNRR1ZrY3NYSjdaMWtkN2Jta0klMkZjRnB1UWNyMnJ3bWJmWndndzhqTllqYW9HUTFqZmV6aEx4ekwxbG94NUpsVzNzU3ZKZGFVRWMxYThKd2x0RTU5ZFVhZUtLR1FWTnhva1dzYWxRcU5kamJSV3lGSGFXS29jRkh5SUVVVlA3UzRYMFhyUHMxejFVQmR5Nk5aV1VrYXIxclFkcThYJTJGZlZZYVZWeFhVb1BlZSUyRmtKN1RrZlJtUkFmenVmb3BPNGRNWFl3SjQwbFl0dDNsJTJCcDV5S3RSR1VSMjMxdW1weWhLTlVQJTJCRlkycGRtQVAzaU1LMGglMkJkJTJCY0hrN3FtZmZ4bVF2R3RyYWg0T2NXMElSQU1KUiUyRjclMkYxaW1hTUJyUlV6eDFOOU52ZmljckZzWnRpY1Z1MFloMzFFSFBQWFN0VlQlMkZEMlVlTjhwRnFxYVI1Y0x0ZmxXVFBXREJtRmpIbFJIVDVWQzFpZU15ZjlEb3RHZG4lMkZqTmJaVlBNYzlhTHJxRDI0elhkbSUyQm02NGNGelRPWTEzazhqUVZSQkZXNG1XYkVKcEdJaUV0Rk85RzVCdlVOWGslMkJSQVcwdG9oMFdyNUgyT2l5MzBLbDJ4bVZvNDhvZSUyQjlwNWslMkJnS2UlMkJvVUNxeiUyRmtwcnZtTFUzN3FkNlY4JTNEJTNDJTJGZGlhZ3JhbSUzRSUzQyUyRm14ZmlsZSUzRdVA5u8AACAASURBVHhe7Z1/qFXXlcdXaKcdje+1HS0GHBzxn8gUasdxMoIKMX9UCWXIRKoSdWY6hgn+qEGj6Q+NPk1sS7U6efM08Q+ZQkwmP1ACLYmmkARMoARrxz8GDISHCA6mfZbWtEo6LRm+O2/drrvePnuvc++5P96960KI95199tn7uz9n7XX2Xves26h7Ph91T1MmbUtu63TLO94AIcBHH33kTDUKxG23haHs+Hh2vAEOVKMI1Z/nQE3U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"}}},{"cell_type":"markdown","source":"## 1. Import  Liabraries  \n<a id = \"section_1\"></a>\n","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport cv2\nimport numpy as np\n# from google.colab.patches import cv2_imshow\nfrom tqdm import tqdm\nimport os","metadata":{"id":"edef2ecf-80bc-4cd9-b30a-6a3096960a90","execution":{"iopub.status.busy":"2021-11-10T09:39:20.660781Z","iopub.execute_input":"2021-11-10T09:39:20.661348Z","iopub.status.idle":"2021-11-10T09:39:24.821700Z","shell.execute_reply.started":"2021-11-10T09:39:20.661254Z","shell.execute_reply":"2021-11-10T09:39:24.820952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2. Unzip file  \n<a id = 'section_2'></a>","metadata":{}},{"cell_type":"code","source":"train_zip_path = r'/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip'\ntest_zip_path = r'/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip'\nbase_dir = '/kaggle/working/Data/'\nunzip_dir = '/kaggle/working/data/'","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:39:24.823153Z","iopub.execute_input":"2021-11-10T09:39:24.823375Z","iopub.status.idle":"2021-11-10T09:39:24.828373Z","shell.execute_reply.started":"2021-11-10T09:39:24.823342Z","shell.execute_reply":"2021-11-10T09:39:24.827648Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.exists(unzip_dir):\n    os.makedirs(unzip_dir)\n    print(f'Directory ceated at {unzip_dir}')\n    \nimport zipfile\nwith zipfile.ZipFile(train_zip_path) as f:\n    f.extractall(unzip_dir)\nf.close","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:39:24.829448Z","iopub.execute_input":"2021-11-10T09:39:24.830058Z","iopub.status.idle":"2021-11-10T09:39:38.490072Z","shell.execute_reply.started":"2021-11-10T09:39:24.830024Z","shell.execute_reply":"2021-11-10T09:39:38.489396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3. Load human readable Imagenet labels  \n<a id ='label'></a>","metadata":{}},{"cell_type":"markdown","source":"We will need labels of imagenet , So we will download text file of labels of imagenet.","metadata":{}},{"cell_type":"code","source":"\nlabels_path = tf.keras.utils.get_file(\n    'ImageNetLabels.txt',\n    'https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')\nlabels = np.array(open(labels_path).read().splitlines())","metadata":{"id":"c540c74c-552f-4f1b-a68f-07abeb31262c","execution":{"iopub.status.busy":"2021-11-10T09:39:38.491934Z","iopub.execute_input":"2021-11-10T09:39:38.492199Z","iopub.status.idle":"2021-11-10T09:39:40.104394Z","shell.execute_reply.started":"2021-11-10T09:39:38.492163Z","shell.execute_reply":"2021-11-10T09:39:40.103735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now, We know what kind of classes we trying to classify, for example in our case dog, Now, there are several types of dog in imagenet    \nlabels, So we will store in list so that we can use later in the prediction. (To verify predicted class as dog)  \n","metadata":{}},{"cell_type":"code","source":"dog_classes = []\nfor idx, i in enumerate(labels):\n    if 'dog' in i:\n        dog_classes.append(idx)\n        print(i)\ndog_classes.append(207) # After going though some classes i realized to add golden-retriver present at index 207 \ndog_classes.append(245)","metadata":{"id":"WhWj2PnQvjkN","execution":{"iopub.status.busy":"2021-11-10T09:39:40.105788Z","iopub.execute_input":"2021-11-10T09:39:40.106180Z","iopub.status.idle":"2021-11-10T09:39:40.118475Z","shell.execute_reply.started":"2021-11-10T09:39:40.106139Z","shell.execute_reply":"2021-11-10T09:39:40.116360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('/kaggle/working/data/train/')[1750]","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:39:40.119611Z","iopub.execute_input":"2021-11-10T09:39:40.119911Z","iopub.status.idle":"2021-11-10T09:39:40.149800Z","shell.execute_reply.started":"2021-11-10T09:39:40.119874Z","shell.execute_reply":"2021-11-10T09:39:40.148871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path =r'/kaggle/working/data/train/dog.11215.jpg'\nimg = cv2.imread(path)","metadata":{"id":"d8c19771-3ad0-4052-b9cc-8818b3b9dc14","execution":{"iopub.status.busy":"2021-11-10T09:39:40.151540Z","iopub.execute_input":"2021-11-10T09:39:40.151814Z","iopub.status.idle":"2021-11-10T09:39:40.239502Z","shell.execute_reply.started":"2021-11-10T09:39:40.151778Z","shell.execute_reply":"2021-11-10T09:39:40.238771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:39:40.241762Z","iopub.execute_input":"2021-11-10T09:39:40.242202Z","iopub.status.idle":"2021-11-10T09:39:40.617599Z","shell.execute_reply.started":"2021-11-10T09:39:40.242166Z","shell.execute_reply":"2021-11-10T09:39:40.616933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(img.shape) # In the openCv image is of shape (h, w)\norg = img.copy()","metadata":{"id":"0867cba1-2ba8-47fd-9850-a6c9c367008c","outputId":"056ccac1-c178-471b-8f08-ce9015ede777","execution":{"iopub.status.busy":"2021-11-10T09:39:40.618551Z","iopub.execute_input":"2021-11-10T09:39:40.618798Z","iopub.status.idle":"2021-11-10T09:39:40.624623Z","shell.execute_reply.started":"2021-11-10T09:39:40.618766Z","shell.execute_reply":"2021-11-10T09:39:40.623878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"window_size = [150,100] \nwindow_size","metadata":{"id":"81c641f8","outputId":"4f6da0a0-4850-41cb-eeaf-5e4659668344","execution":{"iopub.status.busy":"2021-11-10T09:43:18.763530Z","iopub.execute_input":"2021-11-10T09:43:18.763868Z","iopub.status.idle":"2021-11-10T09:43:18.774708Z","shell.execute_reply.started":"2021-11-10T09:43:18.763825Z","shell.execute_reply":"2021-11-10T09:43:18.772906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4. Pretrained Model  \n<a id ='model'></a>\n","metadata":{}},{"cell_type":"code","source":"model = tf.keras.applications.ResNet50()","metadata":{"id":"7dbde4aa-9276-466b-bd3a-c5da061c0e3b","execution":{"iopub.status.busy":"2021-11-10T09:43:19.641804Z","iopub.execute_input":"2021-11-10T09:43:19.642077Z","iopub.status.idle":"2021-11-10T09:43:20.974628Z","shell.execute_reply.started":"2021-11-10T09:43:19.642046Z","shell.execute_reply":"2021-11-10T09:43:20.973855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Code to detect the Object  \n<a id ='object'></a>","metadata":{}},{"cell_type":"code","source":"\nbounding_box = []  # We will store coordinate of bounding box (x1, y1, x2, y2)\ncropped_images = [] # We will store cropped images, So that we can predict the class of an image\n\nfor w in range(8): # I have choosen random value as 8, This means our window will increase 20% each time.\n    for y in tqdm(range(0, img.shape[0], 80)): # window will cover 80 pixel in the vertical direction \n        for inc in range(0, img.shape[1], 50): # window will cover 40 pixel in the horizontal direction\n\n            # This condition will prevent window to go outside of image\n            if inc +window_size[0]>img.shape[1] or y+window_size[1]>img.shape[0]:  \n                break\n            \n            # This commented line of code will draw sliding window\n#             img = cv2.rectangle(img, (inc, y), (inc + window_size[0], y+window_size[1]), (255,125,210), 2)\n            \n            # We will crop the image of size of sliding window, Make sure we specify dimention (y, x) in opencv slicing\n            crop_img = img[ y:y+window_size[1], inc:inc + window_size[0]]\n            \n            # Seperating B G R channel, as opencv read image as BGR, But to pass image to model we want RGB.\n            # So by doing this we will convert BGR to RGB\n            \n            # This is fficiant way to do slicing or you can use cv.split\n            b = crop_img[:,:,0]\n            g = crop_img[:,:,1]\n            r = crop_img[:,:,2]\n            merge = cv2.merge([r,g,b])\n\n            cropped_images.append(merge)\n            bounding_box.append([ inc,y, inc + window_size[0], y+window_size[1]])\n            \n            \n            ########################################################################################\n            ## This code below was to to predict cropped image one by one, and to show sliding window, \n            ## If uncomment and run it will give you, good visualization how sliding window is working \n            #########################################################################################\n            # n_img = tf.keras.applications.resnet50.preprocess_input(merge)\n            # prediction = model.predict(tf.expand_dims(tf.image.resize(n_img, (224, 224)), 0))\n            # label_no = np.argmax(prediction) \n\n            # if label_no == 6 and prediction[0][label_no] > 0.80:    # Set prob of class here\n            #     bounding_box.append([ inc,y, inc + window_size[0], y+window_size[1]])\n                \n            # lab = labels[label_no] + '  ' + str(prediction[0][label_no]) \n        \n            # cv2.putText(img, lab, (15,15),cv2.FONT_HERSHEY_COMPLEX,  0.7,\n            #        (0,0,0),2,4 )\n            # cv2.imshow(img)\n            # cv2.imshow( crop_img)\n            img = org.copy()\n            # if cv2.waitKey(1) & 0xFF == ord('q'):\n            #     break\n            ############################################################################################\n            \n    window_size = [int(1.2*i) for i in window_size]  # increasing y and x by 20% \n# cv2.waitKey(0)\n# cv2.destroyAllWindows()","metadata":{"id":"47f91cc3-b314-41c7-923a-33f98dbeb9a1","outputId":"546f6ab4-3d4e-4563-b687-dd635b34322c","execution":{"iopub.status.busy":"2021-11-10T09:43:20.976226Z","iopub.execute_input":"2021-11-10T09:43:20.976533Z","iopub.status.idle":"2021-11-10T09:43:21.036708Z","shell.execute_reply.started":"2021-11-10T09:43:20.976469Z","shell.execute_reply":"2021-11-10T09:43:21.035965Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We are using pretrained resnet 50, So this model requires 224,224 image. But our cropped images are different shapes.\nUsing tf.image.resize we will resize all images in an array.","metadata":{}},{"cell_type":"markdown","source":"## 5. Predict Cropped Images","metadata":{}},{"cell_type":"code","source":"def resize_image(x):\n    x = tf.convert_to_tensor(x)\n    return tf.image.resize(x, (224,224))\n\ndef convert_images(cropped_images):\n    return [resize_image(i) for i in cropped_images]\nli = convert_images(cropped_images)","metadata":{"id":"bUkglQyPu4xF","execution":{"iopub.status.busy":"2021-11-10T09:43:21.377450Z","iopub.execute_input":"2021-11-10T09:43:21.377949Z","iopub.status.idle":"2021-11-10T09:43:21.548081Z","shell.execute_reply.started":"2021-11-10T09:43:21.377915Z","shell.execute_reply":"2021-11-10T09:43:21.547371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Let's preprocess images using resnet50 preprocessing\nall_images_in_array = tf.keras.applications.resnet50.preprocess_input(tf.stack(li))","metadata":{"id":"KhQ2iK-ytAFD","execution":{"iopub.status.busy":"2021-11-10T09:43:21.881733Z","iopub.execute_input":"2021-11-10T09:43:21.881983Z","iopub.status.idle":"2021-11-10T09:43:21.888578Z","shell.execute_reply.started":"2021-11-10T09:43:21.881956Z","shell.execute_reply":"2021-11-10T09:43:21.887845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict_prob = model.predict(all_images_in_array) # Get probability distrubution of each images\nindex_of_required_box = []                        # We will store idex of image which belongs to dog class having probability >=85%\nfor idx, prob in enumerate(predict_prob):\n    id = np.argmax(prob)                     # Get index with highest probability\n    if id in dog_classes and prob[id]>0.60:  # Condition to check if probability >= 85%\n        index_of_required_box.append(idx)    # Storing indexes of images in list","metadata":{"id":"Yod-8u-DPrGh","execution":{"iopub.status.busy":"2021-11-10T09:43:22.482545Z","iopub.execute_input":"2021-11-10T09:43:22.484709Z","iopub.status.idle":"2021-11-10T09:43:24.114537Z","shell.execute_reply.started":"2021-11-10T09:43:22.484652Z","shell.execute_reply":"2021-11-10T09:43:24.113735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.argmax(predict_prob, axis = 1)","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:43:24.116013Z","iopub.execute_input":"2021-11-10T09:43:24.116575Z","iopub.status.idle":"2021-11-10T09:43:24.123803Z","shell.execute_reply.started":"2021-11-10T09:43:24.116532Z","shell.execute_reply":"2021-11-10T09:43:24.122990Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"index_of_required_box","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:43:25.763866Z","iopub.execute_input":"2021-11-10T09:43:25.764852Z","iopub.status.idle":"2021-11-10T09:43:25.770385Z","shell.execute_reply.started":"2021-11-10T09:43:25.764799Z","shell.execute_reply":"2021-11-10T09:43:25.769604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's visualize windows predicted by our model for dog","metadata":{}},{"cell_type":"code","source":"np.array(bounding_box)[[index_of_required_box]]","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:43:28.401844Z","iopub.execute_input":"2021-11-10T09:43:28.402389Z","iopub.status.idle":"2021-11-10T09:43:28.409366Z","shell.execute_reply.started":"2021-11-10T09:43:28.402351Z","shell.execute_reply":"2021-11-10T09:43:28.408537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_bnding_box = org.copy()\nfor i in np.array(bounding_box)[[index_of_required_box]]:\n    cv2.rectangle(all_bnding_box, (i[0],  i[1]), (i[2], i[3]), (255,125,210), 3)\n\nplt.imshow(all_bnding_box)","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:43:30.410406Z","iopub.execute_input":"2021-11-10T09:43:30.411067Z","iopub.status.idle":"2021-11-10T09:43:30.685163Z","shell.execute_reply.started":"2021-11-10T09:43:30.411032Z","shell.execute_reply":"2021-11-10T09:43:30.684372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"reference for [Non maximum seperation](https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/) function","metadata":{}},{"cell_type":"markdown","source":"## 6. NMS","metadata":{}},{"cell_type":"code","source":"def NMS(boxes, overlapThresh):\n    #return an empty list, if no boxes given\n    if len(boxes) == 0:\n        return []\n    x1 = boxes[:, 0]  # x coordinate of the top-left corner\n    y1 = boxes[:, 1]  # y coordinate of the top-left corner\n    x2 = boxes[:, 2]  # x coordinate of the bottom-right corner\n    y2 = boxes[:, 3]  # y coordinate of the bottom-right corner\n    # compute the area of the bounding boxes and sort the bounding\n    # boxes by the bottom-right y-coordinate of the bounding box\n    areas = (x2 - x1 + 1) * (y2 - y1 + 1) # We have a least a box of one pixel, therefore the +1\n    indices = np.arange(len(x1))\n    for i,box in enumerate(boxes):\n        temp_indices = indices[indices!=i]\n        xx1 = np.maximum(box[0], boxes[temp_indices,0])\n        yy1 = np.maximum(box[1], boxes[temp_indices,1])\n        xx2 = np.minimum(box[2], boxes[temp_indices,2])\n        yy2 = np.minimum(box[3], boxes[temp_indices,3])\n        w = np.maximum(0, xx2 - xx1 + 1)\n        h = np.maximum(0, yy2 - yy1 + 1)\n        # compute the ratio of overlap\n        overlap = (w * h) / areas[temp_indices]\n        if np.any(overlap) > overlapThresh:\n            indices = indices[indices != i]\n    return boxes[indices].astype(int)","metadata":{"id":"iT98WiEly1dj","execution":{"iopub.status.busy":"2021-11-10T09:43:39.962574Z","iopub.execute_input":"2021-11-10T09:43:39.963219Z","iopub.status.idle":"2021-11-10T09:43:39.971969Z","shell.execute_reply.started":"2021-11-10T09:43:39.963183Z","shell.execute_reply":"2021-11-10T09:43:39.971125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"NMS_box = NMS(np.array(bounding_box)[[index_of_required_box]], overlapThresh = 0.6)\nNMS_box = NMS_box.flatten()","metadata":{"execution":{"iopub.status.busy":"2021-11-10T09:44:21.732449Z","iopub.execute_input":"2021-11-10T09:44:21.733185Z","iopub.status.idle":"2021-11-10T09:44:21.738448Z","shell.execute_reply.started":"2021-11-10T09:44:21.733148Z","shell.execute_reply":"2021-11-10T09:44:21.737541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bnding_box_image = org.copy()\nfor i in bounding_box:\n    cv2.rectangle(bnding_box_image, (NMS_box[0],  NMS_box[1]), (NMS_box[2], NMS_box[3]), (255,125,210), 3)\n\nplt.imshow(bnding_box_image)","metadata":{"id":"0OJOSSHfuVdE","outputId":"ee466c18-71a2-4f8a-c475-805f51d6a608","execution":{"iopub.status.busy":"2021-11-10T09:44:21.833133Z","iopub.execute_input":"2021-11-10T09:44:21.833348Z","iopub.status.idle":"2021-11-10T09:44:22.102982Z","shell.execute_reply.started":"2021-11-10T09:44:21.833321Z","shell.execute_reply":"2021-11-10T09:44:22.102322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"I will be happy, If you let me know the improvenment and upvote if you like.","metadata":{}}]}