{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Object detection -- multiple rectangles",
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "l6l-TaL_zyyw",
        "outputId": "7ba74569-07fd-481d-ca20-e297e15e3ad0"
      },
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib\n",
        "%matplotlib inline\n",
        "\n",
        "\n",
        "# Create images with random rectangles and bounding boxes. \n",
        "num_imgs = 50000\n",
        "\n",
        "img_size = 8\n",
        "min_rect_size = 1\n",
        "max_rect_size = 4\n",
        "num_objects = 2\n",
        "\n",
        "bboxes = np.zeros((num_imgs, num_objects, 4))\n",
        "imgs = np.zeros((num_imgs, img_size, img_size))\n",
        "\n",
        "for i_img in range(num_imgs):\n",
        "    for i_object in range(num_objects):\n",
        "        w, h = np.random.randint(min_rect_size, max_rect_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.\n",
        "        bboxes[i_img, i_object] = [x, y, w, h]\n",
        "        \n",
        "imgs.shape, bboxes.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "((50000, 8, 8), (50000, 2, 4))"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 1
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 269
        },
        "id": "mXjasFek0Iku",
        "outputId": "b0441da4-ccfb-44f4-9ee1-d79a6db885e4"
      },
      "source": [
        "import random\n",
        "i = random.randint(1,1000)\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": "DjqObPpH0XUC",
        "outputId": "5fa7060b-5e45-4791-b73c-dc8f780f68c2"
      },
      "source": [
        "# Reshape and normalize the 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)\n",
        "\n",
        "# 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, 8), 0.2814834375, 0.17521282872747532)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 12
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Cg_EeqI70Z3G"
      },
      "source": [
        "\n",
        "# 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": "ssH6yT240doT"
      },
      "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": {
        "id": "1donmxN00kUl"
      },
      "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",
        "\n",
        "    w_I = min(x1 + w1, x2 + w2) - max(x1, x2)\n",
        "    h_I = min(y1 + h1, y2 + h2) - max(y1, y2)\n",
        "    if w_I <= 0 or h_I <= 0:  # no overlap\n",
        "        return 0\n",
        "    I = w_I * h_I\n",
        "\n",
        "    U = w1 * h1 + w2 * h2 - I\n",
        "\n",
        "    return I / U\n",
        "\n",
        "def distance(bbox1, bbox2):\n",
        "    return np.sqrt(np.sum(np.square(bbox1[:2] - bbox2[:2])))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "iLJJn0bL0opL",
        "outputId": "626454ab-109e-4764-ac7a-e9cc6cd9d7da"
      },
      "source": [
        "num_epochs = 50\n",
        "flipped_train_y = np.array(train_y)\n",
        "flipped = np.zeros((len(flipped_train_y), num_epochs))\n",
        "ious_epoch = np.zeros((len(flipped_train_y), num_epochs))\n",
        "dists_epoch = np.zeros((len(flipped_train_y), num_epochs))\n",
        "mses_epoch = np.zeros((len(flipped_train_y), num_epochs))\n",
        "\n",
        "for epoch in range(num_epochs):\n",
        "    print('Epoch', epoch)\n",
        "    model.fit(train_X, flipped_train_y, epochs=1, validation_data=(test_X, test_y), verbose=2)\n",
        "    pred_y = model.predict(train_X)\n",
        "\n",
        "    for i, (pred_bboxes, exp_bboxes) in enumerate(zip(pred_y, flipped_train_y)):    \n",
        "        flipped_exp_bboxes = np.concatenate([exp_bboxes[4:], exp_bboxes[:4]])\n",
        "        mse = np.mean(np.square(pred_bboxes - exp_bboxes))\n",
        "        mse_flipped = np.mean(np.square(pred_bboxes - flipped_exp_bboxes))\n",
        "        iou = IOU(pred_bboxes[:4], exp_bboxes[:4]) + IOU(pred_bboxes[4:], exp_bboxes[4:])\n",
        "        iou_flipped = IOU(pred_bboxes[:4], flipped_exp_bboxes[:4]) + IOU(pred_bboxes[4:], flipped_exp_bboxes[4:])\n",
        "        \n",
        "        dist = distance(pred_bboxes[:4], exp_bboxes[:4]) + distance(pred_bboxes[4:], exp_bboxes[4:])\n",
        "        dist_flipped = distance(pred_bboxes[:4], flipped_exp_bboxes[:4]) + distance(pred_bboxes[4:], flipped_exp_bboxes[4:])\n",
        "\n",
        "        if mse_flipped < mse:  # you can also use iou or dist here\n",
        "            flipped_train_y[i] = flipped_exp_bboxes\n",
        "            flipped[i, epoch] = 1\n",
        "            mses_epoch[i, epoch] = mse_flipped / 2.\n",
        "            ious_epoch[i, epoch] = iou_flipped / 2.\n",
        "            dists_epoch[i, epoch] = dist_flipped / 2.\n",
        "        else:\n",
        "            mses_epoch[i, epoch] = mse / 2.\n",
        "            ious_epoch[i, epoch] = iou / 2.\n",
        "            dists_epoch[i, epoch] = dist / 2.\n",
        "\n",
        "    print('Flipped {} training samples ({} %)'.format(np.sum(flipped[:, epoch]), np.mean(flipped[:, epoch]) * 100.))\n",
        "    print('Mean IOU: {}'.format(np.mean(ious_epoch[:, epoch])))\n",
        "    print('Mean dist: {}'.format(np.mean(dists_epoch[:, epoch])))\n",
        "    print('Mean mse: {}'.format(np.mean(mses_epoch[:, epoch])))\n",
        "    print('\\n')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 0\n",
            "1250/1250 - 3s - loss: 0.1383 - val_loss: 0.0813\n",
            "Flipped 19891.0 training samples (49.7275 %)\n",
            "Mean IOU: 0.037232690657124395\n",
            "Mean dist: 0.35727365194077376\n",
            "Mean mse: 0.033198528514804856\n",
            "\n",
            "\n",
            "Epoch 1\n",
            "1250/1250 - 2s - loss: 0.0888 - val_loss: 0.0656\n",
            "Flipped 1721.0 training samples (4.3025 %)\n",
            "Mean IOU: 0.05318151422847442\n",
            "Mean dist: 0.3144863546827677\n",
            "Mean mse: 0.025979474518208867\n",
            "\n",
            "\n",
            "Epoch 2\n",
            "1250/1250 - 3s - loss: 0.0741 - val_loss: 0.0569\n",
            "Flipped 1114.0 training samples (2.785 %)\n",
            "Mean IOU: 0.06598561365328626\n",
            "Mean dist: 0.2901569431546851\n",
            "Mean mse: 0.022127709409292335\n",
            "\n",
            "\n",
            "Epoch 3\n",
            "1250/1250 - 2s - loss: 0.0649 - val_loss: 0.0512\n",
            "Flipped 948.0 training samples (2.37 %)\n",
            "Mean IOU: 0.07684254374744041\n",
            "Mean dist: 0.2736034593906058\n",
            "Mean mse: 0.019633069058081792\n",
            "\n",
            "\n",
            "Epoch 4\n",
            "1250/1250 - 2s - loss: 0.0579 - val_loss: 0.0470\n",
            "Flipped 905.0 training samples (2.2624999999999997 %)\n",
            "Mean IOU: 0.08640724107200685\n",
            "Mean dist: 0.2613253071013454\n",
            "Mean mse: 0.01786833271362056\n",
            "\n",
            "\n",
            "Epoch 5\n",
            "1250/1250 - 2s - loss: 0.0527 - val_loss: 0.0439\n",
            "Flipped 902.0 training samples (2.255 %)\n",
            "Mean IOU: 0.09415122599488478\n",
            "Mean dist: 0.25194095852176157\n",
            "Mean mse: 0.01655298475231711\n",
            "\n",
            "\n",
            "Epoch 6\n",
            "1250/1250 - 3s - loss: 0.0484 - val_loss: 0.0414\n",
            "Flipped 862.0 training samples (2.155 %)\n",
            "Mean IOU: 0.10142116262063688\n",
            "Mean dist: 0.2445910453691942\n",
            "Mean mse: 0.015528906734117075\n",
            "\n",
            "\n",
            "Epoch 7\n",
            "1250/1250 - 3s - loss: 0.0451 - val_loss: 0.0395\n",
            "Flipped 708.0 training samples (1.77 %)\n",
            "Mean IOU: 0.10756239828833132\n",
            "Mean dist: 0.23869207003038606\n",
            "Mean mse: 0.014717786949577637\n",
            "\n",
            "\n",
            "Epoch 8\n",
            "1250/1250 - 3s - loss: 0.0423 - val_loss: 0.0379\n",
            "Flipped 684.0 training samples (1.71 %)\n",
            "Mean IOU: 0.11269503097520481\n",
            "Mean dist: 0.23381905929811422\n",
            "Mean mse: 0.014059459684692141\n",
            "\n",
            "\n",
            "Epoch 9\n",
            "1250/1250 - 3s - loss: 0.0400 - val_loss: 0.0365\n",
            "Flipped 657.0 training samples (1.6424999999999998 %)\n",
            "Mean IOU: 0.11754654677130373\n",
            "Mean dist: 0.22965602688907125\n",
            "Mean mse: 0.013505636898159694\n",
            "\n",
            "\n",
            "Epoch 10\n",
            "1250/1250 - 3s - loss: 0.0382 - val_loss: 0.0353\n",
            "Flipped 619.0 training samples (1.5474999999999999 %)\n",
            "Mean IOU: 0.1219872760987479\n",
            "Mean dist: 0.22601357287748575\n",
            "Mean mse: 0.013026879527312556\n",
            "\n",
            "\n",
            "Epoch 11\n",
            "1250/1250 - 2s - loss: 0.0365 - val_loss: 0.0344\n",
            "Flipped 609.0 training samples (1.5225 %)\n",
            "Mean IOU: 0.1256473229702858\n",
            "Mean dist: 0.2229416991320054\n",
            "Mean mse: 0.01262558993937125\n",
            "\n",
            "\n",
            "Epoch 12\n",
            "1250/1250 - 2s - loss: 0.0352 - val_loss: 0.0335\n",
            "Flipped 519.0 training samples (1.2975 %)\n",
            "Mean IOU: 0.12965207870365922\n",
            "Mean dist: 0.22016640171222762\n",
            "Mean mse: 0.01226186523610329\n",
            "\n",
            "\n",
            "Epoch 13\n",
            "1250/1250 - 3s - loss: 0.0339 - val_loss: 0.0328\n",
            "Flipped 495.0 training samples (1.2375 %)\n",
            "Mean IOU: 0.13345745626533198\n",
            "Mean dist: 0.21770910598838264\n",
            "Mean mse: 0.011944320308333223\n",
            "\n",
            "\n",
            "Epoch 14\n",
            "1250/1250 - 2s - loss: 0.0329 - val_loss: 0.0322\n",
            "Flipped 481.0 training samples (1.2025 %)\n",
            "Mean IOU: 0.13652392449009745\n",
            "Mean dist: 0.21539978047413516\n",
            "Mean mse: 0.011665974222373175\n",
            "\n",
            "\n",
            "Epoch 15\n",
            "1250/1250 - 3s - loss: 0.0319 - val_loss: 0.0316\n",
            "Flipped 488.0 training samples (1.22 %)\n",
            "Mean IOU: 0.1393332919014705\n",
            "Mean dist: 0.21334436669366072\n",
            "Mean mse: 0.011418366132973578\n",
            "\n",
            "\n",
            "Epoch 16\n",
            "1250/1250 - 3s - loss: 0.0312 - val_loss: 0.0311\n",
            "Flipped 448.0 training samples (1.1199999999999999 %)\n",
            "Mean IOU: 0.14204056057933206\n",
            "Mean dist: 0.2114437389066506\n",
            "Mean mse: 0.011188648821134583\n",
            "\n",
            "\n",
            "Epoch 17\n",
            "1250/1250 - 3s - loss: 0.0303 - val_loss: 0.0307\n",
            "Flipped 418.0 training samples (1.045 %)\n",
            "Mean IOU: 0.14458371890941213\n",
            "Mean dist: 0.20967240988183916\n",
            "Mean mse: 0.010981257015141745\n",
            "\n",
            "\n",
            "Epoch 18\n",
            "1250/1250 - 2s - loss: 0.0296 - val_loss: 0.0303\n",
            "Flipped 319.0 training samples (0.7975 %)\n",
            "Mean IOU: 0.1468144933414354\n",
            "Mean dist: 0.2080494725385991\n",
            "Mean mse: 0.010792488328989958\n",
            "\n",
            "\n",
            "Epoch 19\n",
            "1250/1250 - 3s - loss: 0.0290 - val_loss: 0.0299\n",
            "Flipped 356.0 training samples (0.89 %)\n",
            "Mean IOU: 0.14995869851660198\n",
            "Mean dist: 0.2064036374854088\n",
            "Mean mse: 0.010608434098732234\n",
            "\n",
            "\n",
            "Epoch 20\n",
            "1250/1250 - 3s - loss: 0.0285 - val_loss: 0.0296\n",
            "Flipped 308.0 training samples (0.77 %)\n",
            "Mean IOU: 0.15203454068016112\n",
            "Mean dist: 0.20495681090139092\n",
            "Mean mse: 0.010447016123295134\n",
            "\n",
            "\n",
            "Epoch 21\n",
            "1250/1250 - 3s - loss: 0.0279 - val_loss: 0.0293\n",
            "Flipped 294.0 training samples (0.735 %)\n",
            "Mean IOU: 0.15428042323304164\n",
            "Mean dist: 0.20356949656557038\n",
            "Mean mse: 0.01029422922077815\n",
            "\n",
            "\n",
            "Epoch 22\n",
            "1250/1250 - 2s - loss: 0.0275 - val_loss: 0.0290\n",
            "Flipped 293.0 training samples (0.7325 %)\n",
            "Mean IOU: 0.15624734448707436\n",
            "Mean dist: 0.20225715700244062\n",
            "Mean mse: 0.010154689438867345\n",
            "\n",
            "\n",
            "Epoch 23\n",
            "1250/1250 - 3s - loss: 0.0270 - val_loss: 0.0287\n",
            "Flipped 316.0 training samples (0.79 %)\n",
            "Mean IOU: 0.15863816766232575\n",
            "Mean dist: 0.20092190840371113\n",
            "Mean mse: 0.01001509179614267\n",
            "\n",
            "\n",
            "Epoch 24\n",
            "1250/1250 - 3s - loss: 0.0267 - val_loss: 0.0285\n",
            "Flipped 317.0 training samples (0.7925 %)\n",
            "Mean IOU: 0.1603624874676951\n",
            "Mean dist: 0.19970516430091176\n",
            "Mean mse: 0.009889360513190452\n",
            "\n",
            "\n",
            "Epoch 25\n",
            "1250/1250 - 2s - loss: 0.0263 - val_loss: 0.0283\n",
            "Flipped 310.0 training samples (0.775 %)\n",
            "Mean IOU: 0.16236255552418544\n",
            "Mean dist: 0.1985246433317795\n",
            "Mean mse: 0.009768766455358692\n",
            "\n",
            "\n",
            "Epoch 26\n",
            "1250/1250 - 3s - loss: 0.0259 - val_loss: 0.0281\n",
            "Flipped 243.0 training samples (0.6074999999999999 %)\n",
            "Mean IOU: 0.1639310728770347\n",
            "Mean dist: 0.19749649045465012\n",
            "Mean mse: 0.009659793646618061\n",
            "\n",
            "\n",
            "Epoch 27\n",
            "1250/1250 - 3s - loss: 0.0256 - val_loss: 0.0279\n",
            "Flipped 224.0 training samples (0.5599999999999999 %)\n",
            "Mean IOU: 0.16592526733371524\n",
            "Mean dist: 0.19641030311005458\n",
            "Mean mse: 0.009547083750477282\n",
            "\n",
            "\n",
            "Epoch 28\n",
            "1250/1250 - 3s - loss: 0.0252 - val_loss: 0.0278\n",
            "Flipped 258.0 training samples (0.645 %)\n",
            "Mean IOU: 0.16776933185145626\n",
            "Mean dist: 0.19536236573254215\n",
            "Mean mse: 0.009444298010414938\n",
            "\n",
            "\n",
            "Epoch 29\n",
            "1250/1250 - 3s - loss: 0.0250 - val_loss: 0.0276\n",
            "Flipped 295.0 training samples (0.7374999999999999 %)\n",
            "Mean IOU: 0.1691739271044937\n",
            "Mean dist: 0.19428270249879284\n",
            "Mean mse: 0.009347408139333078\n",
            "\n",
            "\n",
            "Epoch 30\n",
            "1250/1250 - 2s - loss: 0.0246 - val_loss: 0.0275\n",
            "Flipped 191.0 training samples (0.4775 %)\n",
            "Mean IOU: 0.17066198583004422\n",
            "Mean dist: 0.19329219935458095\n",
            "Mean mse: 0.009254583448935863\n",
            "\n",
            "\n",
            "Epoch 31\n",
            "1250/1250 - 2s - loss: 0.0243 - val_loss: 0.0273\n",
            "Flipped 224.0 training samples (0.5599999999999999 %)\n",
            "Mean IOU: 0.17239853906267139\n",
            "Mean dist: 0.1923443650923715\n",
            "Mean mse: 0.009162586181179426\n",
            "\n",
            "\n",
            "Epoch 32\n",
            "1250/1250 - 2s - loss: 0.0240 - val_loss: 0.0272\n",
            "Flipped 217.0 training samples (0.5425 %)\n",
            "Mean IOU: 0.17365462918761174\n",
            "Mean dist: 0.19144313608610497\n",
            "Mean mse: 0.009082014350604177\n",
            "\n",
            "\n",
            "Epoch 33\n",
            "1250/1250 - 3s - loss: 0.0238 - val_loss: 0.0271\n",
            "Flipped 198.0 training samples (0.49500000000000005 %)\n",
            "Mean IOU: 0.1754342446492649\n",
            "Mean dist: 0.19051836798560184\n",
            "Mean mse: 0.008995486118540955\n",
            "\n",
            "\n",
            "Epoch 34\n",
            "1250/1250 - 2s - loss: 0.0235 - val_loss: 0.0270\n",
            "Flipped 170.0 training samples (0.42500000000000004 %)\n",
            "Mean IOU: 0.17713109104470814\n",
            "Mean dist: 0.1896244767835146\n",
            "Mean mse: 0.008915593126860844\n",
            "\n",
            "\n",
            "Epoch 35\n",
            "1250/1250 - 3s - loss: 0.0233 - val_loss: 0.0269\n",
            "Flipped 167.0 training samples (0.4175 %)\n",
            "Mean IOU: 0.1783873919924296\n",
            "Mean dist: 0.18881081434670838\n",
            "Mean mse: 0.00884079262867683\n",
            "\n",
            "\n",
            "Epoch 36\n",
            "1250/1250 - 3s - loss: 0.0231 - val_loss: 0.0268\n",
            "Flipped 138.0 training samples (0.345 %)\n",
            "Mean IOU: 0.1792274133004544\n",
            "Mean dist: 0.188094066597689\n",
            "Mean mse: 0.00877569088354422\n",
            "\n",
            "\n",
            "Epoch 37\n",
            "1250/1250 - 3s - loss: 0.0230 - val_loss: 0.0267\n",
            "Flipped 193.0 training samples (0.48250000000000004 %)\n",
            "Mean IOU: 0.18130463171101832\n",
            "Mean dist: 0.18726396432839515\n",
            "Mean mse: 0.00869565285947182\n",
            "\n",
            "\n",
            "Epoch 38\n",
            "1250/1250 - 3s - loss: 0.0227 - val_loss: 0.0266\n",
            "Flipped 204.0 training samples (0.51 %)\n",
            "Mean IOU: 0.18280200066359556\n",
            "Mean dist: 0.1864627286646748\n",
            "Mean mse: 0.008624417345906802\n",
            "\n",
            "\n",
            "Epoch 39\n",
            "1250/1250 - 3s - loss: 0.0225 - val_loss: 0.0266\n",
            "Flipped 190.0 training samples (0.475 %)\n",
            "Mean IOU: 0.1838462055031591\n",
            "Mean dist: 0.18572079626665308\n",
            "Mean mse: 0.008562547158313465\n",
            "\n",
            "\n",
            "Epoch 40\n",
            "1250/1250 - 3s - loss: 0.0223 - val_loss: 0.0265\n",
            "Flipped 159.0 training samples (0.3975 %)\n",
            "Mean IOU: 0.18475535696344542\n",
            "Mean dist: 0.1850447536846153\n",
            "Mean mse: 0.008503390265712587\n",
            "\n",
            "\n",
            "Epoch 41\n",
            "1250/1250 - 2s - loss: 0.0221 - val_loss: 0.0264\n",
            "Flipped 122.0 training samples (0.305 %)\n",
            "Mean IOU: 0.18586247268819275\n",
            "Mean dist: 0.184363489838462\n",
            "Mean mse: 0.008445507373116461\n",
            "\n",
            "\n",
            "Epoch 42\n",
            "1250/1250 - 2s - loss: 0.0219 - val_loss: 0.0263\n",
            "Flipped 166.0 training samples (0.415 %)\n",
            "Mean IOU: 0.18760472663447547\n",
            "Mean dist: 0.18365588710412672\n",
            "Mean mse: 0.008381407659689295\n",
            "\n",
            "\n",
            "Epoch 43\n",
            "1250/1250 - 2s - loss: 0.0218 - val_loss: 0.0263\n",
            "Flipped 173.0 training samples (0.4325 %)\n",
            "Mean IOU: 0.18870382838316913\n",
            "Mean dist: 0.18298375121132615\n",
            "Mean mse: 0.008326145256875323\n",
            "\n",
            "\n",
            "Epoch 44\n",
            "1250/1250 - 3s - loss: 0.0216 - val_loss: 0.0262\n",
            "Flipped 169.0 training samples (0.4225 %)\n",
            "Mean IOU: 0.18930894377383584\n",
            "Mean dist: 0.18237986450754146\n",
            "Mean mse: 0.008275573133820045\n",
            "\n",
            "\n",
            "Epoch 45\n",
            "1250/1250 - 3s - loss: 0.0214 - val_loss: 0.0262\n",
            "Flipped 155.0 training samples (0.3875 %)\n",
            "Mean IOU: 0.19045625291588011\n",
            "Mean dist: 0.1816923421883227\n",
            "Mean mse: 0.008221076761049982\n",
            "\n",
            "\n",
            "Epoch 46\n",
            "1250/1250 - 2s - loss: 0.0213 - val_loss: 0.0261\n",
            "Flipped 135.0 training samples (0.3375 %)\n",
            "Mean IOU: 0.19210190480679085\n",
            "Mean dist: 0.18100392317543298\n",
            "Mean mse: 0.008164115579863454\n",
            "\n",
            "\n",
            "Epoch 47\n",
            "1250/1250 - 2s - loss: 0.0212 - val_loss: 0.0261\n",
            "Flipped 139.0 training samples (0.3475 %)\n",
            "Mean IOU: 0.1929415455332721\n",
            "Mean dist: 0.18040060820084736\n",
            "Mean mse: 0.008116974390970401\n",
            "\n",
            "\n",
            "Epoch 48\n",
            "1250/1250 - 2s - loss: 0.0210 - val_loss: 0.0260\n",
            "Flipped 150.0 training samples (0.375 %)\n",
            "Mean IOU: 0.19437142804856034\n",
            "Mean dist: 0.17980052557386686\n",
            "Mean mse: 0.008063567421949221\n",
            "\n",
            "\n",
            "Epoch 49\n",
            "1250/1250 - 3s - loss: 0.0209 - val_loss: 0.0260\n",
            "Flipped 138.0 training samples (0.345 %)\n",
            "Mean IOU: 0.19525224187547882\n",
            "Mean dist: 0.17925508563562084\n",
            "Mean mse: 0.008018252786645448\n",
            "\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 300
        },
        "id": "-u4Hf3UQ3Tu1",
        "outputId": "897890e3-e513-45c2-d3cd-3d362f9629ed"
      },
      "source": [
        "plt.pcolor(flipped[:1000], cmap='Greys')\n",
        "plt.xlabel('Epoch')\n",
        "plt.ylabel('Training sample')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0, 0.5, 'Training sample')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 20
        },
        {
          "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/",
          "height": 286
        },
        "id": "1xaAqRb43d0i",
        "outputId": "45d43a42-3399-4c6e-f07c-2607435fcc34"
      },
      "source": [
        "plt.plot(np.mean(ious_epoch, axis=0), label='Mean IOU')  # between predicted and assigned true bboxes\n",
        "plt.plot(np.mean(dists_epoch, axis=0), label='Mean distance')  # relative to image size\n",
        "plt.legend()\n",
        "plt.ylim(0, 1)\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(0.0, 1.0)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 22
        },
        {
          "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": "B8bjd7ae3xve",
        "outputId": "50d91d06-4f6a-4da4-e255-3a0148cfd5ea"
      },
      "source": [
        "pred_y = model.predict(test_X)\n",
        "pred_y = pred_y.reshape(len(pred_y), num_objects, -1)\n",
        "pred_bboxes = pred_y[..., :4] * img_size\n",
        "pred_shapes = pred_y[..., 4:5]\n",
        "pred_bboxes.shape, pred_shapes.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "((10000, 2, 4), (10000, 2, 0))"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 23
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 385
        },
        "id": "tXOBbIIe31pY",
        "outputId": "16953945-6c48-4f09-ada0-995282a0764d"
      },
      "source": [
        "plt.figure(figsize=(16, 8))\n",
        "for i_subplot in range(1, 5):\n",
        "    plt.subplot(1, 4, i_subplot)\n",
        "    i = np.random.randint(len(test_X))\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, pred_shape in zip(pred_bboxes[i], test_bboxes[i], pred_shapes[i]):\n",
        "        print(pred_bbox)\n",
        "        plt.gca().add_patch(matplotlib.patches.Rectangle((pred_bbox[0], pred_bbox[1]), pred_bbox[2], pred_bbox[3],ec='r', fc='none'))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[3.0901163  0.08360825 2.8350563  1.9934778 ]\n",
            "[2.8934953  0.05177559 1.8182871  1.4411243 ]\n",
            "[1.1641378 3.105485  1.7916882 1.2118427]\n",
            "[1.9490995  4.0168724  0.78566885 0.8842524 ]\n",
            "[ 5.314244   -0.78453827  2.0568438   1.9726627 ]\n",
            "[2.9276226 3.003235  1.8148657 1.4338228]\n",
            "[1.2816632 3.6937425 2.8126748 1.6420349]\n",
            "[1.6368439 2.8688457 1.711059  2.524076 ]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1152x576 with 4 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    }
  ]
}