{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Object detection -- single rectangle", "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "code", "metadata": { "id": "ezA9vUJudpfE" }, "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib\n", "%matplotlib inline" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1PzP9-SOshOI", "outputId": "7097df8f-7ae3-4557-f0a1-f3e05ff3c09b" }, "source": [ "\n", "# Create images with random rectangles and bounding boxes. \n", "num_imgs = 50000\n", "\n", "img_size = 8\n", "min_object_size = 1\n", "max_object_size = 4\n", "num_objects = 1\n", "\n", "bboxes = np.zeros((num_imgs, num_objects, 4))\n", "imgs = np.zeros((num_imgs, img_size, img_size)) # set background to 0\n", "\n", "for i_img in range(num_imgs):\n", " for i_object in range(num_objects):\n", " w, h = np.random.randint(min_object_size, max_object_size, size=2)\n", " x = np.random.randint(0, img_size - w)\n", " y = np.random.randint(0, img_size - h)\n", " imgs[i_img, x:x+w, y:y+h] = 1. # set rectangle to 1\n", " bboxes[i_img, i_object] = [x, y, w, h]\n", " \n", "imgs.shape, bboxes.shape\n" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "((50000, 8, 8), (50000, 1, 4))" ] }, "metadata": { "tags": [] }, "execution_count": 2 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 269 }, "id": "Do5UwyuWsueY", "outputId": "cc92f215-ae55-441c-9a10-81c0bb45c863" }, "source": [ "i =5\n", "plt.imshow(imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", "for bbox in bboxes[i]:\n", " plt.gca().add_patch(matplotlib.patches.Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], ec='r', fc='none'))" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "HqiNhxOds-jT", "outputId": "51c22fd6-cac4-46bc-b23d-02ff056c9727" }, "source": [ "# Reshape and normalize the image data to mean 0 and std 1. \n", "X = (imgs.reshape(num_imgs, -1) - np.mean(imgs)) / np.std(imgs)\n", "X.shape, np.mean(X), np.std(X)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "((50000, 64), -3.5376146456655986e-17, 1.0)" ] }, "metadata": { "tags": [] }, "execution_count": 7 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "de2SRPKmtFo7", "outputId": "c985743b-b167-4c8e-af70-6d6e4bd400b7" }, "source": [ "# Normalize x, y, w, h by img_size, so that all values are between 0 and 1.\n", "# Important: Do not shift to negative values (e.g. by setting to mean 0), because the IOU calculation needs positive w and h.\n", "y = bboxes.reshape(num_imgs, -1) / img_size\n", "y.shape, np.mean(y), np.std(y)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "((50000, 4), 0.281348125, 0.17571291766396793)" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "code", "metadata": { "id": "6_QB3RnotFeM" }, "source": [ "# Split training and test.\n", "i = int(0.8 * num_imgs)\n", "train_X = X[:i]\n", "test_X = X[i:]\n", "train_y = y[:i]\n", "test_y = y[i:]\n", "test_imgs = imgs[i:]\n", "test_bboxes = bboxes[i:]" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "NWTMPDCrtcvx" }, "source": [ "from keras.models import Sequential\n", "from keras.layers import Dense, Activation, Dropout, Convolution2D, MaxPooling2D, Flatten\n", "from keras.optimizers import SGD\n", "filter_size = 3\n", "pool_size = 2\n", "\n", "\n", "model = Sequential([\n", " Dense(512, input_dim=X.shape[-1]),\n", " Activation('relu'),\n", " Dense(128, input_dim=X.shape[-1]),\n", " Activation('relu'),\n", " Dropout(0.2),\n", " Dense(y.shape[-1])\n", " ])\n", "\n", "model.compile('adadelta', 'mse')" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "D9amJw0RuMmT", "outputId": "71bfb868-7064-49bf-b088-6f45a9494c1c" }, "source": [ "model.fit(train_X, train_y, epochs=30, validation_data=(test_X, test_y), verbose=2)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/30\n", "1250/1250 - 2s - loss: 0.5446 - val_loss: 0.1817\n", "Epoch 2/30\n", "1250/1250 - 2s - loss: 0.2812 - val_loss: 0.0870\n", "Epoch 3/30\n", "1250/1250 - 2s - loss: 0.2028 - val_loss: 0.0664\n", "Epoch 4/30\n", "1250/1250 - 2s - loss: 0.1763 - val_loss: 0.0561\n", "Epoch 5/30\n", "1250/1250 - 2s - loss: 0.1573 - val_loss: 0.0480\n", "Epoch 6/30\n", "1250/1250 - 2s - loss: 0.1429 - val_loss: 0.0421\n", "Epoch 7/30\n", "1250/1250 - 2s - loss: 0.1316 - val_loss: 0.0375\n", "Epoch 8/30\n", "1250/1250 - 2s - loss: 0.1212 - val_loss: 0.0340\n", "Epoch 9/30\n", "1250/1250 - 2s - loss: 0.1119 - val_loss: 0.0313\n", "Epoch 10/30\n", "1250/1250 - 2s - loss: 0.1056 - val_loss: 0.0290\n", "Epoch 11/30\n", "1250/1250 - 2s - loss: 0.0988 - val_loss: 0.0272\n", "Epoch 12/30\n", "1250/1250 - 2s - loss: 0.0922 - val_loss: 0.0258\n", "Epoch 13/30\n", "1250/1250 - 2s - loss: 0.0870 - val_loss: 0.0246\n", "Epoch 14/30\n", "1250/1250 - 2s - loss: 0.0824 - val_loss: 0.0236\n", "Epoch 15/30\n", "1250/1250 - 2s - loss: 0.0772 - val_loss: 0.0230\n", "Epoch 16/30\n", "1250/1250 - 2s - loss: 0.0731 - val_loss: 0.0224\n", "Epoch 17/30\n", "1250/1250 - 2s - loss: 0.0692 - val_loss: 0.0219\n", "Epoch 18/30\n", "1250/1250 - 2s - loss: 0.0659 - val_loss: 0.0215\n", "Epoch 19/30\n", "1250/1250 - 2s - loss: 0.0629 - val_loss: 0.0212\n", "Epoch 20/30\n", "1250/1250 - 2s - loss: 0.0595 - val_loss: 0.0210\n", "Epoch 21/30\n", "1250/1250 - 2s - loss: 0.0569 - val_loss: 0.0207\n", "Epoch 22/30\n", "1250/1250 - 2s - loss: 0.0548 - val_loss: 0.0207\n", "Epoch 23/30\n", "1250/1250 - 2s - loss: 0.0526 - val_loss: 0.0206\n", "Epoch 24/30\n", "1250/1250 - 2s - loss: 0.0506 - val_loss: 0.0206\n", "Epoch 25/30\n", "1250/1250 - 2s - loss: 0.0485 - val_loss: 0.0206\n", "Epoch 26/30\n", "1250/1250 - 2s - loss: 0.0463 - val_loss: 0.0205\n", "Epoch 27/30\n", "1250/1250 - 2s - loss: 0.0450 - val_loss: 0.0206\n", "Epoch 28/30\n", "1250/1250 - 2s - loss: 0.0435 - val_loss: 0.0207\n", "Epoch 29/30\n", "1250/1250 - 2s - loss: 0.0422 - val_loss: 0.0206\n", "Epoch 30/30\n", "1250/1250 - 2s - loss: 0.0405 - val_loss: 0.0206\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "<tensorflow.python.keras.callbacks.History at 0x7f754803d290>" ] }, "metadata": { "tags": [] }, "execution_count": 45 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8FjV7Q1cudYm", "outputId": "0b0c1199-6bd6-41ca-b077-f4f2ee5968c8" }, "source": [ "# Predict bounding boxes on the test images.\n", "pred_y = model.predict(test_X)\n", "pred_bboxes = pred_y * img_size\n", "pred_bboxes = pred_bboxes.reshape(len(pred_bboxes), num_objects, -1)\n", "pred_bboxes.shape" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(10000, 1, 4)" ] }, "metadata": { "tags": [] }, "execution_count": 46 } ] }, { "cell_type": "code", "metadata": { "id": "fcZBH-9dunfd" }, "source": [ "def IOU(bbox1, bbox2):\n", " '''Calculate overlap between two bounding boxes [x, y, w, h] as the area of intersection over the area of unity'''\n", " x1, y1, w1, h1 = bbox1[0], bbox1[1], bbox1[2], bbox1[3]\n", " x2, y2, w2, h2 = bbox2[0], bbox2[1], bbox2[2], bbox2[3]\n", " w_I = min(x1 + w1, x2 + w2) - max(x1, x2)\n", " h_I = min(y1 + h1, y2 + h2) - max(y1, y2)\n", "\n", " if w_I <= 0 or h_I <= 0: # no overlap\n", " return 0.\n", " \n", " I = w_I * h_I\n", " U = w1 * h1 + w2 * h2 - I\n", " return(I / U)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 197 }, "id": "BErj61VFvjmB", "outputId": "74d5a763-cba7-4bfa-f14c-fc7573e825f8" }, "source": [ "plt.figure(figsize=(12, 3))\n", "for i_subplot in range(1, 5):\n", " plt.subplot(1, 4, i_subplot)\n", " i = np.random.randint(len(test_imgs))\n", " plt.imshow(test_imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", " for pred_bbox, exp_bbox in zip(pred_bboxes[i], test_bboxes[i]):\n", " plt.gca().add_patch(matplotlib.patches.Rectangle((pred_bbox[0], pred_bbox[1]), pred_bbox[2], pred_bbox[3], ec='r', fc='none'))\n", " plt.annotate('IOU: {:.2f}'.format(IOU(pred_bbox, exp_bbox)), (pred_bbox[0], pred_bbox[1]+pred_bbox[3]+0.2), color='r')" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "<Figure size 864x216 with 4 Axes>" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wJYdR-W6wI9A", "outputId": "3b29974b-bb85-4f0b-96a6-423d80bfe5c1" }, "source": [ "\n", "# Calculate the mean IOU (overlap) between the predicted and expected bounding boxes on the test dataset. \n", "summed_IOU = 0.\n", "for pred_bbox, test_bbox in zip(pred_bboxes.reshape(-1, 4), test_bboxes.reshape(-1, 4)):\n", " summed_IOU += IOU(pred_bbox, test_bbox)\n", "mean_IOU = summed_IOU / len(pred_bboxes)\n", "mean_IOU" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.07784513254188125" ] }, "metadata": { "tags": [] }, "execution_count": 48 } ] } ] }