├── .gitignore ├── LICENSE ├── README.md ├── color-multiple-shapes.ipynb ├── multiple-rectangles-or-triangles.ipynb ├── multiple-rectangles.ipynb ├── plots ├── IOU.jpg ├── bw-multiple-rectangles-dist.png ├── bw-multiple-rectangles-iou.png ├── bw-multiple-rectangles-mse.png ├── bw-single-rectangle_no-prediction.png ├── bw-single-rectangle_prediction.png ├── bw-three-rectangles-100k-images.png ├── bw-three-rectangles-50k-images.png ├── bw-two-rectangles-or-triangles.png ├── bw-two-rectangles_flips.png ├── bw-two-rectangles_no-flipping.png ├── bw-two-rectangles_with-flipping.png ├── color-multiple-shapes_three-colors_bboxes.png ├── color-multiple-shapes_three-colors_classification.png ├── color-multiple-shapes_two-colors_bboxes.png └── color-multiple-shapes_two-colors_classification.png ├── single-rectangle.ipynb ├── two-rectangles-or-triangles.ipynb └── two-rectangles.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Johannes Rieke 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # shape-detection 2 | 3 | **Read my [Medium post](https://towardsdatascience.com/object-detection-with-neural-networks-a4e2c46b4491) on this project** 4 | 5 | *Note: Some people reached out and told me that they can't replicate some of the results in this repo. I couldn't find the reason, potentially one of the dependencies changed since I did this project a few years ago. Unfortunately I don't have any notes on which exact setup I used back then. If you find anything, please reach out to me :)* 6 | 7 | This is an example of object detection with neural networks (implemented with [keras](https://keras.io/)). The training images contain abstract geometric shapes and can be easily bootstraped. 8 | 9 | The code is split up into several Jupyter notebooks. They increase in complexity: 10 | 11 | * Detection of rectangles in numpy arrays: [single-rectangle](single-rectangle.ipynb), [two-rectangles](two-rectangles.ipynb), [multiple-rectangles](multiple-rectangles.ipynb) 12 | * Additional classification between rectangles and triangles: [two-rectangles-or-triangles](two-rectangles-or-triangles.ipynb), [multiple-rectangles-or-triangles](multiple-rectangles-or-triangles.ipynb) 13 | * Application to more complex images (using convnets): [color-multiple-shapes](color-multiple-shapes.ipynb) 14 | 15 | 16 | ![](plots/bw-single-rectangle_prediction.png) 17 | 18 | 19 | **Requirements**: Python 2.7, keras (v1.0.5), theano or tensorflow, numpy, matplotlib, jupyter, pycairo (only for color-multiple-shapes.ipynb) 20 | -------------------------------------------------------------------------------- /plots/IOU.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/IOU.jpg -------------------------------------------------------------------------------- /plots/bw-multiple-rectangles-dist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-multiple-rectangles-dist.png -------------------------------------------------------------------------------- /plots/bw-multiple-rectangles-iou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-multiple-rectangles-iou.png -------------------------------------------------------------------------------- /plots/bw-multiple-rectangles-mse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-multiple-rectangles-mse.png -------------------------------------------------------------------------------- /plots/bw-single-rectangle_no-prediction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-single-rectangle_no-prediction.png -------------------------------------------------------------------------------- /plots/bw-single-rectangle_prediction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-single-rectangle_prediction.png -------------------------------------------------------------------------------- /plots/bw-three-rectangles-100k-images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-three-rectangles-100k-images.png -------------------------------------------------------------------------------- /plots/bw-three-rectangles-50k-images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-three-rectangles-50k-images.png -------------------------------------------------------------------------------- /plots/bw-two-rectangles-or-triangles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-two-rectangles-or-triangles.png -------------------------------------------------------------------------------- /plots/bw-two-rectangles_flips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-two-rectangles_flips.png -------------------------------------------------------------------------------- /plots/bw-two-rectangles_no-flipping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-two-rectangles_no-flipping.png -------------------------------------------------------------------------------- /plots/bw-two-rectangles_with-flipping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/bw-two-rectangles_with-flipping.png -------------------------------------------------------------------------------- /plots/color-multiple-shapes_three-colors_bboxes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/color-multiple-shapes_three-colors_bboxes.png -------------------------------------------------------------------------------- /plots/color-multiple-shapes_three-colors_classification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/color-multiple-shapes_three-colors_classification.png -------------------------------------------------------------------------------- /plots/color-multiple-shapes_two-colors_bboxes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/color-multiple-shapes_two-colors_bboxes.png -------------------------------------------------------------------------------- /plots/color-multiple-shapes_two-colors_classification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jrieke/shape-detection/9a20e93f8c0e554147c0850762ac50cf8e1ff3e1/plots/color-multiple-shapes_two-colors_classification.png -------------------------------------------------------------------------------- /single-rectangle.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2016-07-08T01:56:12.535000", 9 | "start_time": "2016-07-08T01:56:12.147000" 10 | }, 11 | "collapsed": true 12 | }, 13 | "outputs": [], 14 | "source": [ 15 | "import numpy as np\n", 16 | "import matplotlib.pyplot as plt\n", 17 | "import matplotlib\n", 18 | "%matplotlib inline" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 2, 24 | "metadata": { 25 | "ExecuteTime": { 26 | "end_time": "2016-07-08T01:56:14.210000", 27 | "start_time": "2016-07-08T01:56:13.200000" 28 | }, 29 | "collapsed": false 30 | }, 31 | "outputs": [ 32 | { 33 | "data": { 34 | "text/plain": [ 35 | "((50000L, 8L, 8L), (50000L, 1L, 4L))" 36 | ] 37 | }, 38 | "execution_count": 2, 39 | "metadata": {}, 40 | "output_type": "execute_result" 41 | } 42 | ], 43 | "source": [ 44 | "# Create images with random rectangles and bounding boxes. \n", 45 | "num_imgs = 50000\n", 46 | "\n", 47 | "img_size = 8\n", 48 | "min_object_size = 1\n", 49 | "max_object_size = 4\n", 50 | "num_objects = 1\n", 51 | "\n", 52 | "bboxes = np.zeros((num_imgs, num_objects, 4))\n", 53 | "imgs = np.zeros((num_imgs, img_size, img_size)) # set background to 0\n", 54 | "\n", 55 | "for i_img in range(num_imgs):\n", 56 | " for i_object in range(num_objects):\n", 57 | " w, h = np.random.randint(min_object_size, max_object_size, size=2)\n", 58 | " x = np.random.randint(0, img_size - w)\n", 59 | " y = np.random.randint(0, img_size - h)\n", 60 | " imgs[i_img, x:x+w, y:y+h] = 1. # set rectangle to 1\n", 61 | " bboxes[i_img, i_object] = [x, y, w, h]\n", 62 | " \n", 63 | "imgs.shape, bboxes.shape" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": { 70 | "ExecuteTime": { 71 | "end_time": "2016-07-08T01:56:15.125000", 72 | "start_time": "2016-07-08T01:56:14.870000" 73 | }, 74 | "collapsed": false 75 | }, 76 | "outputs": [ 77 | { 78 | "data": { 79 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAEACAYAAAB1UADIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADCVJREFUeJzt3V2MXdV5xvH/MzYQjAupmghC3NghFYqo2hIuAAWquoKk\nJFHhqkpIKyQu0pu0RrSKgpAqw02lXiQpUnuDoJS0QBEWtLQiCCJqRTQtJmDHfJh+xAKbLysohCbl\nhsRvL84mwoM9sydz1hnPrP9PGs05Z9aZd52Zec5ee3t7v6kqJK19cys9AUmzYdilThh2qROGXeqE\nYZc6YdilTowKe5JrkzydZG+SO5Kc2HpikqZr0bAnORP4Y+C8qvp1YD3wudYTkzRd60eOWweckuQw\nsAF4ud2UJLWw6Ja9ql4GvgIcAF4CflhV32w9MUnTNWYZ/17gCmAzcCawMcnnW09M0nSNWcZfCuyv\nqh8AJLkX+Dhw5zsHJfEke2mFVFUWGzPmaPwB4MIk70kS4BJg3zEKzuRj+/btM6tlPesd7/XGGrPP\nvgvYAewGvgsEuHl0BUnHhVFH46vqRuDGxnOR1NCqPINu69at1rOe9ZYoS1nzL/iNkprW95I0XhJq\nSgfoJK0Bhl3qhGGXOmHYpU4YdqkThl3qhGGXOmHYpU4YdqkThl3qhGGXOmHYpU4YdqkThl3qhGGX\nOmHYpU4YdqkTY64bf3aS3UmeHD6/kWTbLCYnaXqWdFmqJHPAi8AFVXVw3te8LJW0AlpdlupS4Hvz\ngy7p+LfUsH8WuKvFRCS1NXoZn+QEJt1bz6mq7x/l6y7jp2TWP8d169bNtN7hw4dnWm+tG7uMH9uy\nGeBTwBNHC/rbbrjhhp/d3rp163F7/WwdaX8VW2ZZcMsWeP75WVZcU3bu3MnOnTuX/LylbNnvAh6s\nqtuP8XW37FMy659j5uaYy6Ibhqk5XAX+rUzN2C37qLAn2QC8AJxVVT86xhjDPiWGXUsx1WV8Vb0J\nvH/Zs5K0YjyDTuqEYZc6YdilThh2qROGXeqEYZc6YdilThh2qROGXeqEYZc6YdilThh2qROGXeqE\nYZc6YdilThh2qROGXeqEYZc6YdilTowKe5LTktyTZF+SZ5Jc0HpikqZr7HXjbwIeqKrfS7Ie2NBw\nTpIaWPRS0klOBXZX1UcWGeelpKfES0lrKabZ2PHDwGtJbhvaNt+c5OTlT1HSLI1Zxq8HzgO+WFXf\nSfKXwHXA9vkDbf80HZnhVhagNm/m8AsvzK7g5s2zq7UGNWv/lOR04N+r6qzh/sXAl6vqd+eNcxm/\nSs18t2HGb2Zr3dSW8VV1CDiY5OzhoUuAZ5c5P0kzNrbX228AtwAnAPuBq6vqjXlj3LKvUm7ZV7ep\nNnYcWdCwr1KGfXWb5tF4SWuAYZc6YdilThh2qROGXeqEYZc6YdilThh2qROGXeqEYZc6YdilThh2\nqROGXeqEYZc6YdilThh2qROGXeqEYZc6YdilToxq/5TkeeAN4DDwVlWd33JSkqZvbK+3w8DWqnq9\n5WQktTN2GZ8ljJV0HBob4AIeTvJ4ki+0nJCkNsYu4y+qqleSvJ9J6PdV1aPzB9nrbXXyOu6rS7Ne\nb+96QrId+FFVfXXe4zaJkFbA1JpEJNmQZONw+xTgk8DTy5+ipFkas4w/HbgvSQ3j76iqh9pOS9K0\n2etNWuXs9SbpCIZd6oRhlzph2KVOGHapE4Zd6oRhlzph2KVOGHapE4Zd6oRhlzph2KVOGHapE4Zd\n6oRhlzph2KVOGHapE4Zd6oRhlzoxOuxJ5pI8meT+lhOS1MZStuzXAM+2moiktkaFPckm4NPALW2n\nI6mVsVv2rwFfYtLzTdIqtGiTiCSfAQ5V1Z4kW5l0dD0qe71J7TXr9Zbkz4E/AH4CnAz8AnBvVV01\nb5xNIqQVMLZJxJI6wiT5LeBPq+ryo3zNsEsrwI4wko5grzdplXPLLukIhl3qhGGXOmHYpU4YdqkT\nhl3qhGGXOmHYpU4YdqkThl3qhGGXOmHYpU4YdqkThl3qhGGXOmHYpU4YdqkThl3qhGGXOjHmuvEn\nAd8CThzG76iqG1tPTNJ0jbrgZJINVfVmknXAvwHbqmrXvDFecFJaAVO94GRVvTncPInJ1t1US6vM\n2MaOc0l2A68CD1fV422nJWnaFt1nB6iqw8DHkpwK/GOSc6rqXe2b7fUmtdes19u7npD8GfB/VfXV\neY+7zy6tgKntsyd5X5LThtsnA58Anlv+FCXN0phl/AeA25PMMXlzuLuqHmg7LUnTZq83aZWz15uk\nIxh2qROGXeqEYZc6YdilThh2qROGXeqEYZc6YdilThh2qROGXeqEYZc6YdilThh2qROGXeqEYZc6\nYdilThh2qROGXerEmKvLbkrySJJnkjyVZNssJiZpuha94GSSM4AzqmpPko3AE8AVVfXcvHFecFJa\nAVO74GRVvVpVe4bbPwb2AR9c/hQlzdKS9tmTbAHOBR5rMRlJ7Yzq9QYwLOF3ANcMW/h3sdeb1F7T\nXm9J1gP/Anyjqm46xhj32aUVMHaffWzYvw68VlV/ssAYwy6tgKmFPclFwLeAp4AaPq6vqgfnjTPs\n0gqY6pZ9ZEHDLq0Ae71JOoJhlzph2KVOGHapE4Zd6oRhlzph2KVOGHapE4Zd6oRhlzph2KVOGHap\nE4Zd6oRhlzph2KVOGHapE4Zd6oRhlzoxpv3TrUkOJdk7iwlJamPMlv024HdaT0RSW2PaPz0KvD6D\nuUhqyH12qROGXerE6F5vY9jrTWqvda+3LcA/V9WvLTDGJhHSCphak4gkdwLfBs5OciDJ1dOYoKTZ\nsv2TtMrZ/knSEQy71AnDLnXCsEudMOxSJwy71AnDLnXCsEudMOxSJwy71AnDLnXCsEudMOxSJwy7\n1AnDLnXCsEudMOxSJwy71AnDLnViVNiTXJbkuST/leTLrSclafrGXF12DvgrJv3efhW4MslHW09s\nIT/PNbOtZ721Wm+sMVv284H/rqoXquot4B+AK9pOa2Fr/ZdnPeu1MCbsHwQOvuP+i8NjklYRD9BJ\nnVi0SUSSC4Ebquqy4f51QFXVX8wbZ4cIaYWMaRIxJuzrgP8ELgFeAXYBV1bVvmlMUtJsLNrFtap+\nmuSPgIeYLPtvNejS6jO1Xm+Sjm/LPkA3yxNuktya5FCSvS3rvKPepiSPJHkmyVNJtjWud1KSx5Ls\nHuptb1lvqDmX5Mkk97euNdR7Psl3h9e4awb1TktyT5J9w+/xgkZ1zh5e05PD5zdm8PdybZKnk+xN\nckeSExd8QlX93B9M3iz+B9gMnADsAT66nO+5SL2LgXOBva1qzKt3BnDucHsjk2MXzV7fUGfD8Hkd\n8B/A+Y3rXQv8PXD/jH6m+4FfnEWtod7fAlcPt9cDp86g5hzwMvDLDWucOfwsTxzu3w1ctdBzlrtl\nn+kJN1X1KPB6q+9/lHqvVtWe4faPgX00Psegqt4cbp7E5I+z2X5Wkk3Ap4FbWtU4Wllm9E++SU4F\nfrOqbgOoqp9U1f/OoPSlwPeq6uCiI5dnHXBKkvXABiZvMMe03B96NyfcJNnCZFXxWOM6c0l2A68C\nD1fV4w3LfQ34Eg3fUI6igIeTPJ7kC41rfRh4Lcltw/L65iQnN64J8FngrpYFqupl4CvAAeAl4IdV\n9c2FnuNJNSMk2QjsAK4ZtvDNVNXhqvoYsAm4IMk5Leok+QxwaFi5ZPiYhYuq6jwmK4ovJrm4Ya31\nwHnAXw813wSua1iPJCcAlwP3NK7zXiar6M1MlvQbk3x+oecsN+wvAR96x/1Nw2NrxrBE2gH8XVX9\n06zqDsvNfwUua1TiIuDyJPuZbIV+O8nXG9X6map6Zfj8feA+JruCrbwIHKyq7wz3dzAJf0ufAp4Y\nXl9LlwL7q+oHVfVT4F7g4ws9Yblhfxz4lSSbhyOBnwNaH9Wd5VYI4G+AZ6vqptaFkrwvyWnD7ZOB\nTwDPtahVVddX1Yeq6iwmv7dHquqqFrXelmTDsEoiySnAJ4GnW9WrqkPAwSRnDw9dAjzbqt7gShov\n4QcHgAuTvCdJmLy2Bc9/WfSkmoXUjE+4SXInsBX4pSQHgO1vH3xpVO8i4PeBp4b96AKur6oHG5X8\nAHD78N+K54C7q+qBRrVWwunAfcOp1euBO6rqocY1twF3DMvr/cDVrQol2cBki/uHrWq8rap2JdkB\n7AbeGj7fvOD8hsP2ktY4D9BJnTDsUicMu9QJwy51wrBLnTDsUicMu9QJwy514v8Bpkn8vLgjHHoA\nAAAASUVORK5CYII=\n", 80 | "text/plain": [ 81 | "" 82 | ] 83 | }, 84 | "metadata": {}, 85 | "output_type": "display_data" 86 | } 87 | ], 88 | "source": [ 89 | "i = 0\n", 90 | "plt.imshow(imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", 91 | "for bbox in bboxes[i]:\n", 92 | " plt.gca().add_patch(matplotlib.patches.Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], ec='r', fc='none'))" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 4, 98 | "metadata": { 99 | "ExecuteTime": { 100 | "end_time": "2016-07-08T01:56:15.930000", 101 | "start_time": "2016-07-08T01:56:15.803000" 102 | }, 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "data": { 108 | "text/plain": [ 109 | "((50000L, 64L), -6.8856031987252206e-17, 1.0000000000000009)" 110 | ] 111 | }, 112 | "execution_count": 4, 113 | "metadata": {}, 114 | "output_type": "execute_result" 115 | } 116 | ], 117 | "source": [ 118 | "# Reshape and normalize the image data to mean 0 and std 1. \n", 119 | "X = (imgs.reshape(num_imgs, -1) - np.mean(imgs)) / np.std(imgs)\n", 120 | "X.shape, np.mean(X), np.std(X)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 5, 126 | "metadata": { 127 | "ExecuteTime": { 128 | "end_time": "2016-07-08T01:56:16.558000", 129 | "start_time": "2016-07-08T01:56:16.548000" 130 | }, 131 | "collapsed": false 132 | }, 133 | "outputs": [ 134 | { 135 | "data": { 136 | "text/plain": [ 137 | "((50000L, 4L), 0.28105437500000002, 0.17477239890314314)" 138 | ] 139 | }, 140 | "execution_count": 5, 141 | "metadata": {}, 142 | "output_type": "execute_result" 143 | } 144 | ], 145 | "source": [ 146 | "# Normalize x, y, w, h by img_size, so that all values are between 0 and 1.\n", 147 | "# Important: Do not shift to negative values (e.g. by setting to mean 0), because the IOU calculation needs positive w and h.\n", 148 | "y = bboxes.reshape(num_imgs, -1) / img_size\n", 149 | "y.shape, np.mean(y), np.std(y)" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 6, 155 | "metadata": { 156 | "ExecuteTime": { 157 | "end_time": "2016-07-08T01:56:17.198000", 158 | "start_time": "2016-07-08T01:56:17.192000" 159 | }, 160 | "collapsed": true 161 | }, 162 | "outputs": [], 163 | "source": [ 164 | "# Split training and test.\n", 165 | "i = int(0.8 * num_imgs)\n", 166 | "train_X = X[:i]\n", 167 | "test_X = X[i:]\n", 168 | "train_y = y[:i]\n", 169 | "test_y = y[i:]\n", 170 | "test_imgs = imgs[i:]\n", 171 | "test_bboxes = bboxes[i:]" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 7, 177 | "metadata": { 178 | "ExecuteTime": { 179 | "end_time": "2016-07-08T01:56:21.616000", 180 | "start_time": "2016-07-08T01:56:17.964000" 181 | }, 182 | "collapsed": false 183 | }, 184 | "outputs": [ 185 | { 186 | "name": "stderr", 187 | "output_type": "stream", 188 | "text": [ 189 | "Using Theano backend.\n" 190 | ] 191 | } 192 | ], 193 | "source": [ 194 | "# Build the model.\n", 195 | "from keras.models import Sequential\n", 196 | "from keras.layers import Dense, Activation, Dropout\n", 197 | "from keras.optimizers import SGD\n", 198 | "model = Sequential([\n", 199 | " Dense(200, input_dim=X.shape[-1]), \n", 200 | " Activation('relu'), \n", 201 | " Dropout(0.2), \n", 202 | " Dense(y.shape[-1])\n", 203 | " ])\n", 204 | "model.compile('adadelta', 'mse')" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 8, 210 | "metadata": { 211 | "ExecuteTime": { 212 | "end_time": "2016-07-08T01:57:19.973000", 213 | "start_time": "2016-07-08T01:56:21.618000" 214 | }, 215 | "collapsed": false, 216 | "scrolled": true 217 | }, 218 | "outputs": [ 219 | { 220 | "name": "stdout", 221 | "output_type": "stream", 222 | "text": [ 223 | "Train on 40000 samples, validate on 10000 samples\n", 224 | "Epoch 1/30\n", 225 | "1s - loss: 0.0666 - val_loss: 0.0022\n", 226 | "Epoch 2/30\n", 227 | "1s - loss: 0.0047 - val_loss: 5.8258e-04\n", 228 | "Epoch 3/30\n", 229 | "1s - loss: 0.0019 - val_loss: 3.0037e-04\n", 230 | "Epoch 4/30\n", 231 | "1s - loss: 0.0014 - val_loss: 2.2738e-04\n", 232 | "Epoch 5/30\n", 233 | "1s - loss: 0.0012 - val_loss: 1.4762e-04\n", 234 | "Epoch 6/30\n", 235 | "2s - loss: 0.0011 - val_loss: 1.3302e-04\n", 236 | "Epoch 7/30\n", 237 | "2s - loss: 9.9042e-04 - val_loss: 1.1030e-04\n", 238 | "Epoch 8/30\n", 239 | "1s - loss: 9.1788e-04 - val_loss: 9.8579e-05\n", 240 | "Epoch 9/30\n", 241 | "1s - loss: 8.8779e-04 - val_loss: 8.4835e-05\n", 242 | "Epoch 10/30\n", 243 | "1s - loss: 8.5834e-04 - val_loss: 7.8099e-05\n", 244 | "Epoch 11/30\n", 245 | "1s - loss: 8.3532e-04 - val_loss: 7.2461e-05\n", 246 | "Epoch 12/30\n", 247 | "1s - loss: 8.0197e-04 - val_loss: 7.8811e-05\n", 248 | "Epoch 13/30\n", 249 | "2s - loss: 7.8899e-04 - val_loss: 7.1290e-05\n", 250 | "Epoch 14/30\n", 251 | "2s - loss: 7.6972e-04 - val_loss: 7.0324e-05\n", 252 | "Epoch 15/30\n", 253 | "1s - loss: 7.5325e-04 - val_loss: 5.9552e-05\n", 254 | "Epoch 16/30\n", 255 | "1s - loss: 7.4060e-04 - val_loss: 5.8210e-05\n", 256 | "Epoch 17/30\n", 257 | "1s - loss: 7.2943e-04 - val_loss: 6.9643e-05\n", 258 | "Epoch 18/30\n", 259 | "1s - loss: 7.1842e-04 - val_loss: 5.8081e-05\n", 260 | "Epoch 19/30\n", 261 | "1s - loss: 7.1059e-04 - val_loss: 5.3423e-05\n", 262 | "Epoch 20/30\n", 263 | "1s - loss: 6.9717e-04 - val_loss: 4.7243e-05\n", 264 | "Epoch 21/30\n", 265 | "2s - loss: 6.9394e-04 - val_loss: 6.2623e-05\n", 266 | "Epoch 22/30\n", 267 | "2s - loss: 6.8506e-04 - val_loss: 5.4235e-05\n", 268 | "Epoch 23/30\n", 269 | "2s - loss: 6.8581e-04 - val_loss: 4.9188e-05\n", 270 | "Epoch 24/30\n", 271 | "1s - loss: 6.7876e-04 - val_loss: 4.8977e-05\n", 272 | "Epoch 25/30\n", 273 | "1s - loss: 6.6712e-04 - val_loss: 4.3991e-05\n", 274 | "Epoch 26/30\n", 275 | "1s - loss: 6.6541e-04 - val_loss: 3.9585e-05\n", 276 | "Epoch 27/30\n", 277 | "1s - loss: 6.6264e-04 - val_loss: 4.2685e-05\n", 278 | "Epoch 28/30\n", 279 | "1s - loss: 6.4944e-04 - val_loss: 4.8632e-05\n", 280 | "Epoch 29/30\n", 281 | "1s - loss: 6.4864e-04 - val_loss: 5.2251e-05\n", 282 | "Epoch 30/30\n", 283 | "1s - loss: 6.4314e-04 - val_loss: 5.0742e-05\n" 284 | ] 285 | }, 286 | { 287 | "data": { 288 | "text/plain": [ 289 | "" 290 | ] 291 | }, 292 | "execution_count": 8, 293 | "metadata": {}, 294 | "output_type": "execute_result" 295 | } 296 | ], 297 | "source": [ 298 | "# Train.\n", 299 | "model.fit(train_X, train_y, nb_epoch=30, validation_data=(test_X, test_y), verbose=2)" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": 9, 305 | "metadata": { 306 | "ExecuteTime": { 307 | "end_time": "2016-07-08T01:57:20.286000", 308 | "start_time": "2016-07-08T01:57:19.975000" 309 | }, 310 | "collapsed": false 311 | }, 312 | "outputs": [ 313 | { 314 | "data": { 315 | "text/plain": [ 316 | "(10000L, 1L, 4L)" 317 | ] 318 | }, 319 | "execution_count": 9, 320 | "metadata": {}, 321 | "output_type": "execute_result" 322 | } 323 | ], 324 | "source": [ 325 | "# Predict bounding boxes on the test images.\n", 326 | "pred_y = model.predict(test_X)\n", 327 | "pred_bboxes = pred_y * img_size\n", 328 | "pred_bboxes = pred_bboxes.reshape(len(pred_bboxes), num_objects, -1)\n", 329 | "pred_bboxes.shape" 330 | ] 331 | }, 332 | { 333 | "cell_type": "code", 334 | "execution_count": 10, 335 | "metadata": { 336 | "ExecuteTime": { 337 | "end_time": "2016-07-08T01:57:20.311000", 338 | "start_time": "2016-07-08T01:57:20.289000" 339 | }, 340 | "collapsed": true 341 | }, 342 | "outputs": [], 343 | "source": [ 344 | "def IOU(bbox1, bbox2):\n", 345 | " '''Calculate overlap between two bounding boxes [x, y, w, h] as the area of intersection over the area of unity'''\n", 346 | " x1, y1, w1, h1 = bbox1[0], bbox1[1], bbox1[2], bbox1[3]\n", 347 | " x2, y2, w2, h2 = bbox2[0], bbox2[1], bbox2[2], bbox2[3]\n", 348 | "\n", 349 | " w_I = min(x1 + w1, x2 + w2) - max(x1, x2)\n", 350 | " h_I = min(y1 + h1, y2 + h2) - max(y1, y2)\n", 351 | " if w_I <= 0 or h_I <= 0: # no overlap\n", 352 | " return 0.\n", 353 | " I = w_I * h_I\n", 354 | "\n", 355 | " U = w1 * h1 + w2 * h2 - I\n", 356 | "\n", 357 | " return I / U" 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "execution_count": 22, 363 | "metadata": { 364 | "ExecuteTime": { 365 | "end_time": "2016-07-08T02:01:30.216000", 366 | "start_time": "2016-07-08T02:01:29.481000" 367 | }, 368 | "collapsed": false 369 | }, 370 | "outputs": [ 371 | { 372 | "data": { 373 | "image/png": "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\nrkJggg==\n", 374 | "text/plain": [ 375 | "" 376 | ] 377 | }, 378 | "metadata": {}, 379 | "output_type": "display_data" 380 | } 381 | ], 382 | "source": [ 383 | "# Show a few images and predicted bounding boxes from the test dataset. \n", 384 | "plt.figure(figsize=(12, 3))\n", 385 | "for i_subplot in range(1, 5):\n", 386 | " plt.subplot(1, 4, i_subplot)\n", 387 | " i = np.random.randint(len(test_imgs))\n", 388 | " plt.imshow(test_imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", 389 | " for pred_bbox, exp_bbox in zip(pred_bboxes[i], test_bboxes[i]):\n", 390 | " plt.gca().add_patch(matplotlib.patches.Rectangle((pred_bbox[0], pred_bbox[1]), pred_bbox[2], pred_bbox[3], ec='r', fc='none'))\n", 391 | " plt.annotate('IOU: {:.2f}'.format(IOU(pred_bbox, exp_bbox)), (pred_bbox[0], pred_bbox[1]+pred_bbox[3]+0.2), color='r')\n", 392 | " \n", 393 | "# plt.savefig('plots/bw-single-rectangle_prediction.png', dpi=300)" 394 | ] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "execution_count": 23, 399 | "metadata": { 400 | "ExecuteTime": { 401 | "end_time": "2016-07-08T02:01:45.826000", 402 | "start_time": "2016-07-08T02:01:45.738000" 403 | }, 404 | "collapsed": false 405 | }, 406 | "outputs": [ 407 | { 408 | "data": { 409 | "text/plain": [ 410 | "0.88166504246337463" 411 | ] 412 | }, 413 | "execution_count": 23, 414 | "metadata": {}, 415 | "output_type": "execute_result" 416 | } 417 | ], 418 | "source": [ 419 | "# Calculate the mean IOU (overlap) between the predicted and expected bounding boxes on the test dataset. \n", 420 | "summed_IOU = 0.\n", 421 | "for pred_bbox, test_bbox in zip(pred_bboxes.reshape(-1, 4), test_bboxes.reshape(-1, 4)):\n", 422 | " summed_IOU += IOU(pred_bbox, test_bbox)\n", 423 | "mean_IOU = summed_IOU / len(pred_bboxes)\n", 424 | "mean_IOU" 425 | ] 426 | }, 427 | { 428 | "cell_type": "code", 429 | "execution_count": null, 430 | "metadata": { 431 | "collapsed": true 432 | }, 433 | "outputs": [], 434 | "source": [] 435 | } 436 | ], 437 | "metadata": { 438 | "kernelspec": { 439 | "display_name": "Python 2", 440 | "language": "python", 441 | "name": "python2" 442 | }, 443 | "language_info": { 444 | "codemirror_mode": { 445 | "name": "ipython", 446 | "version": 2 447 | }, 448 | "file_extension": ".py", 449 | "mimetype": "text/x-python", 450 | "name": "python", 451 | "nbconvert_exporter": "python", 452 | "pygments_lexer": "ipython2", 453 | "version": "2.7.11" 454 | } 455 | }, 456 | "nbformat": 4, 457 | "nbformat_minor": 0 458 | } 459 | -------------------------------------------------------------------------------- /two-rectangles-or-triangles.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2016-07-06T23:25:52.986000", 9 | "start_time": "2016-07-06T23:25:52.454000" 10 | }, 11 | "collapsed": true 12 | }, 13 | "outputs": [], 14 | "source": [ 15 | "import numpy as np\n", 16 | "import matplotlib.pyplot as plt\n", 17 | "import matplotlib\n", 18 | "%matplotlib inline" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 2, 24 | "metadata": { 25 | "ExecuteTime": { 26 | "end_time": "2016-07-06T23:25:58.288000", 27 | "start_time": "2016-07-06T23:25:54.225000" 28 | } 29 | }, 30 | "outputs": [ 31 | { 32 | "data": { 33 | "text/plain": [ 34 | "((50000L, 16L, 16L), (50000L, 2L, 4L))" 35 | ] 36 | }, 37 | "execution_count": 2, 38 | "metadata": {}, 39 | "output_type": "execute_result" 40 | } 41 | ], 42 | "source": [ 43 | "num_imgs = 50000\n", 44 | "\n", 45 | "img_size = 16\n", 46 | "min_rect_size = 3\n", 47 | "max_rect_size = 8\n", 48 | "num_objects = 2\n", 49 | "\n", 50 | "bboxes = np.zeros((num_imgs, num_objects, 4))\n", 51 | "imgs = np.zeros((num_imgs, img_size, img_size))\n", 52 | "shapes = np.zeros((num_imgs, num_objects, 1))\n", 53 | "\n", 54 | "for i_img in range(num_imgs):\n", 55 | " for i_object in range(num_objects):\n", 56 | " if np.random.choice([True, False]):\n", 57 | " width, height = np.random.randint(min_rect_size, max_rect_size, size=2)\n", 58 | " x = np.random.randint(0, img_size - width)\n", 59 | " y = np.random.randint(0, img_size - height)\n", 60 | " imgs[i_img, x:x+width, y:y+height] = 1.\n", 61 | " bboxes[i_img, i_object] = [x, y, width, height]\n", 62 | " shapes[i_img, i_object] = [0]\n", 63 | " else:\n", 64 | " size = np.random.randint(min_rect_size, max_rect_size)\n", 65 | " x, y = np.random.randint(0, img_size - size, size=2)\n", 66 | " mask = np.tril_indices(size)\n", 67 | " imgs[i_img, x + mask[0], y + mask[1]] = 1.\n", 68 | " bboxes[i_img, i_object] = [x, y, size, size]\n", 69 | " shapes[i_img, i_object] = [1]\n", 70 | " \n", 71 | "imgs.shape, bboxes.shape" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 3, 77 | "metadata": { 78 | "ExecuteTime": { 79 | "end_time": "2016-07-06T23:25:58.544000", 80 | "start_time": "2016-07-06T23:25:58.291000" 81 | } 82 | }, 83 | "outputs": [ 84 | { 85 | "data": { 86 | "image/png": "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\nA0FS8/8gQbUm/IBsdwAAAABJRU5ErkJggg==\n", 87 | "text/plain": [ 88 | "" 89 | ] 90 | }, 91 | "metadata": {}, 92 | "output_type": "display_data" 93 | } 94 | ], 95 | "source": [ 96 | "i = 0\n", 97 | "# TODO: Why does the array have to be transposed?\n", 98 | "plt.imshow(imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", 99 | "for bbox, shape in zip(bboxes[i], shapes[i]):\n", 100 | " plt.gca().add_patch(matplotlib.patches.Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], ec='r' if shape[0] == 0 else 'y', fc='none'))" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 4, 106 | "metadata": { 107 | "ExecuteTime": { 108 | "end_time": "2016-07-06T23:25:59.719000", 109 | "start_time": "2016-07-06T23:25:59.203000" 110 | } 111 | }, 112 | "outputs": [ 113 | { 114 | "data": { 115 | "text/plain": [ 116 | "((50000L, 256L), -4.0834557957225569e-17, 1.0000000000000016)" 117 | ] 118 | }, 119 | "execution_count": 4, 120 | "metadata": {}, 121 | "output_type": "execute_result" 122 | } 123 | ], 124 | "source": [ 125 | "X = (imgs.reshape(num_imgs, -1) - np.mean(imgs)) / np.std(imgs)\n", 126 | "X.shape, np.mean(X), np.std(X)" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 5, 132 | "metadata": { 133 | "ExecuteTime": { 134 | "end_time": "2016-07-06T23:26:00.476000", 135 | "start_time": "2016-07-06T23:26:00.464000" 136 | } 137 | }, 138 | "outputs": [ 139 | { 140 | "data": { 141 | "text/plain": [ 142 | "(50000L, 10L)" 143 | ] 144 | }, 145 | "execution_count": 5, 146 | "metadata": {}, 147 | "output_type": "execute_result" 148 | } 149 | ], 150 | "source": [ 151 | "# TODO: We use binary classification here - for multiple classes, convert classes to one-hot vectors.\n", 152 | "y = np.concatenate([bboxes / img_size, shapes], axis=-1).reshape(num_imgs, -1)\n", 153 | "y.shape" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 6, 159 | "metadata": { 160 | "ExecuteTime": { 161 | "end_time": "2016-07-06T23:26:01.233000", 162 | "start_time": "2016-07-06T23:26:01.226000" 163 | }, 164 | "collapsed": true 165 | }, 166 | "outputs": [], 167 | "source": [ 168 | "i = int(0.8 * num_imgs)\n", 169 | "train_X = X[:i]\n", 170 | "test_X = X[i:]\n", 171 | "train_y = y[:i]\n", 172 | "test_y = y[i:]\n", 173 | "test_imgs = imgs[i:]\n", 174 | "test_bboxes = bboxes[i:]" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 7, 180 | "metadata": { 181 | "ExecuteTime": { 182 | "end_time": "2016-07-06T23:26:06.005000", 183 | "start_time": "2016-07-06T23:26:02.162000" 184 | } 185 | }, 186 | "outputs": [ 187 | { 188 | "name": "stderr", 189 | "output_type": "stream", 190 | "text": [ 191 | "Using Theano backend.\n" 192 | ] 193 | } 194 | ], 195 | "source": [ 196 | "from keras.models import Sequential\n", 197 | "from keras.layers import Dense, Activation, Dropout\n", 198 | "from keras.optimizers import SGD\n", 199 | "model = Sequential([\n", 200 | " Dense(256, input_dim=X.shape[-1]), \n", 201 | " Activation('relu'), \n", 202 | " Dropout(0.4), \n", 203 | " Dense(y.shape[-1])\n", 204 | " ])\n", 205 | "model.compile('adadelta', 'mse')" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 8, 211 | "metadata": { 212 | "ExecuteTime": { 213 | "end_time": "2016-07-06T23:32:54.867000", 214 | "start_time": "2016-07-06T23:26:06.009000" 215 | }, 216 | "code_folding": [ 217 | 2, 218 | 17 219 | ] 220 | }, 221 | "outputs": [ 222 | { 223 | "name": "stdout", 224 | "output_type": "stream", 225 | "text": [ 226 | "Epoch 0\n", 227 | "Train on 40000 samples, validate on 10000 samples\n", 228 | "Epoch 1/1\n", 229 | "5s - loss: 0.1568 - val_loss: 0.0559\n", 230 | "Flipped 19200.0 training samples (48.0 %)\n", 231 | "Mean IOU: 0.242985636173\n", 232 | "Mean dist: 0.197557964071\n", 233 | "\n", 234 | "Epoch 1\n", 235 | "Train on 40000 samples, validate on 10000 samples\n", 236 | "Epoch 1/1\n", 237 | "5s - loss: 0.0557 - val_loss: 0.0501\n", 238 | "Flipped 10275.0 training samples (25.6875 %)\n", 239 | "Mean IOU: 0.279607567133\n", 240 | "Mean dist: 0.180107625927\n", 241 | "\n", 242 | "Epoch 2\n", 243 | "Train on 40000 samples, validate on 10000 samples\n", 244 | "Epoch 1/1\n", 245 | "5s - loss: 0.0492 - val_loss: 0.0484\n", 246 | "Flipped 7191.0 training samples (17.9775 %)\n", 247 | "Mean IOU: 0.319445985247\n", 248 | "Mean dist: 0.160972388048\n", 249 | "\n", 250 | "Epoch 3\n", 251 | "Train on 40000 samples, validate on 10000 samples\n", 252 | "Epoch 1/1\n", 253 | "4s - loss: 0.0442 - val_loss: 0.0493\n", 254 | "Flipped 4605.0 training samples (11.5125 %)\n", 255 | "Mean IOU: 0.362110983162\n", 256 | "Mean dist: 0.142787179212\n", 257 | "\n", 258 | "Epoch 4\n", 259 | "Train on 40000 samples, validate on 10000 samples\n", 260 | "Epoch 1/1\n", 261 | "4s - loss: 0.0397 - val_loss: 0.0514\n", 262 | "Flipped 2731.0 training samples (6.8275 %)\n", 263 | "Mean IOU: 0.398454722176\n", 264 | "Mean dist: 0.126876902916\n", 265 | "\n", 266 | "Epoch 5\n", 267 | "Train on 40000 samples, validate on 10000 samples\n", 268 | "Epoch 1/1\n", 269 | "4s - loss: 0.0365 - val_loss: 0.0521\n", 270 | "Flipped 2014.0 training samples (5.035 %)\n", 271 | "Mean IOU: 0.42149196072\n", 272 | "Mean dist: 0.118305101417\n", 273 | "\n", 274 | "Epoch 6\n", 275 | "Train on 40000 samples, validate on 10000 samples\n", 276 | "Epoch 1/1\n", 277 | "4s - loss: 0.0342 - val_loss: 0.0532\n", 278 | "Flipped 1499.0 training samples (3.7475 %)\n", 279 | "Mean IOU: 0.438339288177\n", 280 | "Mean dist: 0.111296744747\n", 281 | "\n", 282 | "Epoch 7\n", 283 | "Train on 40000 samples, validate on 10000 samples\n", 284 | "Epoch 1/1\n", 285 | "4s - loss: 0.0322 - val_loss: 0.0542\n", 286 | "Flipped 1367.0 training samples (3.4175 %)\n", 287 | "Mean IOU: 0.458791583308\n", 288 | "Mean dist: 0.104734359959\n", 289 | "\n", 290 | "Epoch 8\n", 291 | "Train on 40000 samples, validate on 10000 samples\n", 292 | "Epoch 1/1\n", 293 | "4s - loss: 0.0309 - val_loss: 0.0538\n", 294 | "Flipped 1145.0 training samples (2.8625 %)\n", 295 | "Mean IOU: 0.460957146178\n", 296 | "Mean dist: 0.103087726083\n", 297 | "\n", 298 | "Epoch 9\n", 299 | "Train on 40000 samples, validate on 10000 samples\n", 300 | "Epoch 1/1\n", 301 | "5s - loss: 0.0298 - val_loss: 0.0544\n", 302 | "Flipped 1071.0 training samples (2.6775 %)\n", 303 | "Mean IOU: 0.472695257841\n", 304 | "Mean dist: 0.0997398846543\n", 305 | "\n", 306 | "Epoch 10\n", 307 | "Train on 40000 samples, validate on 10000 samples\n", 308 | "Epoch 1/1\n", 309 | "4s - loss: 0.0289 - val_loss: 0.0546\n", 310 | "Flipped 982.0 training samples (2.455 %)\n", 311 | "Mean IOU: 0.475498423504\n", 312 | "Mean dist: 0.0987868952204\n", 313 | "\n", 314 | "Epoch 11\n", 315 | "Train on 40000 samples, validate on 10000 samples\n", 316 | "Epoch 1/1\n", 317 | "4s - loss: 0.0281 - val_loss: 0.0547\n", 318 | "Flipped 923.0 training samples (2.3075 %)\n", 319 | "Mean IOU: 0.488416947873\n", 320 | "Mean dist: 0.0947622980352\n", 321 | "\n", 322 | "Epoch 12\n", 323 | "Train on 40000 samples, validate on 10000 samples\n", 324 | "Epoch 1/1\n", 325 | "4s - loss: 0.0273 - val_loss: 0.0546\n", 326 | "Flipped 836.0 training samples (2.09 %)\n", 327 | "Mean IOU: 0.48874462737\n", 328 | "Mean dist: 0.0939458890792\n", 329 | "\n", 330 | "Epoch 13\n", 331 | "Train on 40000 samples, validate on 10000 samples\n", 332 | "Epoch 1/1\n", 333 | "4s - loss: 0.0266 - val_loss: 0.0552\n", 334 | "Flipped 854.0 training samples (2.135 %)\n", 335 | "Mean IOU: 0.492589727087\n", 336 | "Mean dist: 0.0929735561502\n", 337 | "\n", 338 | "Epoch 14\n", 339 | "Train on 40000 samples, validate on 10000 samples\n", 340 | "Epoch 1/1\n", 341 | "4s - loss: 0.0260 - val_loss: 0.0555\n", 342 | "Flipped 840.0 training samples (2.1 %)\n", 343 | "Mean IOU: 0.49697117486\n", 344 | "Mean dist: 0.0918255879526\n", 345 | "\n", 346 | "Epoch 15\n", 347 | "Train on 40000 samples, validate on 10000 samples\n", 348 | "Epoch 1/1\n", 349 | "4s - loss: 0.0257 - val_loss: 0.0549\n", 350 | "Flipped 938.0 training samples (2.345 %)\n", 351 | "Mean IOU: 0.498299255798\n", 352 | "Mean dist: 0.0906791499878\n", 353 | "\n", 354 | "Epoch 16\n", 355 | "Train on 40000 samples, validate on 10000 samples\n", 356 | "Epoch 1/1\n", 357 | "4s - loss: 0.0254 - val_loss: 0.0554\n", 358 | "Flipped 864.0 training samples (2.16 %)\n", 359 | "Mean IOU: 0.502686649386\n", 360 | "Mean dist: 0.0897506966331\n", 361 | "\n", 362 | "Epoch 17\n", 363 | "Train on 40000 samples, validate on 10000 samples\n", 364 | "Epoch 1/1\n", 365 | "4s - loss: 0.0250 - val_loss: 0.0558\n", 366 | "Flipped 919.0 training samples (2.2975 %)\n", 367 | "Mean IOU: 0.501087879733\n", 368 | "Mean dist: 0.0898817176063\n", 369 | "\n", 370 | "Epoch 18\n", 371 | "Train on 40000 samples, validate on 10000 samples\n", 372 | "Epoch 1/1\n", 373 | "4s - loss: 0.0245 - val_loss: 0.0553\n", 374 | "Flipped 789.0 training samples (1.9725 %)\n", 375 | "Mean IOU: 0.510024924944\n", 376 | "Mean dist: 0.0866388306772\n", 377 | "\n", 378 | "Epoch 19\n", 379 | "Train on 40000 samples, validate on 10000 samples\n", 380 | "Epoch 1/1\n", 381 | "4s - loss: 0.0243 - val_loss: 0.0554\n", 382 | "Flipped 816.0 training samples (2.04 %)\n", 383 | "Mean IOU: 0.509864361663\n", 384 | "Mean dist: 0.0867276995739\n", 385 | "\n", 386 | "Epoch 20\n", 387 | "Train on 40000 samples, validate on 10000 samples\n", 388 | "Epoch 1/1\n", 389 | "4s - loss: 0.0240 - val_loss: 0.0556\n", 390 | "Flipped 801.0 training samples (2.0025 %)\n", 391 | "Mean IOU: 0.512294895195\n", 392 | "Mean dist: 0.0862244741229\n", 393 | "\n", 394 | "Epoch 21\n", 395 | "Train on 40000 samples, validate on 10000 samples\n", 396 | "Epoch 1/1\n", 397 | "4s - loss: 0.0236 - val_loss: 0.0555\n", 398 | "Flipped 745.0 training samples (1.8625 %)\n", 399 | "Mean IOU: 0.515253308823\n", 400 | "Mean dist: 0.0849313586484\n", 401 | "\n", 402 | "Epoch 22\n", 403 | "Train on 40000 samples, validate on 10000 samples\n", 404 | "Epoch 1/1\n", 405 | "4s - loss: 0.0235 - val_loss: 0.0552\n", 406 | "Flipped 847.0 training samples (2.1175 %)\n", 407 | "Mean IOU: 0.509704473702\n", 408 | "Mean dist: 0.0860384929421\n", 409 | "\n", 410 | "Epoch 23\n", 411 | "Train on 40000 samples, validate on 10000 samples\n", 412 | "Epoch 1/1\n", 413 | "4s - loss: 0.0231 - val_loss: 0.0554\n", 414 | "Flipped 805.0 training samples (2.0125 %)\n", 415 | "Mean IOU: 0.522583586843\n", 416 | "Mean dist: 0.082750892523\n", 417 | "\n", 418 | "Epoch 24\n", 419 | "Train on 40000 samples, validate on 10000 samples\n", 420 | "Epoch 1/1\n", 421 | "4s - loss: 0.0231 - val_loss: 0.0559\n", 422 | "Flipped 795.0 training samples (1.9875 %)\n", 423 | "Mean IOU: 0.5220165657\n", 424 | "Mean dist: 0.0833447329007\n", 425 | "\n", 426 | "Epoch 25\n", 427 | "Train on 40000 samples, validate on 10000 samples\n", 428 | "Epoch 1/1\n", 429 | "5s - loss: 0.0228 - val_loss: 0.0554\n", 430 | "Flipped 692.0 training samples (1.73 %)\n", 431 | "Mean IOU: 0.518472561734\n", 432 | "Mean dist: 0.0832177979367\n", 433 | "\n", 434 | "Epoch 26\n", 435 | "Train on 40000 samples, validate on 10000 samples\n", 436 | "Epoch 1/1\n", 437 | "4s - loss: 0.0227 - val_loss: 0.0560\n", 438 | "Flipped 715.0 training samples (1.7875 %)\n", 439 | "Mean IOU: 0.531976024594\n", 440 | "Mean dist: 0.0807062015938\n", 441 | "\n", 442 | "Epoch 27\n", 443 | "Train on 40000 samples, validate on 10000 samples\n", 444 | "Epoch 1/1\n", 445 | "4s - loss: 0.0225 - val_loss: 0.0558\n", 446 | "Flipped 755.0 training samples (1.8875 %)\n", 447 | "Mean IOU: 0.527110370286\n", 448 | "Mean dist: 0.0818592475274\n", 449 | "\n", 450 | "Epoch 28\n", 451 | "Train on 40000 samples, validate on 10000 samples\n", 452 | "Epoch 1/1\n", 453 | "4s - loss: 0.0223 - val_loss: 0.0558\n", 454 | "Flipped 664.0 training samples (1.66 %)\n", 455 | "Mean IOU: 0.524141956699\n", 456 | "Mean dist: 0.0824798966059\n", 457 | "\n", 458 | "Epoch 29\n", 459 | "Train on 40000 samples, validate on 10000 samples\n", 460 | "Epoch 1/1\n", 461 | "4s - loss: 0.0220 - val_loss: 0.0563\n", 462 | "Flipped 833.0 training samples (2.0825 %)\n", 463 | "Mean IOU: 0.531040570366\n", 464 | "Mean dist: 0.0800875488942\n", 465 | "\n", 466 | "Epoch 30\n", 467 | "Train on 40000 samples, validate on 10000 samples\n", 468 | "Epoch 1/1\n", 469 | "4s - loss: 0.0219 - val_loss: 0.0564\n", 470 | "Flipped 856.0 training samples (2.14 %)\n", 471 | "Mean IOU: 0.532365466129\n", 472 | "Mean dist: 0.0798171989575\n", 473 | "\n", 474 | "Epoch 31\n", 475 | "Train on 40000 samples, validate on 10000 samples\n", 476 | "Epoch 1/1\n", 477 | "4s - loss: 0.0218 - val_loss: 0.0560\n", 478 | "Flipped 666.0 training samples (1.665 %)\n", 479 | "Mean IOU: 0.532150241524\n", 480 | "Mean dist: 0.0805836183106\n", 481 | "\n", 482 | "Epoch 32\n", 483 | "Train on 40000 samples, validate on 10000 samples\n", 484 | "Epoch 1/1\n", 485 | "4s - loss: 0.0216 - val_loss: 0.0562\n", 486 | "Flipped 750.0 training samples (1.875 %)\n", 487 | "Mean IOU: 0.53260218024\n", 488 | "Mean dist: 0.0799956398766\n", 489 | "\n", 490 | "Epoch 33\n", 491 | "Train on 40000 samples, validate on 10000 samples\n", 492 | "Epoch 1/1\n", 493 | "4s - loss: 0.0216 - val_loss: 0.0563\n", 494 | "Flipped 751.0 training samples (1.8775 %)\n", 495 | "Mean IOU: 0.537927557793\n", 496 | "Mean dist: 0.0789594690559\n", 497 | "\n", 498 | "Epoch 34\n", 499 | "Train on 40000 samples, validate on 10000 samples\n", 500 | "Epoch 1/1\n", 501 | "4s - loss: 0.0215 - val_loss: 0.0558\n", 502 | "Flipped 774.0 training samples (1.935 %)\n", 503 | "Mean IOU: 0.525038210403\n", 504 | "Mean dist: 0.0818134408655\n", 505 | "\n", 506 | "Epoch 35\n", 507 | "Train on 40000 samples, validate on 10000 samples\n", 508 | "Epoch 1/1\n", 509 | "4s - loss: 0.0213 - val_loss: 0.0561\n", 510 | "Flipped 777.0 training samples (1.9425 %)\n", 511 | "Mean IOU: 0.539060265778\n", 512 | "Mean dist: 0.0774311544654\n", 513 | "\n", 514 | "Epoch 36\n", 515 | "Train on 40000 samples, validate on 10000 samples\n", 516 | "Epoch 1/1\n", 517 | "4s - loss: 0.0213 - val_loss: 0.0563\n", 518 | "Flipped 742.0 training samples (1.855 %)\n", 519 | "Mean IOU: 0.540322599552\n", 520 | "Mean dist: 0.0776645600821\n", 521 | "\n", 522 | "Epoch 37\n", 523 | "Train on 40000 samples, validate on 10000 samples\n", 524 | "Epoch 1/1\n", 525 | "4s - loss: 0.0211 - val_loss: 0.0564\n", 526 | "Flipped 771.0 training samples (1.9275 %)\n", 527 | "Mean IOU: 0.533745474506\n", 528 | "Mean dist: 0.0788337795559\n", 529 | "\n", 530 | "Epoch 38\n", 531 | "Train on 40000 samples, validate on 10000 samples\n", 532 | "Epoch 1/1\n", 533 | "4s - loss: 0.0210 - val_loss: 0.0559\n", 534 | "Flipped 710.0 training samples (1.775 %)\n", 535 | "Mean IOU: 0.537828049212\n", 536 | "Mean dist: 0.0781276750452\n", 537 | "\n", 538 | "Epoch 39\n", 539 | "Train on 40000 samples, validate on 10000 samples\n", 540 | "Epoch 1/1\n", 541 | "4s - loss: 0.0210 - val_loss: 0.0565\n", 542 | "Flipped 666.0 training samples (1.665 %)\n", 543 | "Mean IOU: 0.537717195805\n", 544 | "Mean dist: 0.0780453172558\n", 545 | "\n", 546 | "Epoch 40\n", 547 | "Train on 40000 samples, validate on 10000 samples\n", 548 | "Epoch 1/1\n", 549 | "4s - loss: 0.0208 - val_loss: 0.0562\n", 550 | "Flipped 765.0 training samples (1.9125 %)\n", 551 | "Mean IOU: 0.536087355366\n", 552 | "Mean dist: 0.0787861236678\n", 553 | "\n", 554 | "Epoch 41\n", 555 | "Train on 40000 samples, validate on 10000 samples\n", 556 | "Epoch 1/1\n", 557 | "4s - loss: 0.0205 - val_loss: 0.0567\n", 558 | "Flipped 674.0 training samples (1.685 %)\n", 559 | "Mean IOU: 0.544342451278\n", 560 | "Mean dist: 0.0764891585959\n", 561 | "\n", 562 | "Epoch 42\n", 563 | "Train on 40000 samples, validate on 10000 samples\n", 564 | "Epoch 1/1\n", 565 | "4s - loss: 0.0206 - val_loss: 0.0561\n", 566 | "Flipped 696.0 training samples (1.74 %)\n", 567 | "Mean IOU: 0.538981326683\n", 568 | "Mean dist: 0.0777417385232\n", 569 | "\n", 570 | "Epoch 43\n", 571 | "Train on 40000 samples, validate on 10000 samples\n", 572 | "Epoch 1/1\n", 573 | "4s - loss: 0.0205 - val_loss: 0.0564\n", 574 | "Flipped 648.0 training samples (1.62 %)\n", 575 | "Mean IOU: 0.539015426899\n", 576 | "Mean dist: 0.0771807135874\n", 577 | "\n", 578 | "Epoch 44\n", 579 | "Train on 40000 samples, validate on 10000 samples\n", 580 | "Epoch 1/1\n", 581 | "4s - loss: 0.0204 - val_loss: 0.0566\n", 582 | "Flipped 627.0 training samples (1.5675 %)\n", 583 | "Mean IOU: 0.544229123534\n", 584 | "Mean dist: 0.0759150881751\n", 585 | "\n", 586 | "Epoch 45\n", 587 | "Train on 40000 samples, validate on 10000 samples\n", 588 | "Epoch 1/1\n", 589 | "4s - loss: 0.0204 - val_loss: 0.0564\n", 590 | "Flipped 596.0 training samples (1.49 %)\n", 591 | "Mean IOU: 0.545409298404\n", 592 | "Mean dist: 0.0765501037944\n", 593 | "\n", 594 | "Epoch 46\n", 595 | "Train on 40000 samples, validate on 10000 samples\n", 596 | "Epoch 1/1\n", 597 | "4s - loss: 0.0204 - val_loss: 0.0560\n", 598 | "Flipped 631.0 training samples (1.5775 %)\n", 599 | "Mean IOU: 0.542919962167\n", 600 | "Mean dist: 0.0766910073689\n", 601 | "\n", 602 | "Epoch 47\n", 603 | "Train on 40000 samples, validate on 10000 samples\n", 604 | "Epoch 1/1\n", 605 | "4s - loss: 0.0201 - val_loss: 0.0567\n", 606 | "Flipped 759.0 training samples (1.8975 %)\n", 607 | "Mean IOU: 0.543450512949\n", 608 | "Mean dist: 0.0763397818658\n", 609 | "\n", 610 | "Epoch 48\n", 611 | "Train on 40000 samples, validate on 10000 samples\n", 612 | "Epoch 1/1\n", 613 | "4s - loss: 0.0202 - val_loss: 0.0570\n", 614 | "Flipped 701.0 training samples (1.7525 %)\n", 615 | "Mean IOU: 0.545041588618\n", 616 | "Mean dist: 0.0763403655117\n", 617 | "\n", 618 | "Epoch 49\n", 619 | "Train on 40000 samples, validate on 10000 samples\n", 620 | "Epoch 1/1\n", 621 | "4s - loss: 0.0201 - val_loss: 0.0566\n", 622 | "Flipped 566.0 training samples (1.415 %)\n", 623 | "Mean IOU: 0.548117733988\n", 624 | "Mean dist: 0.0750292489711\n", 625 | "\n" 626 | ] 627 | } 628 | ], 629 | "source": [ 630 | "# Flip bboxes during training.\n", 631 | "# Note: The validation loss is always quite big here because we don't flip the bounding boxes for the validation data. \n", 632 | "def IOU(bbox1, bbox2):\n", 633 | " '''Calculate overlap between two bounding boxes [x, y, w, h] as the area of intersection over the area of unity'''\n", 634 | " x1, y1, w1, h1 = bbox1[0], bbox1[1], bbox1[2], bbox1[3] # TODO: Check if its more performant if tensor elements are accessed directly below.\n", 635 | " x2, y2, w2, h2 = bbox2[0], bbox2[1], bbox2[2], bbox2[3]\n", 636 | "\n", 637 | " w_I = min(x1 + w1, x2 + w2) - max(x1, x2)\n", 638 | " h_I = min(y1 + h1, y2 + h2) - max(y1, y2)\n", 639 | " w_I = max(w_I, 0) # set w_I and h_I zero if there is no intersection\n", 640 | " h_I = max(h_I, 0)\n", 641 | " I = w_I * h_I\n", 642 | "\n", 643 | " U = w1 * h1 + w2 * h2 - I\n", 644 | "\n", 645 | " return I / U\n", 646 | "\n", 647 | "def distance(bbox1, bbox2):\n", 648 | " return np.sqrt(np.sum(np.square(bbox1[:2] - bbox2[:2])))\n", 649 | "\n", 650 | "num_epochs = 50\n", 651 | "flipped_train_y = np.array(train_y)\n", 652 | "flipped = np.zeros((len(flipped_train_y), num_epochs))\n", 653 | "ious = np.zeros((len(flipped_train_y), num_epochs))\n", 654 | "dists = np.zeros((len(flipped_train_y), num_epochs))\n", 655 | "\n", 656 | "for epoch in range(num_epochs):\n", 657 | " print 'Epoch', epoch\n", 658 | " model.fit(train_X, flipped_train_y, nb_epoch=1, validation_data=(test_X, test_y), verbose=2)\n", 659 | " pred_y = model.predict(train_X)\n", 660 | "\n", 661 | " for i, (pred_bboxes, exp_bboxes) in enumerate(zip(pred_y, flipped_train_y)):\n", 662 | " \n", 663 | " flipped_exp_bboxes = np.concatenate([exp_bboxes[4:], exp_bboxes[:4]])\n", 664 | " \n", 665 | " mse = np.mean(np.square(pred_bboxes - exp_bboxes))\n", 666 | " mse_flipped = np.mean(np.square(pred_bboxes - flipped_exp_bboxes))\n", 667 | " \n", 668 | " iou = IOU(pred_bboxes[:4], exp_bboxes[:4]) + IOU(pred_bboxes[4:], exp_bboxes[4:])\n", 669 | " iou_flipped = IOU(pred_bboxes[:4], flipped_exp_bboxes[:4]) + IOU(pred_bboxes[4:], flipped_exp_bboxes[4:])\n", 670 | " \n", 671 | " dist = distance(pred_bboxes[:4], exp_bboxes[:4]) + IOU(pred_bboxes[4:], exp_bboxes[4:])\n", 672 | " dist_flipped = distance(pred_bboxes[:4], flipped_exp_bboxes[:4]) + IOU(pred_bboxes[4:], flipped_exp_bboxes[4:])\n", 673 | " \n", 674 | " if mse_flipped < mse: # using iou or dist here leads to similar results\n", 675 | " flipped_train_y[i] = flipped_exp_bboxes\n", 676 | " flipped[i, epoch] = 1\n", 677 | " ious[i, epoch] = iou_flipped / 2.\n", 678 | " dists[i, epoch] = dist_flipped / 2.\n", 679 | " else:\n", 680 | " ious[i, epoch] = iou / 2.\n", 681 | " dists[i, epoch] = dist / 2.\n", 682 | " \n", 683 | " print 'Flipped {} training samples ({} %)'.format(np.sum(flipped[:, epoch]), np.mean(flipped[:, epoch]) * 100.)\n", 684 | " print 'Mean IOU: {}'.format(np.mean(ious[:, epoch]))\n", 685 | " print 'Mean dist: {}'.format(np.mean(dists[:, epoch]))\n", 686 | " print" 687 | ] 688 | }, 689 | { 690 | "cell_type": "code", 691 | "execution_count": 9, 692 | "metadata": { 693 | "ExecuteTime": { 694 | "end_time": "2016-07-06T23:55:00.367000", 695 | "start_time": "2016-07-06T23:54:57.699000" 696 | } 697 | }, 698 | "outputs": [ 699 | { 700 | "data": { 701 | "text/plain": [ 702 | "" 703 | ] 704 | }, 705 | "execution_count": 9, 706 | "metadata": {}, 707 | "output_type": "execute_result" 708 | }, 709 | { 710 | "data": { 711 | "image/png": "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\nSUVORK5CYII=\n", 712 | "text/plain": [ 713 | "" 714 | ] 715 | }, 716 | "metadata": {}, 717 | "output_type": "display_data" 718 | } 719 | ], 720 | "source": [ 721 | "plt.pcolor(flipped[:1000], cmap='Greys')\n", 722 | "plt.xlabel('Epoch')\n", 723 | "plt.ylabel('Training sample')" 724 | ] 725 | }, 726 | { 727 | "cell_type": "code", 728 | "execution_count": 10, 729 | "metadata": { 730 | "ExecuteTime": { 731 | "end_time": "2016-07-06T23:55:01.541000", 732 | "start_time": "2016-07-06T23:55:01.245000" 733 | } 734 | }, 735 | "outputs": [ 736 | { 737 | "data": { 738 | "text/plain": [ 739 | "(0, 1)" 740 | ] 741 | }, 742 | "execution_count": 10, 743 | "metadata": {}, 744 | "output_type": "execute_result" 745 | }, 746 | { 747 | "data": { 748 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEACAYAAABI5zaHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VOW9x/HPLythCULCEgggq1q3uiN4NValyNVStZfa\nq7hULa1apVar2PtCvNZerWu9atVqK9q6e6ugxaViquKGL7UogoQ9hIAhIRASyDLz3D+ezGQSErIw\nZDn5vl+v8zpnzpw588xD+J5nnnPmOeacQ0REgiWhowsgIiLxp3AXEQkghbuISAAp3EVEAkjhLiIS\nQAp3EZEAajbczewxM9tsZkv2sM19ZpZnZp+b2bfjW0QREWmtlrTc/wx8t6knzex0YLRzbiwwA3go\nTmUTEZE2ajbcnXPvAVv3sMlU4InabT8C+prZoPgUT0RE2iIefe5DgfyYxwW160REpIPohKqISAAl\nxWEfBcCwmMfZtet2Y2YayEZEpA2cc9aa7VvacrfaqTHzgAsAzGw8UOqc27yHAmpyjptuuqnDy9BZ\nJtWF6kJ1seepLZptuZvZU0AOkGFm64GbgBSf0+4R59zfzWyKma0EyoGL21QSERGJm2bD3Tn3ny3Y\n5sr4FEdEROJBJ1Q7SE5OTkcXodNQXdRRXdRRXewda2t/TpvezMy15/uJiASBmeFaeUI1HlfLiMhe\n2H///Vm3bl1HF0M6gREjRrB27dq47Estd5EOVtsq6+hiSCfQ1N9CW1ru6nMXEQkghbuISAAp3EVE\nAkjhLiISQAp3EWnS/vvvT48ePSgpKam3/ogjjiAhIYH169e3a3n++c9/MmzYsHrrXnnlFY477jh6\n9+7NgAEDmD59OgUFdcNb3XzzzUyfPn23fSUkJLB69ep9XuaOonAXkSaZGSNHjuTpp5+Orvvyyy/Z\nuXMnZq26eCOuZYp44YUXOO+887jmmmsoLi5m6dKlpKSkcMIJJ7Bt27ZGX7OndUGicBeRPZo+fTpz\n586NPp47dy4XXnhhvW2qqqq49tprGTFiBFlZWVx++eVUVlYCUFpayplnnsnAgQPJyMjgzDPPrNey\nPvnkk5k9ezYnnHAC6enpTJ48ebdvCk259tprmT17Nj/84Q9JTU1l4MCBPProo/Tu3Zt77rlnj68N\n+uWnCncR2aPx48dTVlbG119/TTgc5tlnn+X888+vF47XX389K1euZMmSJaxcuZKCggL++7//G4Bw\nOMyPf/xj8vPzWb9+PT179uTKK+sPR/X0008zd+5cioqKqKys5M4772y2XMuXLyc/P58f/OAH9dab\nGeeccw5vvvlmHD5916VwF+nkzOIz7Y1I6/3NN9/koIMOYsiQIfWe/+Mf/8g999xD37596dWrFzfc\ncEO0K6d///6cddZZpKam0qtXL2bNmsU777xT7/UXX3wxo0ePJjU1lWnTpvH55583W6bi4mIAsrKy\ndnsuKyuLLVu2tPXjBoKGHxDp5DpD78H555/PiSeeyJo1a7jgggvqPVdUVERFRQVHHXVUdF04HI62\n7Hfu3MnMmTN5/fXXKS0txTnHjh07cM5F+70HDx4cfW3Pnj3ZsWNHs2XKzMwEoLCwkBEjRtR7rrCw\nMPp8UlIS1dXV9Z6vqakBIDk5uUWfvytSy11EmjV8+HBGjhzJggULOPvss+s9l5mZSc+ePVm6dCkl\nJSWUlJRQWloaPaF51113kZeXx+LFiyktLY222ve2z/uAAw4gOzub559/vt565xwvvvgip556arTs\nDcdrWb16NcnJyQwdGtzbPSvcRaRF/vSnP7Fw4ULS0tLqrTczLrvsMmbOnElRUREABQUFvPHGGwCU\nlZWRlpZGeno6JSUlzJkzJ25luuOOO/jNb37DM888Q2VlJZs2beKSSy6hrKyMmTNnAjB58mSWL1/O\nX//6V2pqaigpKeHXv/41P/jBD0hICG4EBveTichei71ccOTIkRx55JGNPnf77bczZswYxo8fz377\n7cekSZNYsWIFADNnzqSiooLMzEwmTJjAlClTmnyP1po2bRpPPvkkd999N5mZmRxyyCFUVlayaNEi\n+vXrB8CAAQNYsGABDz30EAMHDuSwww6jf//+PPjgg21+365Ao0KKdDCNCikRGhVSRET2SOEuIhJA\nCncRkQBSuIuIBJDCXUQkgBTuIiIBpHAXEQkghbuISAAp3EWkS4u9o9LPfvYzbr311g4uUeegcBeR\nJnW22+w1Jnb4gj/84Q/8+te/bvY1I0eOZOHChfuyWB1O4S4iTeqMt9lrSEM3NE7hLiJ71Nlus3fH\nHXcwZMgQsrOz+fOf/1zvIHPxxRcze/ZswN/M48wzz6Rfv35kZGRw0kknAXDBBRewfv16zjzzTNLT\n06N3fZo2bRpZWVn069ePnJwcvvrqq3r7vfLKKznjjDNIT0/n+OOPZ82aNdHnly5dyqRJk8jIyCAr\nK4vbbrsN8Aee2267jTFjxjBgwADOPfdcSktLW/cP0EYKdxHZo850m73XXnuNu+++m7feeou8vDz+\n8Y9/NFnuu+66i2HDhlFcXMw333zDb3/7WwCeeOIJhg8fziuvvML27du59tprAZgyZQqrVq3im2++\n4cgjj+S8886rt79nn32Wm2++mdLSUkaPHh3t/tmxYwennXYaU6ZMobCwkJUrV3LKKacAcN999zFv\n3jzeffddNm7cSL9+/bj88stbU/1tpjsxiXRydnN8uj/cTW3vvoi03k866aQmb7P3xRdf0LdvXwBu\nuOEGzjvvPG699dbobfYAUlNTmTVrVjT8IiK32QPfgp4/f36j5Xj++ee5+OKLOeiggwCYM2cOzzzz\nTKPbJicnU1hYyJo1axg9ejQTJ06s93zD7pyLLrooujx79mzuvfdeysrK6NOnDwBnnXVW9G5T5513\nHr/85S8BmD9/PllZWdHx41NSUjjmmGMAePjhh3nggQeitwKcPXs2I0aM4C9/+cs+H0te4S7Sye1N\nKMdLZ7nN3saNGzn66KOjj0eMGNFkn/t1113HnDlzmDRpUvSGItdff32j24bDYW688UZeeOEFtmzZ\ngplhZmzZsiUa7k2VccOGDdEDU0Pr1q3jrLPOiga5c47k5GQ2b97c6L1f40ndMiLSrM5ym72srCzy\n8/Ojj9etW9fkid3evXtz5513smrVKubNm8fdd9/N22+/Dex+g5CnnnqK+fPns3DhQkpLS1m7di3O\nuRaVcdiwYaxatarR54YPH86CBQui9bJ161bKy8v3ebCDwl1EWqgz3GZv2rRpPP744yxbtoyKiopo\nv35jXn311Wjo9unTh6SkJBITEwEYNGhQ9Nr4SBlTU1Pp168f5eXlzJo1q8VXA51xxhls2rSJ++67\nj6qqKnbs2MHHH38MwIwZM7jxxhujl4wWFRUxb968Nn321lK4i0iTOttt9iZPnszMmTP5zne+w7hx\n43bru4+Vl5fHqaeeSp8+fZg4cSJXXHEFJ554IgCzZs3illtuoX///tx9991ceOGFDB8+nKFDh3LI\nIYcwYcKEFpepd+/evPnmm8ybN4/Bgwczbtw4cnNzAbj66quZOnUqkyZNom/fvkyYMCEa/Ptai26z\nZ2aTgXvxB4PHnHO3N3g+HfgLMBxIBO5yzj3eyH50mz2RBnSbPYmI5232mg13M0sAVgCnABuBxcC5\nzrnlMdvMAtKdc7PMLBP4GhjknKtpsC+Fu0gDCneJaO97qB4L5Dnn1jnnqoFngKkNtnFAn9rlPkBx\nw2AXEZH205JwHwrkxzzeULsu1v3At8xsI/Av4Or4FE9ERNoiXte5fxf4zDn3HTMbDbxpZoc553a7\nWDX2THlOTg45OTlxKoKISDDk5uZGT8q2VUv63McDc5xzk2sf3wC42JOqZvYK8D/OuUW1j98CrnfO\nfdJgX+pzF2lAfe4S0d597ouBMWY2wsxSgHOBhhdqrgNOrS3EIGAcsBoREekQzXbLOOdCZnYl8AZ1\nl0IuM7MZ/mn3CPAb4HEzW1L7sl8555oe1k1EokaMGNFphs+VjjVixIi47atF17nH7c3ULSMi0mr7\nqltGRES6GIW7iEgAKdxFRAJI4S4iEkAKdxGRAFK4i4gEkMJdRCSAFO4iIgGkcBcRCSCFu4hIACnc\nRUQCSOEuIhJACncRkQBSuIuIBJDCXUQkgBTuIiIBpHAXEQkghbuISAAp3EVEAkjhLiISQAp3EZEA\nUriLiASQwl1EJIAU7iIiAaRwFxEJIIW7iEgAKdxFRAJI4S4iEkAKdxGRAFK4i4gEkMJdRCSAFO4i\nIgGkcBcRCSCFu4hIACncRUQCqEXhbmaTzWy5ma0ws+ub2CbHzD4zsy/N7O34FlNERFrDnHN73sAs\nAVgBnAJsBBYD5zrnlsds0xd4H5jknCsws0zn3JZG9uWaez8REanPzHDOWWte05KW+7FAnnNunXOu\nGngGmNpgm/8EXnTOFQA0FuwiItJ+WhLuQ4H8mMcbatfFGgf0N7O3zWyxmU2PVwFFRKT1kuK4nyOB\n7wC9gA/M7APn3Mo47V9ERFqhJeFeAAyPeZxduy7WBmCLc24XsMvM3gEOB3YL9zlz5kSXc3JyyMnJ\naV2JRUQCLjc3l9zc3L3aR0tOqCYCX+NPqBYCHwM/cs4ti9nmQOB/gclAKvAR8EPn3FcN9qUTqiIi\nrdSWE6rNttydcyEzuxJ4A99H/5hzbpmZzfBPu0ecc8vN7HVgCRACHmkY7CIi0n6abbnH9c3UchcR\nabV9dSmkiIh0MQp3EZEAUriLiASQwl1EJIAU7iIiAaRwFxEJIIW7iEgHcw7Ky+O7z3iNLSMiss85\nB2vWwH77Qf/+e7+/cBjy82HLFqio2H2qrPTvNWAADBzo5wMGQGrqnstYWQnbt0NZWf35tm2waRNs\n3AgFBX4emY44AhYt2vvPFKEfMYlIPTU1sGOHb0mWl/uQiyynpMCRR0J6evuVZ+tWeOsteP11eOMN\nqKryZUlPh8MOg0MP9fPDDoMDDoDkZP+6hlFTXAxffAFfflk3X7oU+vSBwYOhZ8/dp5QU//5FRfWn\ntDT/ulAIqqt9ncXOU1J8+fr0qT9PT/fvNWRI3TR0KGRlQe/eTddBW37EpHAXCQjnYN06H1xLlvh5\nQgL89Kfwb/8G1kw0rFkDd90Fjz8OiYnQq5cPuF696qbycvjXv2DUKDj+eBg/3k8HHujfq6wMVq3y\n0+rVfr52rQ9ks7oyRJaTkuoHX+y0fr0P86VL4YQTYNIk+O53/XuB/6xLltR91iVLYMUK3xqPiP3M\nffvCIYf4g0FkfvDBrf8G4JxvgZeV+fInJ9fNI8sJce7wVriLxNnKlZCbC2PGwEEH+a/mzYXknpSV\n+SDavr2uNRzbSq6q8sEQmczqlsNh3zKMTKGQn5eXw1df+ZZonz4+tCKt2a1b4f77fUvzqqvgRz/y\ny7GWLIHbb4fXXoOf/ASuvtq3LptSVeVf8+GHddOWLb61Wl7ug3/UKBg92k8jR/pujMh/fefqppqa\nui6L2KmsDDIzfaBPnAg9erS9zoNA4S4SB875vs+77oL33vMBs26dD1AzH/Lf+pafjxrlv1pnZcGg\nQXVdApH9rF/v9xWZVq70rcX99vMt4d6967eMU1L868Lhusk5H+SJib5V2HDq0cO3Zg89tPFWaDjs\nW8D33QeffAKXXgqXX+5b1rfdBp9/DjNnwowZvnXbFkVFPqgHD967g580TuEu3V5BAbz/vg/CyNfk\n2K/NmZkwbNjurVfw4fS3v8Gdd/r+2V/8Ai66yIcu+JD95htYtswH/bJlvsth40YoLPQB17+/D/rM\nTP98KORbnhMnwoQJvr86JaU9a6S+FSvggQdg7lx/YvBXv4Lp09Uy7uwU7tItOQcffOBbpm+8ASee\n6FuP1dX1T3JVVfnugw0bfJ/u8OF+GjHCd2c8+aRvhV97LXzve/4A0RqhkA//wkI/HzvWt+w7Y0t2\n1y5/sGvtZ5SOoXCXLicU8oFbWFg3RVrCmzb5Pu5vfxsOP9x3O0Ra0eAvN3v2WR/qpaXw85/7lnZz\nXQvhsA/fdet8t8n69f7xWWf5k4MinY3CXTqEc/DZZ/6EXGlp/ROBkXko5Ls6iop8mEcuKdu61fc/\nR/qtI9OQIb4Pe9Mm3yf8r3/5bo5hw3zQDx4Mzz3nl6+6Ck4/Pf5XKIh0Fgp3aTcVFf7a4/nz4dVX\n/YnBKVN86EZOCMbOzSAjo+5HIAMG+H7pjAzfH94S1dXw9dc+6NeuhbPP9ic1RYJO4S6ttn075OX5\nE22x88JC3wUSew1yZHn1anj3XTj6aDjjDD+NG9fRn0QkuBTuQijk+5Bjg/qbb+pfSx25trqszPdb\njxnjw3ns2Lr50KG+dR573XFkedAg/2OS/fbr6E8r0j0o3LuJHTv8rwnXrvXzNWt8azovzy8PGFA/\nqAcPrn9Ndew8M7NzXs0hInUU7l3ckiXw4IM+qEMh318dCtVNVVV+kKPycth/f//Lv8h81Cgf5KNH\n+5+Mi0hwKNy7oFAI5s2D3//et7x/9jM45hh/5UdiYv0pORmys323iFrbIt1HW8JdQ/52kK1b4dFH\n/a8Fhwzxl/Odc079n6+LiLSVwn0fCYf99dkbNvhrtRtOy5b5q0yef9631EVE4kndMnG2caMfMvWx\nx3wrPHJCs+E0bpw/8Ski0hx1y3SQmhr4+999N8u778K0afDMM/46cPWNi0hHULi3QCjkLzssLoaS\nkrp5SYnvYpk3z1+1cuml8NRTe76jiohIe1C3TDO+/BIuuMCPgzJokP+5fP/+9eennebH9xYR2RfU\nLRNHoZC/WcMdd8D//A9ccom6WESk61C4N2LlSj90bFISLF7su1xERLoSDZIawzn4wx/8jX//4z9g\n4UIFu4h0TWq518rLgyuu8Hc1f/fdujusi4h0Rd2+5V5S4u+Vefzx/sTookUKdhHp+rptuFdVwb33\n+iCvrPQ3PL7uupbfOEJEpDPrdlHmHLz0kr/r+9ix8PbbcPDBHV0qEZH46lbhXlgI06fD5s1+wK5J\nkzq6RCIi+0aLumXMbLKZLTezFWZ2/R62O8bMqs3s7PgVMT5yc+Goo+DEE/3NnBXsIhJkzbbczSwB\nuB84BdgILDazl51zyxvZ7jbg9X1R0LYKh+F3v/PjpT/xhD9pKiISdC3pljkWyHPOrQMws2eAqcDy\nBtv9HHgB6DQD2G7dChdeCFu2+B8jZWd3dIlERNpHS7plhgL5MY831K6LMrMhwPedc38AOsWP9D/9\n1HfDjBrlu2QU7CLSncTrhOq9QGxffIcG/HPP+R8kPfig/6WpiEh305JwLwCGxzzOrl0X62jgGTMz\nIBM43cyqnXPzGu5szpw50eWcnBxycnJaWeQ9++ADuPJKP3TAoYfGddciIu0iNzeX3NzcvdpHs0P+\nmlki8DX+hGoh8DHwI+fcsia2/zMw3zn3f408t0+H/M3Ph+OO8zfNmDJln72NiEi72idD/jrnQmZ2\nJfAGvo/+MefcMjOb4Z92jzR8SWsKEC/l5TB1qh9KQMEuIt1dIG7WEQ7DD38IaWkwd67GXReRYOm2\nN+u45RbYsMEPJaBgFxEJQLi/+CI89hh8/DH06NHRpRER6Ry6dLh/9hn89Kfw+usweHBHl0ZEpPPo\nskP+FhXB97/vBwA78siOLo2ISOfSJU+oOuevjDnwQD9ujIhIkHWbE6p//KO/pv2FFzq6JCIinVOX\na7nn5cGECfDPf8K3vhWngomIdGJtabl3qT736mo4/3y46SYFu4jInnSpcP/Nb6B/fz8omIiINK3L\n9Ll/8AE8/LC//FE/VBIR2bMu0XIvK/PdMQ89BFlZHV0aEZHOr0ucUL3kEkhI8FfJiIh0N4G8FPL/\n/g/eecd3x4iISMt06pZ7fj4ccwy89BKMH78PCyYi0okF6lLI6mo/jO8vfqFgFxFprU7bcr/uOvjq\nK5g/3/e3i4h0V4Hpc58/39/k+tNPFewiIm3R6cJ93Tq49FLfz56R0dGlERHpmjpVu7iqyvez/+pX\ncPzxHV0aEZGuq1P1uV9zDaxcCS+/rF+hiohEdOk+95de8te0f/qpgl1EZG91ipb7mjVw3HH+ROpx\nx7VbcUREuoQueZ17RQWccw7ceKOCXUQkXjq05e4cnHsupKbC3LnqjhERaUyX63P/7W9h7Vp/VyUF\nu4hI/HRYuL/8sh/C96OPoEePjiqFiEgwdUi4f/klXHYZvPoqDBnSESUQEQm2dj+hWlwMU6fC3Xf7\nER9FRCT+2v2E6sknO445Bm6/vd3eVkSkS+sSl0KmpfkTqSIisu+0e8u9tNTRt2+7vaWISJfXlpZ7\np/iFqoiINK1LdMuIiMi+p3AXEQkghbuISAAp3EVEAqhF4W5mk81suZmtMLPrG3n+P83sX7XTe2Z2\naPyLKiIiLdXs1TJmlgCsAE4BNgKLgXOdc8tjthkPLHPObTOzycAc59z4Rvalq2VERFppX10tcyyQ\n55xb55yrBp4BpsZu4Jz70Dm3rfbhh8DQ1hRCRETiqyXhPhTIj3m8gT2H96XAgr0plIiI7J24jgpp\nZicDFwMnNLXNz3/1czJ6ZgCQk5NDTk5OPIsgItLl5ebmkpubu1f7aEmf+3h8H/rk2sc3AM45d3uD\n7Q4DXgQmO+dWNbEvl3F7Bj8+4sf814n/RXpq+l4VXkSkO9hXfe6LgTFmNsLMUoBzgXkN3ng4Ptin\nNxXsEV9e/iVFFUUceP+BPP7544RduDXlFRGRFmjR2DK1V8D8Hn8weMw5d5uZzcC34B8xsz8CZwPr\nAAOqnXPHNrKf6NUyHxd8zFULrsLhuG/yfRyXrbtji4g0pssNHBZ2Yf6y5C/MemsWk0dP5s5Jd9Iv\nrV+7lUdEpCvocgOHJVgCFxx+AcuuWEZachoHP3gwzy19Dl0LLyKydzrVkL/v57/PZfMvY3S/0Tww\n5QGG9R3WbmUTEemsulzLvaEJwybw6U8+5eghR3PEw0dw/8f3EwqHOrpYIiJdTqdqucdaVrSMy+Zf\nRsiFeOjfH+LwwYfv49KJiHROXb7lHuugAQfxzsXvcNHhF3Hak6fxi9d+wfbK7R1dLBGRLqHThjv4\nE64zjp7B0suXsr1yOwc9cBBPf/G0TriKiDSj03bLNOb9/Pe5/NXLyeiZwf2n389BAw6KY+lERDqn\nQHXLNGbCsAl88pNPmHrAVE58/ESuf/N6SneVdnSxREQ6nS4V7gBJCUlcddxVLPnpEop3FjPuf8fx\nu0W/o6K6oqOLJiLSaXS5cI/I6pPFo997lHcufofFGxcz9n/H8vAnD1Mdqu7ooomIdLgu1ee+J59s\n/IQb37qRNaVruOXkW5h28DQSrMseu0REorrc2DL7wlur3+LGhTdSsL2AyWMmc/qY0zl11Kn07dF3\nn76viMi+onCv5ZwjrySPBXkLWLByAYvyF3FU1lGcPuZ0Th97OocMPEStehHpMhTuTaioruDtNW+z\nYOUCXlv5Glt3bWXisImcMPwEThh+AkdlHUVqUmq7l0tEpCUU7i20sWwji9Yv4r317/Fe/nt8veVr\njsw6konDJjI+ezzjs8czqPegji6miAigcG+zssoyPir4iEXrF/FhwYd8tOEj+vbo64N+qA/7AzMP\npE9qH3XniEi7U7jHSdiFySvO48MNH/qp4ENWlqykorqCXsm9SE9NrzcN7j2YYenDyE7PZljf2nn6\nMPqn9cesVf8eIiK7UbjvY2EXZkfVDrZXbo9O23Zto3BHIfnb8tmwfQP52/PJ3+6XIweDHkk9dpv2\n67Efo/qNYlS/UYzuNzq63CulV0d/TBHpZBTunczO6p3srNnJrppd9aad1Tsp3lnMmq1rWL11Nau2\nrmL11tWsKV1D39S+9EvrR2piKqlJqdF5j6QepCam1jtApCWl1S0np9EzuSdpSX7e2BTZpmdyT5IT\nkvWtQqSLULh3cWEXprCskNJdpVSGKqmsqdxt3vBAsatmFztrdkYPJBXVFbtNset3VvvlsAvTM7ln\no98qeiT1ICUxBYfDOUfYhaPLDkfvlN4M7TOU7PRsstOzo8tD+gyhR1KPetsC0VE8kxKSSEpIIjkx\nWecuRFpB4S4tVhOuoaK6otGDxa6aXVTWVJJgCZgZhtWbl1WWUVBWwIbtG9iwfUN0uWB7AdVhP/xD\n7GsiQi5Edaia6nA1hkWDPiUxhV7JveiV0mu3ediF6x2UIgeyqlAVg3oP8geYPtnRA012ejb90/pT\nE66hOlwdfb/I3DnX6GdKtET6pfVjQM8BDOw1kLTktBbXZdiFo/uvClVRHaqmJlxDemo6vVN66xuS\n7DWFu3QZkUCsCddQGaqkvKqc8ury6HxH1Q7Kq8pJSkiq1+UUWU5KSGLzjs3RA8yG7RvYUObnJTtL\nSE5IJjkxebe5YfW+WUTmoXCIkp0lFFUUUVReRFJCEgN7DWRArwGkp6azq2ZXo9+KdtXsIuzC0f2n\nJKaQnJBMUkIS2yq3EQqHyOyZyYBeA/y85wD69ehHUkISCZZAgiWQmJAYXQ67MFWhKiprKv085OdV\noSrMrP7niXnPSDddWnJatLsuLTmNUDjE5vLNFJYVsql8E5t2bPLLOzbRJ7UP4zLGMbb/2Oh8bMZY\nRu43kuTE5GjdhF04OlWHqpv8huicIyUxpdEp8k0t9oBfG1jRz9fw8yYnJJPRM4PMnplkpGU0+1uU\nmnANu2p2kWiJJCcmk2iJgTmwKtxF4sA5R1lVGUXlRXxT/g1lVWWNnstIS04jNTGVpISkJkOkorqC\nLRVb2FKxhaLyIrZUbGHrrq2EwiHCLkzIheqFp2GkJqWSkphCamLtPCmV5IRkHG63byLVIf9toWH3\nXORxgiUwuNdgBvf2U1afrOjytl3byCvJY0XxCvKK81hR4ufrt62PdsUZFj3wRA5EvZJ7NVoXCZZQ\nL6hjD1JNddUB0c8bmSKfuzJUSXFFMcU7i9lSsYUeST2iQR9yISqqK6KNgYrqCmrCNfRI6kEoHKI6\nXB096Ea+IaYmptIrxZe94TdEIPqtqypUVa+Owy5c70AX+zkSLZHEhMTd5nvqdkxLSqt775hy7L/f\n/kw/fHocUPBTAAAEvElEQVSjr1G4i8heC7swUNe11hk459heuZ3incUUVxTXO8hEwjElMaVeecMu\n7LvnakO6sqYyeiBo+E3RsHrfvCLLkW9YkYNcbFceQCgcIuRCu82byjmHY2f1zka/pWb0zOCa469p\n9HUKdxGRAAr8nZhERKRlFO4iIgGkcBcRCSCFu4hIACncRUQCSOEuIhJACncRkQBSuIuIBJDCXUQk\ngBTuIiIB1KJwN7PJZrbczFaY2fVNbHOfmeWZ2edm9u34FlNERFqj2XA3swTgfuC7wMHAj8zswAbb\nnA6Mds6NBWYAD+2DsgZKbm5uRxeh01Bd1FFd1FFd7J2WtNyPBfKcc+ucc9XAM8DUBttMBZ4AcM59\nBPQ1s0FxLWnA6A+3juqijuqijupi77Qk3IcC+TGPN9Su29M2BY1sIyIi7UQnVEVEAqjZ8dzNbDww\nxzk3ufbxDYBzzt0es81DwNvOuWdrHy8HTnLObW6wLw3mLiLSBq0dzz2pBdssBsaY2QigEDgX+FGD\nbeYBVwDP1h4MShsGe1sKJyIibdNsuDvnQmZ2JfAGvhvnMefcMjOb4Z92jzjn/m5mU8xsJVAOXLxv\niy0iInvSrrfZExGR9tFuJ1Rb8kOooDKzx8xss5ktiVnXz8zeMLOvzex1M+vbkWVsD2aWbWYLzWyp\nmX1hZlfVru+OdZFqZh+Z2We1dXFT7fpuVxcRZpZgZp+a2bzax92yLsxsrZn9q/Zv4+Pada2ui3YJ\n95b8ECrg/oz/7LFuAP7hnDsAWAjMavdStb8a4Brn3MHA8cAVtX8H3a4unHOVwMnOuSOAbwOnm9mx\ndMO6iHE18FXM4+5aF2Egxzl3hHPu2Np1ra6L9mq5t+SHUIHlnHsP2Npg9VRgbu3yXOD77VqoDuCc\n2+Sc+7x2eQewDMimG9YFgHOuonYxFX/+y9FN68LMsoEpwKMxq7tlXQDG7tnc6rpor3BvyQ+hupuB\nkSuKnHObgIEdXJ52ZWb741usHwKDumNd1HZDfAZsAt50zi2mm9YFcA9wHf4AF9Fd68IBb5rZYjO7\ntHZdq+uiJZdCSvvoNme2zaw38AJwtXNuRyO/f+gWdeGcCwNHmFk68DczO5jdP3vg68LM/h3Y7Jz7\n3Mxy9rBp4Oui1kTnXKGZDQDeMLOvacPfRXu13AuA4TGPs2vXdWebI+PvmNlg4JsOLk+7MLMkfLA/\n6Zx7uXZ1t6yLCOfcdiAXmEz3rIuJwPfMbDXwNPAdM3sS2NQN6wLnXGHtvAh4Cd+t3eq/i/YK9+gP\nocwsBf9DqHnt9N6dhdVOEfOAi2qXLwRebviCgPoT8JVz7vcx67pdXZhZZuSKBzNLA07Dn4PodnXh\nnLvROTfcOTcKnw0LnXPTgfl0s7ows56132wxs17AJOAL2vB30W7XuZvZZOD31P0Q6rZ2eeNOwMye\nAnKADGAzcBP+iPw8MAxYB0xzzpV2VBnbg5lNBN7B/7G62ulG4GPgObpXXRyKPzGWUDs965y71cz6\n083qIpaZnQT80jn3ve5YF2Y2Evgb/v9GEvBX59xtbakL/YhJRCSANCqkiEgAKdxFRAJI4S4iEkAK\ndxGRAFK4i4gEkMJdRCSAFO4iIgGkcBcRCaD/B1KE18k7VG+UAAAAAElFTkSuQmCC\n", 749 | "text/plain": [ 750 | "" 751 | ] 752 | }, 753 | "metadata": {}, 754 | "output_type": "display_data" 755 | } 756 | ], 757 | "source": [ 758 | "plt.plot(np.mean(ious, axis=0), label='Mean IOU') # between predicted and assigned true bboxes\n", 759 | "plt.plot(np.mean(dists, axis=0), label='Mean distance') # relative to image size\n", 760 | "plt.legend()\n", 761 | "plt.ylim(0, 1)" 762 | ] 763 | }, 764 | { 765 | "cell_type": "code", 766 | "execution_count": 11, 767 | "metadata": { 768 | "ExecuteTime": { 769 | "end_time": "2016-07-06T23:55:02.905000", 770 | "start_time": "2016-07-06T23:55:02.569000" 771 | } 772 | }, 773 | "outputs": [ 774 | { 775 | "data": { 776 | "text/plain": [ 777 | "((10000L, 2L, 4L), (10000L, 2L, 1L))" 778 | ] 779 | }, 780 | "execution_count": 11, 781 | "metadata": {}, 782 | "output_type": "execute_result" 783 | } 784 | ], 785 | "source": [ 786 | "pred_y = model.predict(test_X)\n", 787 | "pred_y = pred_y.reshape(len(pred_y), num_objects, -1)\n", 788 | "pred_bboxes = pred_y[..., :4] * img_size\n", 789 | "pred_shapes = pred_y[..., 4:5]\n", 790 | "pred_bboxes.shape, pred_shapes.shape" 791 | ] 792 | }, 793 | { 794 | "cell_type": "code", 795 | "execution_count": 31, 796 | "metadata": { 797 | "ExecuteTime": { 798 | "end_time": "2016-07-06T23:57:24.479000", 799 | "start_time": "2016-07-06T23:57:22.606000" 800 | } 801 | }, 802 | "outputs": [ 803 | { 804 | "data": { 805 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAADjCAYAAACfFKnTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGiBJREFUeJzt3W2spGd5H/D/dbxkC3F5jQgiFruQyk0VhVIUCA4JHgMR\nVqJAvlTCtCU4VT9ELSASEQj54OVL60SKaJQmH1AcF2jcNiEogNQ0rsUOEsUkgDF2wKFUttdO6G5E\nQhVFkbaYc/fDmV12j8/umZfneeaZM7+fdKSZOTPXfc8z85+Za56XqdZaAAAAYCg7654AAAAA20Uj\nCgAAwKA0ogAAAAxKIwoAAMCgNKIAAAAMSiMKAADAoA5tRKvqjqo6V1UP7Lv8rVX1UFU9WFW39zdF\n4GpkFMZNRmHcZBTW49gc17kzya8n+eCFC6pqkuQnk/xAa+2JqvqufqYHzEFGYdxkFMZNRmENDl0j\n2lr7VJJv7Lv4Z5Pc3lp7Ynadr/cwN2AOMgrjJqMwbjIK67HsPqLXJ3lVVX2mqk5X1Q92OSlgZTIK\n4yajMG4yCj2bZ9PcK93uWa21V1TVy5L8bpIXdTctYEUyCuMmozBuMgo9W7YRfTzJR5KktfbZqtqt\nque01v5q/xWrqq0yQTgqWms14HAyCguSURg3GYVxWzSj826aW7O/C/4gyauTpKquT/KUg4J5yaR6\n+7vttts2uv5RuA+W0eF/A5DRDR5D/fWPMQAZ3eAx1F//GAOQ0Q2tfxTuw6bXb225jB66RrSq7koy\nSfKcqnosyW1JfjvJnVX1YJLzSd681OjAymQUxk1GYdxkFNbj0Ea0tfamK/zrX3Q8F2AJMgrjJqMw\nbjIK67HsUXNHYzKZbHT9IcbY9PpDjDHEfdhWR+Gx2/T7sOn1hxpjW3l+qL8pY2yrTX9+HIXnn/r9\nqGW36Z17gKrW9xgwdlWVNuxBFuYmoyCjMHYyCuO2TEY3fo0oAAAAm0UjCgAAwKA0ogAAAAxKIwoA\nAMCgNKIAAAAMSiMKAADAoDSiAAAADEojCgAAwKA0ogAAAAxKIwoAAMCgNKIAAAAMSiMKAADAoDSi\nAAAADOrQRrSq7qiqc1X1wAH/+/mq2q2qZ/czPeAwMgrjJqMwbjIK6zHPGtE7k7xu/4VVdV2SH0ty\nputJAQuRURg3GYVxk1FYg0Mb0dbap5J844B/vS/JOzufEbAQGYVxk1EYNxmF9VhqH9Gqen2Sx1tr\nD3Y8H6ADMgrjJqMwbjIK/Tu26A2q6qlJ3pO9TRUuXtzZjICVyCiMm4zCuMkoDGPhRjTJ9yY5meSL\nVVVJrkvy+ap6eWvtLw+6walTpy6enkwmmUwmSwwLm2M6nWY6na5reBmFQ8gojJuMwrh1kdFqrR1+\npaqTST7eWvuBA/73SJKXttYO2rY+VdXmGQOOsqpKa623b1NlFFYjozBuMgrjtkxG5/n5lruSfDrJ\n9VX1WFXduu8qLTZXgLWRURg3GYVxk1FYj7nWiK40gG+JoPdvclchoyCjMHYyCuPWyxpRAAAA6JJG\nFAAAgEFpRAEAABiURhQAAIBBaUQBAAAY1LF1TwBgU9x778mcP39m3dMYnePHT+SGGx5d9zQAgA2i\nEQWY0/nzZzKZOET/ftPpKH9RAQAYMZvmAgAAMCiNKMAR11pb6G9nZ2ehPwCARfkEAQAAwKA0ogAA\nAAxKIwoAAMCgNKIAAAAMSiMKAADAoDSiAAAADEojCgAAwKAObUSr6o6qOldVD1xy2a9U1UNVdX9V\n/X5VPb3faQJXIqMwbjIK4yajsB7zrBG9M8nr9l12d5Lvb629JMlXk/xi1xMD5iajMG4yCuMmo7AG\nhzairbVPJfnGvsvuaa3tzs5+Jsl1PcwNmIOMwrjJKIybjMJ6dLGP6M8k+cMO6gD9kFEYNxmFcZNR\n6MGxVW5cVb+U5Juttbuudr1Tp05dPD2ZTDKZTFYZFkZvOp1mOp2uexoyekS11ha6/s6O49LtJ6Mw\nbjLKIu6992TOnz+z7mmM2vHjJ3LDDY92Vq+LjNY8H2iq6kSSj7fWXnzJZW9J8q+SvLq1dv4qt22L\nfmiCo6aq0lqrHuvL6ACm08pksv5lNbZG9PTpjGK5rEJGYdxklKsZy/vzshZ9/lxzzTULXX93d7f3\nZbRMRuddI1qzvwsD3ZzknUledbVgAoORURg3GYVxk1EY2Dw/33JXkk8nub6qHquqW5P8epJrk/yP\nqrqvqn6z53kCVyCjMG4yCuMmo7Aeh64Rba296YCL7+xhLsASZBTGTUZh3GQU1sMRLAAAABiURhQA\nAIBBaUQBAAAYlEYUAACAQWlEAQAAGJRGFAAAgEFpRAEAABjUob8jCkC/WmsLXX9nx3eIADBW3tfn\ns533GgAAgLXRiAIAADAojSgAAACD0ogCAAAwKI0oAAAAg9KIAgAAMCiNKAAAAIM6tBGtqjuq6lxV\nPXDJZc+qqrur6itV9UdV9Yx+pwlciYzCuMkojJuMwnrMs0b0ziSv23fZu5Pc01r7h0k+keQXu54Y\nMDcZhXGTURg3GYU1OLQRba19Ksk39l38hiQfmJ3+QJKf6nhewJxkFMZNRmHcZBTWY9l9RJ/bWjuX\nJK21s0me292UgA7IKIybjMK4ySj07FhHddrV/nnq1KmLpyeTSSaTSUfDwjhNp9NMp9N1T+NSMjqg\n1q66uJ9kZ8dx44YmozBuMsqYeF9/si4yWvMs2Ko6keTjrbUXz84/lGTSWjtXVc9Lcrq19o+ucNu2\n6IMHR01VpbVWPdaX0QFMp5XJ5PBltW1vWKdPZ67lMmYyCuMmo1zNvO/Py9r09/XWWu/LaJmMzruU\navZ3wceSvGV2+qeTfHSRQYHOySiMm4zCuMkoDGyen2+5K8mnk1xfVY9V1a1Jbk/yY1X1lSSvmZ0H\n1kBGYdxkFMZNRmE9Dt1HtLX2piv867UdzwVYgozCuMkojJuMwnqMawNmAAAAjjyNKAAAAIPSiAIA\nADAojSgAAACD0ogCAAAwKI0oAAAAg9KIAgAAMCiNKAAAAIM6tu4JAIxda+3A01eys+M7PgAYq3ne\nyy/lfb0flioAAACDskYUAAC6dvJkcubMumcxfidOJI8+uu5ZsAYaUQAA6NqZM8mCm4Bupap1z4A1\nsWkuAAAAg9KIAgAAMCib5gIAG+/ee0/m/Pnt2h/v+PETueGGR9c9DYClrNSIVtU7kvzLJLtJHkxy\na2vt/3UxMWB1MgrjJqPdOX/+TCaT7dofbzq1b13fZBT6s/SmuVX1/CRvTfLS1tqLs9fUvrGriQGr\nkVEYNxmFcZNR6Neqm+Zek+Q7q2o3ydOSfO3QWziU9fwczprVLZ5RYEgyCuMmo9CTpRvR1trXqupX\nkzyW5O+S3N1au+fQGzqU9fwczpoVLJ1RYBAyCuMmo9CvVTbNfWaSNyQ5keT5Sa6tqjd1NTFgNTIK\n4yajMG4yCv1aZdPc1yZ5uLX210lSVR9J8sNJ7tp/xbpkzd7pJDdt0Jq+WmKuu7u7C12/XWENcV3h\nfzs7fnXnMIs+bos+ZoeZTqeZTqed1lzC3Bk9derUxdOTySSTyWSYGW6IS59P8zy3un4+repKrzFX\ncs011/Q0k/HYtIwu817Ul3W/vq5D3xk6Csuoa0cho+0Kl2+bw5bBbp782XaZTCySU5+lV9dFRmvR\nF9eLN6x6eZI7krwsyfkkdyb5bGvtN/Zd77IBWvYarE2x1kZ0ZyftgFrCc7ixfVCqqrTWBn3qL5LR\nZV8Hts10WnMdlXNsy7PvD9GnT2fjj1Y69owOOa/DjO319YJ587mMsTaifd7nsdnEjG7aZ96+HNqI\ntpadfddZNBPTaeXGG+e/zbZ9lm6t9f56sUxGl34UWmt/kuTDSb6Q5IvZy9r7l60HdEtGYdxkFMZN\nRqFfKx01t7X23iTv7WguQMdkFMZNRmHcZBT6s+rPtwAAPRvVxpeLbno+z6a8fq4MYOtoRAEuce+9\nJ3P+/JV/63g6Pfp7/Jw+feX/nT2b3HLLcHNhz5iedb3sI+qALgBbRyO6xR5JcnLdk+hLH9/YJ761\n3wLnz5+54s78DlZ09SYVAGBeGtEtdjLj+pa9S70d1dG39lvt+PETW79G9KD/Hz9+or/JAABHkkYU\nYE433PDoXNc76mtEb7ppf/1Hl5gVALDNtutHdAAAAFg7jSgAAACD0ogCAAAwKPuIHmJs+3oxH48b\n67TowbIW1eU+n7Coo/D6uuh92NnxvT0sa5687b/OMq8zcrp5PGIAAAAMSiMKAADAoDSiAAAADEoj\nCgAAwKA0ogAAAAxKIwoAAMCgNKIAAAAMaqVGtKqeUVW/V1UPVdWXquqHupoYsDoZhXGTURg3GYX+\nHFvx9r+W5L+11v5pVR1L8rQO5gR0R0Zh3GQUxk1GoSdLN6JV9fQkP9pae0uStNaeSPI3Hc0LWJGM\nwrjJKIybjEK/Vtk094VJvl5Vd1bVfVX1/qp6alcTA1YmozBuMgrjJqPQo1U2zT2W5KVJ/nVr7XNV\n9e+TvDvJbVe70XSFAWFTTKfTTKfTdU9j7oyeOnXq4unJZJLJZDLQFEmS1tpC19/ZcZy5VW1aRrm6\nCxmaN0syNH4yut0Wzejp0z1NhCvqIqO16Aegizes+u4k97bWXjQ7/yNJ3tVa+8l917tsgJaklpvr\nxlh0mV7p+rWzk7a7+6TLu3oD3YbHYl5zP2ZVyRKZqaq01gZd3ItkdNnXgaNoOq1MJsMuj01qRE+f\nTm666fLLjsLzZ+wZHXJeXZvr+bHka+ulY3zykzu58cYnv2ceZGyN6LIZWsfr1bpsYkZ9zppPF8vp\noPcmvq211vvrxTIZXfqVuLV2LsnjVXX97KLXJPnysvWAbskojJuMwrjJKPRr1aPmvi3J71TVU5I8\nnOTW1acEdEhGYdxkFMZNRqEnKzWirbUvJnlZR3MBOiajMG4yCuMmo5vh7Fn7iV7NdFo5fvzEuqfx\nJKuuEQUAAFibW25Z9wzGbazHchjX3voAAAAceRpRAAAABqURBQAAYFAaUQAAAAalEQUAAGBQGlEA\nAAAG5edbADq26GHSd3Z8JwgXLPMzAzs7Ozl9WpbgqNjd3V33FBiAV2wAAAAGpREFAABgUBpRAAAA\nBqURBQAAYFAaUQAAAAalEQUAAGBQGlEAAAAGtXIjWlU7VXVfVX2siwkB3ZJRGDcZhXGTUehHF2tE\n357kyx3UAfohozBuMgrjJqPQg5Ua0aq6LsmPJ/mtbqYDdElGYdxkFMZNRqE/q64RfV+SdyZpHcwF\n6J6MwrjJKIybjEJPji17w6r6iSTnWmv3V9UkSc1zu+myA8IGmU6nmU6na53DIhk9derUxdOTySST\nyaTv6W2U1hb7/LGz4zhwY7dpGd1k8+SnLrme/JDI6LarsqjHrouM1qIfsC7esOrfJvnnSZ5I8tQk\nfz/JR1prb953vcsGaDn6KV50mV7p+rWzk7a7+6TLu3qT3obHYl5zP2ZVyRKZqaq01gZd3ItkdNnX\ngaNoOq1MJpcvD43ot50+ndx00+WXHYXnz9gzOuS8urZ7wPvYfpe+3y2bn4Oem5ti2Qwd9Hp1VG1i\nRn3Oms9By+kovK9sm2UyuvSnpdbae1prL2itvSjJG5N8Yn8wgfWRURg3GYVxk1Ho19H92h4AAIBR\nWnof0Uu11j6Z5JNd1AK6J6MwbjIK4yaj0D1rRAEAABiURhQAAIBBdbJpLgDAOp09u3fk3E00nS53\nbNXjx090PBOA4WhEAYCNd8st657B8vxUBbCNbJoLAADAoDSiAAAADEojCgAAwKAG2Ud0d3f322d2\ndi4/DzCgefbF2n+dnR3f2bFem/y+WTXfgXguXG+T7yvb68Dnrc+887GctpZPVwAAAAxq8KPmthMn\nUtYuXOZK3xW3Ew7LDgAAHD3D/3zLI4/kqB+kfN7NkC5w2HYAAGCb+B1RABi5I78lkS2AALaORhQA\nRq5t8IE8Ft1KCI4Ku6PNx65o20sjCgAAXduC3dFgFb6mAQAAYFBLN6JVdV1VfaKqvlRVD1bV27qc\nGLAaGYVxk1EYNxmFfq2yae4TSX6utXZ/VV2b5PNVdXdr7c86mhuwGhmFcZNRGDcZhR4tvUa0tXa2\ntXb/7PTfJnkoyfd0NTFgNTIK4yajMG4yCv3qZB/RqjqZ5CVJ/riLekC3ZBTGTUZh3GQUurdyIzrb\nVOHDSd4++7YIGBEZhXGTURg3GYV+rPTzLVV1LHvB/FBr7aNXut573/vei6cnk0kmk8kqw8LoTafT\nTKfTdU9j7oyeOnXq4ulNy2hrix0cf+eQ33Q7ffrw67D5Ni2j2/Q+6ndHSWQUxq6LjNaiH+Iuu3HV\nB5N8vbX2c1e5TltljG3Q9QfpucdN4u1+z9yPQVWyxPO5qtJaG3xxb0NG+2hEb7pplRkdbQctn01+\n/lwgozBuMgrjtkxGV/n5llcm+WdJXl1VX6iq+6rq5mXrAd2SURg3GYVxk1Ho19Kb5rbW/meSazqc\nC9AhGYVxk1EYNxmFfq20jyjAUXP27N7mpxzs7Nl1zwAAOApW2kd0rgFsN38o+4iu31HdR3Qem57R\ndeWHb9vk588FMgrjJqMwboPuIwoAAADLsGnuFns0e2tFyd6aznmcONHvPAAAYAtoRLfYC9c9gRGx\nSQ0AAAzHprkAAAAMSiMKAADAoDSiAAAADMo+oiNQ8x4oZ2Z3d7enmcDmkR8AgM1jjSgAAACD0ogC\nAAAwKI0oAAAAg9KIAgAAMCiNKAAAAIPSiAIAADColRrRqrq5qv6sqv5XVb2rq0kB3ZBRGDcZhXGT\nUejP0o1oVe0k+Q9JXpfk+5PcUlXf19XE5jWdTje6/hBjbHr9IcYY4j4MTUY3Zwz1xzHG0GR0c8ZQ\nfxxjDE1GN6P+EGOo349V1oi+PMlXW2tnWmvfTPJfkryhm2nN7yg8cJt+Hyyj0ZLRDRlD/XGMsQYy\nuiFjqD+OMdZARjeg/hBjqN+PVRrR70ny+CXn/3x2GTAOMgrjJqMwbjIKPXKwIgAAAAZVrbXlblj1\niiSnWms3z86/O0lrrf3yvustNwAcMa21GnI8GYXFyCiMm4zCuC2a0VUa0WuSfCXJa5L8nyR/kuSW\n1tpDSxUEOiWjMG4yCuMmo9CvY8vesLX2rar6N0nuzt4mvncIJoyHjMK4ySiMm4xCv5ZeIwoAAADL\n6O1gRX3/AHBVXVdVn6iqL1XVg1X1tq7HmI2zU1X3VdXHeqj9jKr6vap6aHY/fqjj+u+oqj+tqgeq\n6neq6js6qHlHVZ2rqgcuuexZVXV3VX2lqv6oqp7Rcf1fmS2j+6vq96vq6V3fh0v+9/NVtVtVz+66\nflW9dXY/Hqyq25et3xUZnau2jM5Xv7OM9p3Pq40hozJ6QH0ZnaP+Jf+T0e5qb3w+Z/VldL7625nR\n1lrnf9lrcP93khNJnpLk/iTf1/EYz0vyktnpa7O3DX+nY8xqvyPJf0rysR5q/8ckt85OH0vy9A5r\nPz/Jw0m+Y3b+vyZ5cwd1fyTJS5I8cMllv5zkF2an35Xk9o7rvzbJzuz07Un+Xdf3YXb5dUn+e5JH\nkjy74/swyd6mPcdm57+r6+fTgnOU0flqy+h89TvLaN/5vMp9kFEZ3V9bRuesP7tcRjvMz1HI56y+\njM5Xfysz2tca0d5/ALi1dra1dv/s9N8meSgd/7ZTVV2X5MeT/FaXdWe1n57kR1trdyZJa+2J1trf\ndDzMNUm+s6qOJXlakq+tWrC19qkk39h38RuSfGB2+gNJfqrL+q21e1pru7Ozn8lekJZ2hfuQJO9L\n8s5Val+l/s9m70Xridl1vr7qOCuS0cNry+ic9bvMaN/5vMoYMiqjB5HROerPyGiHGd30fM7qy+ic\n9bc1o301ooP+AHBVncxeV/7HHZe+8ID1sSPtC5N8varunG0S8f6qempXxVtrX0vyq0keS/IXSf5v\na+2erurv89zW2rnZuGeTPLencZLkZ5L8YddFq+r1SR5vrT3Yde2Z65O8qqo+U1Wnq+oHexpnXjJ6\nOBldTucZHSCfiYyejIxeRkbnJ6NJeszohuYzkdFlbU1Ge9tHdChVdW2SDyd5++wbo67q/kSSc7Nv\no2r216VjSV6a5Ddaay9N8ndJ3t1V8ap6Zva+vTmRvU0Xrq2qN3VV/xC9vKBV1S8l+WZr7a6O6z41\nyXuS3HbpxV2Okb3H+1mttVck+YUkv9tx/dGS0YPJ6Nw1h8hnIqMyuo+Mzl1TRnu0wflMZHRh25bR\nvhrRv0jygkvOXze7rFOz1fAfTvKh1tpHOy7/yiSvr6qHk/znJDdV1Qc7rP/n2ftm4nOz8x/OXli7\n8tokD7fW/rq19q0kH0nywx3Wv9S5qvruJKmq5yX5y64HqKq3ZG/zkT5eYL43yckkX6yqR7L3fP18\nVXX5bdfj2XsM0lr7bJLdqnpOh/UXJaOHk9EF9JjRIfKZyKiMPpmMzkdG93Se0Q3PZyKjC9nGjPbV\niH42yT+oqhO1d/SqNybp42hcv53ky621X+u6cGvtPa21F7TWXpS9+X+itfbmDuufS/J4VV0/u+g1\nSb7cVf3sbabwiqr6e1VVs/pd/fbV/m/OPpbkLbPTP51k1RfLy+pX1c3Z23Tk9a218yvWftIYrbU/\nba09r7X2otbaC7P3wvlPWmurvMjsX0Z/kOTVSTJ7zJ/SWvurFeqvSkYPry+jc9bvIaN95/OyMWZk\ntGMyelUyusAYM9uY0Y3N52wMGZ2z/tZmtPVwhKy2d6Skm7N3hK+vJnl3D/VfmeRb2TtK2ReS3Jfk\n5p7uy43p52h//zh7L2T3Z+8bhGd0XP+27AXygeztWP2UDmrelb0dwc9n7wXg1iTPSnLP7PG+O8kz\nO67/1SRnZo/xfUl+s+v7sO//D2e1o+YedB+OJflQkgeTfC7JjX08Vxecp4weXldG56vfWUb7zudV\n7oOMyuhB9WV0jvr7/i+j3dTe+HzOasvofPW3MqM1KwYAAACD2PiDFQEAALBZNKIAAAAMSiMKAADA\noDSiAAAADEojCgAAwKA0ogAAAAxKIwoAAMCgNKIAAAAM6v8DrtHlao+GyiwAAAAASUVORK5CYII=\n", 806 | "text/plain": [ 807 | "" 808 | ] 809 | }, 810 | "metadata": {}, 811 | "output_type": "display_data" 812 | } 813 | ], 814 | "source": [ 815 | "plt.figure(figsize=(16, 8))\n", 816 | "for i_subplot in range(1, 5):\n", 817 | " plt.subplot(1, 4, i_subplot)\n", 818 | " i = np.random.randint(len(test_X))\n", 819 | " plt.imshow(test_imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", 820 | " for pred_bbox, exp_bbox, pred_shape in zip(pred_bboxes[i], test_bboxes[i], pred_shapes[i]):\n", 821 | " plt.gca().add_patch(matplotlib.patches.Rectangle((pred_bbox[0], pred_bbox[1]), pred_bbox[2], pred_bbox[3], ec='r' if pred_shape[0] <= 0.5 else 'y', fc='none'))\n", 822 | " # TODO: Calculate max IOU with all expected bounding boxes.\n", 823 | "# plt.annotate('IOU: {:.2f}'.format(IOU(pred_bbox, exp_bbox)), (pred_bbox[0], pred_bbox[1]+pred_bbox[3]+0.4), color='r')\n", 824 | "\n", 825 | "# plt.savefig('plots/bw-two-rectangles-or-triangles4.png', dpi=300)" 826 | ] 827 | }, 828 | { 829 | "cell_type": "code", 830 | "execution_count": null, 831 | "metadata": { 832 | "collapsed": true 833 | }, 834 | "outputs": [], 835 | "source": [] 836 | } 837 | ], 838 | "metadata": { 839 | "kernelspec": { 840 | "display_name": "Python 2", 841 | "language": "python", 842 | "name": "python2" 843 | }, 844 | "language_info": { 845 | "codemirror_mode": { 846 | "name": "ipython", 847 | "version": 2 848 | }, 849 | "file_extension": ".py", 850 | "mimetype": "text/x-python", 851 | "name": "python", 852 | "nbconvert_exporter": "python", 853 | "pygments_lexer": "ipython2", 854 | "version": "2.7.14" 855 | }, 856 | "toc": { 857 | "nav_menu": {}, 858 | "number_sections": true, 859 | "sideBar": true, 860 | "skip_h1_title": false, 861 | "title_cell": "Table of Contents", 862 | "title_sidebar": "Contents", 863 | "toc_cell": false, 864 | "toc_position": {}, 865 | "toc_section_display": true, 866 | "toc_window_display": false 867 | } 868 | }, 869 | "nbformat": 4, 870 | "nbformat_minor": 1 871 | } 872 | -------------------------------------------------------------------------------- /two-rectangles.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2016-07-08T02:22:17.466000", 9 | "start_time": "2016-07-08T02:22:17.460000" 10 | }, 11 | "collapsed": true 12 | }, 13 | "outputs": [], 14 | "source": [ 15 | "import numpy as np\n", 16 | "import matplotlib.pyplot as plt\n", 17 | "import matplotlib\n", 18 | "%matplotlib inline" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 3, 24 | "metadata": { 25 | "ExecuteTime": { 26 | "end_time": "2016-07-08T02:22:20.062000", 27 | "start_time": "2016-07-08T02:22:17.976000" 28 | }, 29 | "collapsed": false 30 | }, 31 | "outputs": [ 32 | { 33 | "data": { 34 | "text/plain": [ 35 | "((50000L, 8L, 8L), (50000L, 2L, 4L))" 36 | ] 37 | }, 38 | "execution_count": 3, 39 | "metadata": {}, 40 | "output_type": "execute_result" 41 | } 42 | ], 43 | "source": [ 44 | "# Create images with random rectangles and bounding boxes. \n", 45 | "num_imgs = 50000\n", 46 | "\n", 47 | "img_size = 8\n", 48 | "min_rect_size = 1\n", 49 | "max_rect_size = 4\n", 50 | "num_objects = 2\n", 51 | "\n", 52 | "bboxes = np.zeros((num_imgs, num_objects, 4))\n", 53 | "imgs = np.zeros((num_imgs, img_size, img_size))\n", 54 | "\n", 55 | "for i_img in range(num_imgs):\n", 56 | " for i_object in range(num_objects):\n", 57 | " w, h = np.random.randint(min_rect_size, max_rect_size, size=2)\n", 58 | " x = np.random.randint(0, img_size - w)\n", 59 | " y = np.random.randint(0, img_size - h)\n", 60 | " imgs[i_img, x:x+w, y:y+h] = 1.\n", 61 | " bboxes[i_img, i_object] = [x, y, w, h]\n", 62 | " \n", 63 | "imgs.shape, bboxes.shape" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 4, 69 | "metadata": { 70 | "ExecuteTime": { 71 | "end_time": "2016-07-08T02:22:23.851000", 72 | "start_time": "2016-07-08T02:22:23.599000" 73 | }, 74 | "collapsed": false 75 | }, 76 | "outputs": [ 77 | { 78 | "data": { 79 | "image/png": "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\nrBcVAAAAAElFTkSuQmCC\n", 80 | "text/plain": [ 81 | "" 82 | ] 83 | }, 84 | "metadata": {}, 85 | "output_type": "display_data" 86 | } 87 | ], 88 | "source": [ 89 | "i = 0\n", 90 | "plt.imshow(imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", 91 | "for bbox in bboxes[i]:\n", 92 | " plt.gca().add_patch(matplotlib.patches.Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], ec='r', fc='none'))" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 5, 98 | "metadata": { 99 | "ExecuteTime": { 100 | "end_time": "2016-07-08T02:23:09.791000", 101 | "start_time": "2016-07-08T02:23:09.657000" 102 | }, 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "data": { 108 | "text/plain": [ 109 | "((50000L, 64L), 3.1477043194172438e-17, 1.0000000000000004)" 110 | ] 111 | }, 112 | "execution_count": 5, 113 | "metadata": {}, 114 | "output_type": "execute_result" 115 | } 116 | ], 117 | "source": [ 118 | "# Reshape and normalize the data to mean 0 and std 1. \n", 119 | "X = (imgs.reshape(num_imgs, -1) - np.mean(imgs)) / np.std(imgs)\n", 120 | "X.shape, np.mean(X), np.std(X)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": { 127 | "ExecuteTime": { 128 | "end_time": "2016-07-08T02:23:21.661000", 129 | "start_time": "2016-07-08T02:23:21.646000" 130 | }, 131 | "collapsed": false 132 | }, 133 | "outputs": [ 134 | { 135 | "data": { 136 | "text/plain": [ 137 | "((50000L, 8L), 0.28096500000000002, 0.17486042655500986)" 138 | ] 139 | }, 140 | "execution_count": 6, 141 | "metadata": {}, 142 | "output_type": "execute_result" 143 | } 144 | ], 145 | "source": [ 146 | "# Normalize x, y, w, h by img_size, so that all values are between 0 and 1.\n", 147 | "# Important: Do not shift to negative values (e.g. by setting to mean 0), because the IOU calculation needs positive w and h.\n", 148 | "y = bboxes.reshape(num_imgs, -1) / img_size\n", 149 | "y.shape, np.mean(y), np.std(y)" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 7, 155 | "metadata": { 156 | "ExecuteTime": { 157 | "end_time": "2016-07-08T02:23:45.972000", 158 | "start_time": "2016-07-08T02:23:45.966000" 159 | }, 160 | "collapsed": true 161 | }, 162 | "outputs": [], 163 | "source": [ 164 | "# Split training and test.\n", 165 | "i = int(0.8 * num_imgs)\n", 166 | "train_X = X[:i]\n", 167 | "test_X = X[i:]\n", 168 | "train_y = y[:i]\n", 169 | "test_y = y[i:]\n", 170 | "test_imgs = imgs[i:]\n", 171 | "test_bboxes = bboxes[i:]" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 8, 177 | "metadata": { 178 | "ExecuteTime": { 179 | "end_time": "2016-07-08T02:23:51.640000", 180 | "start_time": "2016-07-08T02:23:46.869000" 181 | }, 182 | "collapsed": false 183 | }, 184 | "outputs": [ 185 | { 186 | "name": "stderr", 187 | "output_type": "stream", 188 | "text": [ 189 | "Using Theano backend.\n" 190 | ] 191 | } 192 | ], 193 | "source": [ 194 | "# Build the model.\n", 195 | "from keras.models import Sequential\n", 196 | "from keras.layers import Dense, Activation, Dropout\n", 197 | "from keras.optimizers import SGD\n", 198 | "model = Sequential([\n", 199 | " Dense(256, input_dim=X.shape[-1]), \n", 200 | " Activation('relu'), \n", 201 | " Dropout(0.4), \n", 202 | " Dense(y.shape[-1])\n", 203 | " ])\n", 204 | "model.compile('adadelta', 'mse')" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 9, 210 | "metadata": { 211 | "ExecuteTime": { 212 | "end_time": "2016-07-08T02:33:22.619000", 213 | "start_time": "2016-07-08T02:27:43.964000" 214 | }, 215 | "code_folding": [ 216 | 3, 217 | 18 218 | ], 219 | "collapsed": false, 220 | "scrolled": true 221 | }, 222 | "outputs": [ 223 | { 224 | "name": "stdout", 225 | "output_type": "stream", 226 | "text": [ 227 | "Epoch 0\n", 228 | "Train on 40000 samples, validate on 10000 samples\n", 229 | "Epoch 1/1\n", 230 | "2s - loss: 0.0891 - val_loss: 0.0198\n", 231 | "Flipped 19332.0 training samples (48.33 %)\n", 232 | "Mean IOU: 0.17421432926\n", 233 | "Mean dist: 0.202194946413\n", 234 | "Mean mse: 0.00870554196174\n", 235 | "\n", 236 | "Epoch 1\n", 237 | "Train on 40000 samples, validate on 10000 samples\n", 238 | "Epoch 1/1\n", 239 | "2s - loss: 0.0188 - val_loss: 0.0188\n", 240 | "Flipped 7403.0 training samples (18.5075 %)\n", 241 | "Mean IOU: 0.201610919572\n", 242 | "Mean dist: 0.179289382942\n", 243 | "Mean mse: 0.00696734712723\n", 244 | "\n", 245 | "Epoch 2\n", 246 | "Train on 40000 samples, validate on 10000 samples\n", 247 | "Epoch 1/1\n", 248 | "2s - loss: 0.0150 - val_loss: 0.0204\n", 249 | "Flipped 4240.0 training samples (10.6 %)\n", 250 | "Mean IOU: 0.251106918999\n", 251 | "Mean dist: 0.153800096666\n", 252 | "Mean mse: 0.00559663701382\n", 253 | "\n", 254 | "Epoch 3\n", 255 | "Train on 40000 samples, validate on 10000 samples\n", 256 | "Epoch 1/1\n", 257 | "3s - loss: 0.0130 - val_loss: 0.0212\n", 258 | "Flipped 2280.0 training samples (5.7 %)\n", 259 | "Mean IOU: 0.277501980239\n", 260 | "Mean dist: 0.141010581968\n", 261 | "Mean mse: 0.00496034980357\n", 262 | "\n", 263 | "Epoch 4\n", 264 | "Train on 40000 samples, validate on 10000 samples\n", 265 | "Epoch 1/1\n", 266 | "2s - loss: 0.0119 - val_loss: 0.0217\n", 267 | "Flipped 1812.0 training samples (4.53 %)\n", 268 | "Mean IOU: 0.299665635151\n", 269 | "Mean dist: 0.131943238998\n", 270 | "Mean mse: 0.00453679827365\n", 271 | "\n", 272 | "Epoch 5\n", 273 | "Train on 40000 samples, validate on 10000 samples\n", 274 | "Epoch 1/1\n", 275 | "2s - loss: 0.0111 - val_loss: 0.0220\n", 276 | "Flipped 1437.0 training samples (3.5925 %)\n", 277 | "Mean IOU: 0.31418044106\n", 278 | "Mean dist: 0.125220445092\n", 279 | "Mean mse: 0.00419997932865\n", 280 | "\n", 281 | "Epoch 6\n", 282 | "Train on 40000 samples, validate on 10000 samples\n", 283 | "Epoch 1/1\n", 284 | "2s - loss: 0.0105 - val_loss: 0.0225\n", 285 | "Flipped 1526.0 training samples (3.815 %)\n", 286 | "Mean IOU: 0.331142524788\n", 287 | "Mean dist: 0.118991890303\n", 288 | "Mean mse: 0.00392323951083\n", 289 | "\n", 290 | "Epoch 7\n", 291 | "Train on 40000 samples, validate on 10000 samples\n", 292 | "Epoch 1/1\n", 293 | "2s - loss: 0.0100 - val_loss: 0.0228\n", 294 | "Flipped 1172.0 training samples (2.93 %)\n", 295 | "Mean IOU: 0.34543661596\n", 296 | "Mean dist: 0.113598305609\n", 297 | "Mean mse: 0.00367849045312\n", 298 | "\n", 299 | "Epoch 8\n", 300 | "Train on 40000 samples, validate on 10000 samples\n", 301 | "Epoch 1/1\n", 302 | "2s - loss: 0.0096 - val_loss: 0.0229\n", 303 | "Flipped 988.0 training samples (2.47 %)\n", 304 | "Mean IOU: 0.356540425907\n", 305 | "Mean dist: 0.109198101651\n", 306 | "Mean mse: 0.00348902813688\n", 307 | "\n", 308 | "Epoch 9\n", 309 | "Train on 40000 samples, validate on 10000 samples\n", 310 | "Epoch 1/1\n", 311 | "2s - loss: 0.0092 - val_loss: 0.0229\n", 312 | "Flipped 1041.0 training samples (2.6025 %)\n", 313 | "Mean IOU: 0.364558090872\n", 314 | "Mean dist: 0.106299435695\n", 315 | "Mean mse: 0.0033265020771\n", 316 | "\n", 317 | "Epoch 10\n", 318 | "Train on 40000 samples, validate on 10000 samples\n", 319 | "Epoch 1/1\n", 320 | "2s - loss: 0.0089 - val_loss: 0.0232\n", 321 | "Flipped 697.0 training samples (1.7425 %)\n", 322 | "Mean IOU: 0.374192726269\n", 323 | "Mean dist: 0.102362562652\n", 324 | "Mean mse: 0.00317120671055\n", 325 | "\n", 326 | "Epoch 11\n", 327 | "Train on 40000 samples, validate on 10000 samples\n", 328 | "Epoch 1/1\n", 329 | "2s - loss: 0.0086 - val_loss: 0.0233\n", 330 | "Flipped 821.0 training samples (2.0525 %)\n", 331 | "Mean IOU: 0.381939290872\n", 332 | "Mean dist: 0.0995234924274\n", 333 | "Mean mse: 0.00304664076566\n", 334 | "\n", 335 | "Epoch 12\n", 336 | "Train on 40000 samples, validate on 10000 samples\n", 337 | "Epoch 1/1\n", 338 | "2s - loss: 0.0083 - val_loss: 0.0235\n", 339 | "Flipped 639.0 training samples (1.5975 %)\n", 340 | "Mean IOU: 0.389027211857\n", 341 | "Mean dist: 0.0974743195474\n", 342 | "Mean mse: 0.00293538438011\n", 343 | "\n", 344 | "Epoch 13\n", 345 | "Train on 40000 samples, validate on 10000 samples\n", 346 | "Epoch 1/1\n", 347 | "2s - loss: 0.0082 - val_loss: 0.0235\n", 348 | "Flipped 678.0 training samples (1.695 %)\n", 349 | "Mean IOU: 0.399173566656\n", 350 | "Mean dist: 0.0949032411027\n", 351 | "Mean mse: 0.00282684413067\n", 352 | "\n", 353 | "Epoch 14\n", 354 | "Train on 40000 samples, validate on 10000 samples\n", 355 | "Epoch 1/1\n", 356 | "2s - loss: 0.0080 - val_loss: 0.0236\n", 357 | "Flipped 618.0 training samples (1.545 %)\n", 358 | "Mean IOU: 0.403507223408\n", 359 | "Mean dist: 0.0929981797996\n", 360 | "Mean mse: 0.00273148774462\n", 361 | "\n", 362 | "Epoch 15\n", 363 | "Train on 40000 samples, validate on 10000 samples\n", 364 | "Epoch 1/1\n", 365 | "2s - loss: 0.0078 - val_loss: 0.0239\n", 366 | "Flipped 750.0 training samples (1.875 %)\n", 367 | "Mean IOU: 0.410588897039\n", 368 | "Mean dist: 0.0908761495889\n", 369 | "Mean mse: 0.0026544331145\n", 370 | "\n", 371 | "Epoch 16\n", 372 | "Train on 40000 samples, validate on 10000 samples\n", 373 | "Epoch 1/1\n", 374 | "2s - loss: 0.0076 - val_loss: 0.0241\n", 375 | "Flipped 686.0 training samples (1.715 %)\n", 376 | "Mean IOU: 0.418996945724\n", 377 | "Mean dist: 0.0888948065314\n", 378 | "Mean mse: 0.0025722494028\n", 379 | "\n", 380 | "Epoch 17\n", 381 | "Train on 40000 samples, validate on 10000 samples\n", 382 | "Epoch 1/1\n", 383 | "2s - loss: 0.0075 - val_loss: 0.0238\n", 384 | "Flipped 581.0 training samples (1.4525 %)\n", 385 | "Mean IOU: 0.424184888081\n", 386 | "Mean dist: 0.0873501393816\n", 387 | "Mean mse: 0.00251163484627\n", 388 | "\n", 389 | "Epoch 18\n", 390 | "Train on 40000 samples, validate on 10000 samples\n", 391 | "Epoch 1/1\n", 392 | "2s - loss: 0.0073 - val_loss: 0.0239\n", 393 | "Flipped 571.0 training samples (1.4275 %)\n", 394 | "Mean IOU: 0.430039911385\n", 395 | "Mean dist: 0.0856274159229\n", 396 | "Mean mse: 0.00243802334432\n", 397 | "\n", 398 | "Epoch 19\n", 399 | "Train on 40000 samples, validate on 10000 samples\n", 400 | "Epoch 1/1\n", 401 | "2s - loss: 0.0072 - val_loss: 0.0239\n", 402 | "Flipped 452.0 training samples (1.13 %)\n", 403 | "Mean IOU: 0.433272926262\n", 404 | "Mean dist: 0.0845405565164\n", 405 | "Mean mse: 0.00238937732887\n", 406 | "\n", 407 | "Epoch 20\n", 408 | "Train on 40000 samples, validate on 10000 samples\n", 409 | "Epoch 1/1\n", 410 | "2s - loss: 0.0071 - val_loss: 0.0243\n", 411 | "Flipped 403.0 training samples (1.0075 %)\n", 412 | "Mean IOU: 0.442589569635\n", 413 | "Mean dist: 0.081736119599\n", 414 | "Mean mse: 0.002300822613\n", 415 | "\n", 416 | "Epoch 21\n", 417 | "Train on 40000 samples, validate on 10000 samples\n", 418 | "Epoch 1/1\n", 419 | "3s - loss: 0.0070 - val_loss: 0.0243\n", 420 | "Flipped 426.0 training samples (1.065 %)\n", 421 | "Mean IOU: 0.437372472621\n", 422 | "Mean dist: 0.0825716755323\n", 423 | "Mean mse: 0.00229706401744\n", 424 | "\n", 425 | "Epoch 22\n", 426 | "Train on 40000 samples, validate on 10000 samples\n", 427 | "Epoch 1/1\n", 428 | "2s - loss: 0.0069 - val_loss: 0.0242\n", 429 | "Flipped 322.0 training samples (0.805 %)\n", 430 | "Mean IOU: 0.447041620476\n", 431 | "Mean dist: 0.0808203517427\n", 432 | "Mean mse: 0.00223702435172\n", 433 | "\n", 434 | "Epoch 23\n", 435 | "Train on 40000 samples, validate on 10000 samples\n", 436 | "Epoch 1/1\n", 437 | "2s - loss: 0.0069 - val_loss: 0.0241\n", 438 | "Flipped 323.0 training samples (0.8075 %)\n", 439 | "Mean IOU: 0.444742584252\n", 440 | "Mean dist: 0.0812139063405\n", 441 | "Mean mse: 0.00224665052732\n", 442 | "\n", 443 | "Epoch 24\n", 444 | "Train on 40000 samples, validate on 10000 samples\n", 445 | "Epoch 1/1\n", 446 | "2s - loss: 0.0068 - val_loss: 0.0243\n", 447 | "Flipped 403.0 training samples (1.0075 %)\n", 448 | "Mean IOU: 0.453926726631\n", 449 | "Mean dist: 0.078654691172\n", 450 | "Mean mse: 0.00216548576696\n", 451 | "\n", 452 | "Epoch 25\n", 453 | "Train on 40000 samples, validate on 10000 samples\n", 454 | "Epoch 1/1\n", 455 | "2s - loss: 0.0067 - val_loss: 0.0241\n", 456 | "Flipped 318.0 training samples (0.795 %)\n", 457 | "Mean IOU: 0.454372876255\n", 458 | "Mean dist: 0.0789630339262\n", 459 | "Mean mse: 0.00215756388899\n", 460 | "\n", 461 | "Epoch 26\n", 462 | "Train on 40000 samples, validate on 10000 samples\n", 463 | "Epoch 1/1\n", 464 | "2s - loss: 0.0066 - val_loss: 0.0242\n", 465 | "Flipped 384.0 training samples (0.96 %)\n", 466 | "Mean IOU: 0.455093751177\n", 467 | "Mean dist: 0.0784194052206\n", 468 | "Mean mse: 0.00213678858996\n", 469 | "\n", 470 | "Epoch 27\n", 471 | "Train on 40000 samples, validate on 10000 samples\n", 472 | "Epoch 1/1\n", 473 | "2s - loss: 0.0066 - val_loss: 0.0245\n", 474 | "Flipped 319.0 training samples (0.7975 %)\n", 475 | "Mean IOU: 0.457610800536\n", 476 | "Mean dist: 0.0772177815774\n", 477 | "Mean mse: 0.0021002412861\n", 478 | "\n", 479 | "Epoch 28\n", 480 | "Train on 40000 samples, validate on 10000 samples\n", 481 | "Epoch 1/1\n", 482 | "2s - loss: 0.0065 - val_loss: 0.0245\n", 483 | "Flipped 363.0 training samples (0.9075 %)\n", 484 | "Mean IOU: 0.463026173604\n", 485 | "Mean dist: 0.0760770275642\n", 486 | "Mean mse: 0.00206011307056\n", 487 | "\n", 488 | "Epoch 29\n", 489 | "Train on 40000 samples, validate on 10000 samples\n", 490 | "Epoch 1/1\n", 491 | "2s - loss: 0.0065 - val_loss: 0.0242\n", 492 | "Flipped 335.0 training samples (0.8375 %)\n", 493 | "Mean IOU: 0.460029429252\n", 494 | "Mean dist: 0.0773609536022\n", 495 | "Mean mse: 0.00208323971074\n", 496 | "\n", 497 | "Epoch 30\n", 498 | "Train on 40000 samples, validate on 10000 samples\n", 499 | "Epoch 1/1\n", 500 | "2s - loss: 0.0064 - val_loss: 0.0245\n", 501 | "Flipped 234.0 training samples (0.585 %)\n", 502 | "Mean IOU: 0.46961803655\n", 503 | "Mean dist: 0.0749676349377\n", 504 | "Mean mse: 0.00203222502343\n", 505 | "\n", 506 | "Epoch 31\n", 507 | "Train on 40000 samples, validate on 10000 samples\n", 508 | "Epoch 1/1\n", 509 | "2s - loss: 0.0064 - val_loss: 0.0247\n", 510 | "Flipped 387.0 training samples (0.9675 %)\n", 511 | "Mean IOU: 0.470608679921\n", 512 | "Mean dist: 0.0740146431432\n", 513 | "Mean mse: 0.00199135766526\n", 514 | "\n", 515 | "Epoch 32\n", 516 | "Train on 40000 samples, validate on 10000 samples\n", 517 | "Epoch 1/1\n", 518 | "2s - loss: 0.0063 - val_loss: 0.0245\n", 519 | "Flipped 282.0 training samples (0.705 %)\n", 520 | "Mean IOU: 0.470118171211\n", 521 | "Mean dist: 0.0738592915286\n", 522 | "Mean mse: 0.00197842837846\n", 523 | "\n", 524 | "Epoch 33\n", 525 | "Train on 40000 samples, validate on 10000 samples\n", 526 | "Epoch 1/1\n", 527 | "2s - loss: 0.0063 - val_loss: 0.0245\n", 528 | "Flipped 293.0 training samples (0.7325 %)\n", 529 | "Mean IOU: 0.474404012902\n", 530 | "Mean dist: 0.0735462556776\n", 531 | "Mean mse: 0.001959014029\n", 532 | "\n", 533 | "Epoch 34\n", 534 | "Train on 40000 samples, validate on 10000 samples\n", 535 | "Epoch 1/1\n", 536 | "2s - loss: 0.0063 - val_loss: 0.0247\n", 537 | "Flipped 273.0 training samples (0.6825 %)\n", 538 | "Mean IOU: 0.47574437323\n", 539 | "Mean dist: 0.0728054629133\n", 540 | "Mean mse: 0.00194009840461\n", 541 | "\n", 542 | "Epoch 35\n", 543 | "Train on 40000 samples, validate on 10000 samples\n", 544 | "Epoch 1/1\n", 545 | "3s - loss: 0.0062 - val_loss: 0.0245\n", 546 | "Flipped 285.0 training samples (0.7125 %)\n", 547 | "Mean IOU: 0.477151418694\n", 548 | "Mean dist: 0.0726782049133\n", 549 | "Mean mse: 0.00192376103654\n", 550 | "\n", 551 | "Epoch 36\n", 552 | "Train on 40000 samples, validate on 10000 samples\n", 553 | "Epoch 1/1\n", 554 | "2s - loss: 0.0061 - val_loss: 0.0247\n", 555 | "Flipped 280.0 training samples (0.7 %)\n", 556 | "Mean IOU: 0.478953860581\n", 557 | "Mean dist: 0.0720496281562\n", 558 | "Mean mse: 0.00189495957262\n", 559 | "\n", 560 | "Epoch 37\n", 561 | "Train on 40000 samples, validate on 10000 samples\n", 562 | "Epoch 1/1\n", 563 | "2s - loss: 0.0061 - val_loss: 0.0249\n", 564 | "Flipped 238.0 training samples (0.595 %)\n", 565 | "Mean IOU: 0.485612802479\n", 566 | "Mean dist: 0.0705254064983\n", 567 | "Mean mse: 0.00185026440083\n", 568 | "\n", 569 | "Epoch 38\n", 570 | "Train on 40000 samples, validate on 10000 samples\n", 571 | "Epoch 1/1\n", 572 | "2s - loss: 0.0061 - val_loss: 0.0245\n", 573 | "Flipped 220.0 training samples (0.55 %)\n", 574 | "Mean IOU: 0.477454585999\n", 575 | "Mean dist: 0.0719046474651\n", 576 | "Mean mse: 0.00188276242328\n", 577 | "\n", 578 | "Epoch 39\n", 579 | "Train on 40000 samples, validate on 10000 samples\n", 580 | "Epoch 1/1\n", 581 | "2s - loss: 0.0061 - val_loss: 0.0247\n", 582 | "Flipped 235.0 training samples (0.5875 %)\n", 583 | "Mean IOU: 0.481772569811\n", 584 | "Mean dist: 0.0713024149384\n", 585 | "Mean mse: 0.00187054984367\n", 586 | "\n", 587 | "Epoch 40\n", 588 | "Train on 40000 samples, validate on 10000 samples\n", 589 | "Epoch 1/1\n", 590 | "2s - loss: 0.0061 - val_loss: 0.0248\n", 591 | "Flipped 264.0 training samples (0.66 %)\n", 592 | "Mean IOU: 0.483492848349\n", 593 | "Mean dist: 0.0707738993554\n", 594 | "Mean mse: 0.00184634708223\n", 595 | "\n", 596 | "Epoch 41\n", 597 | "Train on 40000 samples, validate on 10000 samples\n", 598 | "Epoch 1/1\n", 599 | "2s - loss: 0.0061 - val_loss: 0.0249\n", 600 | "Flipped 253.0 training samples (0.6325 %)\n", 601 | "Mean IOU: 0.481306290104\n", 602 | "Mean dist: 0.0707721782897\n", 603 | "Mean mse: 0.00184881686819\n", 604 | "\n", 605 | "Epoch 42\n", 606 | "Train on 40000 samples, validate on 10000 samples\n", 607 | "Epoch 1/1\n", 608 | "2s - loss: 0.0061 - val_loss: 0.0247\n", 609 | "Flipped 259.0 training samples (0.6475 %)\n", 610 | "Mean IOU: 0.484973269763\n", 611 | "Mean dist: 0.0702191452585\n", 612 | "Mean mse: 0.00181671099039\n", 613 | "\n", 614 | "Epoch 43\n", 615 | "Train on 40000 samples, validate on 10000 samples\n", 616 | "Epoch 1/1\n", 617 | "3s - loss: 0.0060 - val_loss: 0.0247\n", 618 | "Flipped 226.0 training samples (0.565 %)\n", 619 | "Mean IOU: 0.485699224635\n", 620 | "Mean dist: 0.0705432710211\n", 621 | "Mean mse: 0.00182664435223\n", 622 | "\n", 623 | "Epoch 44\n", 624 | "Train on 40000 samples, validate on 10000 samples\n", 625 | "Epoch 1/1\n", 626 | "2s - loss: 0.0060 - val_loss: 0.0245\n", 627 | "Flipped 242.0 training samples (0.605 %)\n", 628 | "Mean IOU: 0.486526667704\n", 629 | "Mean dist: 0.0702527203698\n", 630 | "Mean mse: 0.00181987211074\n", 631 | "\n", 632 | "Epoch 45\n", 633 | "Train on 40000 samples, validate on 10000 samples\n", 634 | "Epoch 1/1\n", 635 | "2s - loss: 0.0060 - val_loss: 0.0250\n", 636 | "Flipped 218.0 training samples (0.545 %)\n", 637 | "Mean IOU: 0.490067178897\n", 638 | "Mean dist: 0.0689831817917\n", 639 | "Mean mse: 0.00179033876822\n", 640 | "\n", 641 | "Epoch 46\n", 642 | "Train on 40000 samples, validate on 10000 samples\n", 643 | "Epoch 1/1\n", 644 | "2s - loss: 0.0059 - val_loss: 0.0248\n", 645 | "Flipped 245.0 training samples (0.6125 %)\n", 646 | "Mean IOU: 0.491345980976\n", 647 | "Mean dist: 0.0687047519983\n", 648 | "Mean mse: 0.00177435903349\n", 649 | "\n", 650 | "Epoch 47\n", 651 | "Train on 40000 samples, validate on 10000 samples\n", 652 | "Epoch 1/1\n", 653 | "2s - loss: 0.0059 - val_loss: 0.0247\n", 654 | "Flipped 239.0 training samples (0.5975 %)\n", 655 | "Mean IOU: 0.489264187585\n", 656 | "Mean dist: 0.0694518844395\n", 657 | "Mean mse: 0.0017843305106\n", 658 | "\n", 659 | "Epoch 48\n", 660 | "Train on 40000 samples, validate on 10000 samples\n", 661 | "Epoch 1/1\n", 662 | "2s - loss: 0.0059 - val_loss: 0.0248\n", 663 | "Flipped 266.0 training samples (0.665 %)\n", 664 | "Mean IOU: 0.488129088089\n", 665 | "Mean dist: 0.0695082726052\n", 666 | "Mean mse: 0.00178704787256\n", 667 | "\n", 668 | "Epoch 49\n", 669 | "Train on 40000 samples, validate on 10000 samples\n", 670 | "Epoch 1/1\n", 671 | "2s - loss: 0.0059 - val_loss: 0.0248\n", 672 | "Flipped 197.0 training samples (0.4925 %)\n", 673 | "Mean IOU: 0.487095655783\n", 674 | "Mean dist: 0.0694985856093\n", 675 | "Mean mse: 0.00177344207584\n", 676 | "\n" 677 | ] 678 | } 679 | ], 680 | "source": [ 681 | "# Flip bboxes during training.\n", 682 | "# Note: The validation loss is always quite big here because we don't flip the bounding boxes for the validation data. \n", 683 | "def IOU(bbox1, bbox2):\n", 684 | " '''Calculate overlap between two bounding boxes [x, y, w, h] as the area of intersection over the area of unity'''\n", 685 | " x1, y1, w1, h1 = bbox1[0], bbox1[1], bbox1[2], bbox1[3]\n", 686 | " x2, y2, w2, h2 = bbox2[0], bbox2[1], bbox2[2], bbox2[3]\n", 687 | "\n", 688 | " w_I = min(x1 + w1, x2 + w2) - max(x1, x2)\n", 689 | " h_I = min(y1 + h1, y2 + h2) - max(y1, y2)\n", 690 | " if w_I <= 0 or h_I <= 0: # no overlap\n", 691 | " return 0\n", 692 | " I = w_I * h_I\n", 693 | "\n", 694 | " U = w1 * h1 + w2 * h2 - I\n", 695 | "\n", 696 | " return I / U\n", 697 | "\n", 698 | "def distance(bbox1, bbox2):\n", 699 | " return np.sqrt(np.sum(np.square(bbox1[:2] - bbox2[:2])))\n", 700 | "\n", 701 | "num_epochs = 50\n", 702 | "flipped_train_y = np.array(train_y)\n", 703 | "flipped = np.zeros((len(flipped_train_y), num_epochs))\n", 704 | "ious_epoch = np.zeros((len(flipped_train_y), num_epochs))\n", 705 | "dists_epoch = np.zeros((len(flipped_train_y), num_epochs))\n", 706 | "mses_epoch = np.zeros((len(flipped_train_y), num_epochs))\n", 707 | "\n", 708 | "for epoch in range(num_epochs):\n", 709 | " print 'Epoch', epoch\n", 710 | " model.fit(train_X, flipped_train_y, nb_epoch=1, validation_data=(test_X, test_y), verbose=2)\n", 711 | " pred_y = model.predict(train_X)\n", 712 | "\n", 713 | " for i, (pred_bboxes, exp_bboxes) in enumerate(zip(pred_y, flipped_train_y)):\n", 714 | " \n", 715 | " flipped_exp_bboxes = np.concatenate([exp_bboxes[4:], exp_bboxes[:4]])\n", 716 | " \n", 717 | " mse = np.mean(np.square(pred_bboxes - exp_bboxes))\n", 718 | " mse_flipped = np.mean(np.square(pred_bboxes - flipped_exp_bboxes))\n", 719 | " \n", 720 | " iou = IOU(pred_bboxes[:4], exp_bboxes[:4]) + IOU(pred_bboxes[4:], exp_bboxes[4:])\n", 721 | " iou_flipped = IOU(pred_bboxes[:4], flipped_exp_bboxes[:4]) + IOU(pred_bboxes[4:], flipped_exp_bboxes[4:])\n", 722 | " \n", 723 | " dist = distance(pred_bboxes[:4], exp_bboxes[:4]) + distance(pred_bboxes[4:], exp_bboxes[4:])\n", 724 | " dist_flipped = distance(pred_bboxes[:4], flipped_exp_bboxes[:4]) + distance(pred_bboxes[4:], flipped_exp_bboxes[4:])\n", 725 | " \n", 726 | " if mse_flipped < mse: # you can also use iou or dist here\n", 727 | " flipped_train_y[i] = flipped_exp_bboxes\n", 728 | " flipped[i, epoch] = 1\n", 729 | " mses_epoch[i, epoch] = mse_flipped / 2.\n", 730 | " ious_epoch[i, epoch] = iou_flipped / 2.\n", 731 | " dists_epoch[i, epoch] = dist_flipped / 2.\n", 732 | " else:\n", 733 | " mses_epoch[i, epoch] = mse / 2.\n", 734 | " ious_epoch[i, epoch] = iou / 2.\n", 735 | " dists_epoch[i, epoch] = dist / 2.\n", 736 | " \n", 737 | " print 'Flipped {} training samples ({} %)'.format(np.sum(flipped[:, epoch]), np.mean(flipped[:, epoch]) * 100.)\n", 738 | " print 'Mean IOU: {}'.format(np.mean(ious_epoch[:, epoch]))\n", 739 | " print 'Mean dist: {}'.format(np.mean(dists_epoch[:, epoch]))\n", 740 | " print 'Mean mse: {}'.format(np.mean(mses_epoch[:, epoch]))\n", 741 | " print" 742 | ] 743 | }, 744 | { 745 | "cell_type": "code", 746 | "execution_count": 10, 747 | "metadata": { 748 | "ExecuteTime": { 749 | "end_time": "2016-07-08T02:38:08.340000", 750 | "start_time": "2016-07-08T02:38:07.482000" 751 | }, 752 | "collapsed": false 753 | }, 754 | "outputs": [ 755 | { 756 | "data": { 757 | "text/plain": [ 758 | "" 759 | ] 760 | }, 761 | "execution_count": 10, 762 | "metadata": {}, 763 | "output_type": "execute_result" 764 | }, 765 | { 766 | "data": { 767 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEPCAYAAAC3NDh4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGZ9JREFUeJzt3X/wbHV93/HnizDir0JBgdvhKuhA/IESMOONHTLN19gg\nph1w6tRfbUajmWZqjbbGRGDauZhpo2QmZtRqp1Z00IJIbAwwNfKj9DtRG8EIV1Bu6G3jJUjuvVBR\nCbUx/Hj3jz1f7vrlu9+7Z++e3T3ffT5mdu75fnb37Hs/d/e8z+fX2VQVkiRt5Ih5ByBJWlwmCUnS\nSCYJSdJIJglJ0kgmCUnSSCYJSdJInSaJJEcluTnJbUnuSLKzKT82yfVJ7kpyXZJjhp5zYZI9SXYn\nOafL+CRJm0vX6ySSPLWqfpjkJ4CvAO8AXgN8t6p+J8l7gGOr6oIkLwQuB14KbAduBE4rF3NI0lx0\n3t1UVT9sNo8CjgQKOB+4rCm/DHh1s30ecGVVPVJVe4E9wI6uY5QkbazzJJHkiCS3AfuBG6rqa8CJ\nVXUAoKr2Ayc0Dz8JuGfo6fc2ZZKkOZhFS+KxqjqLQffRjiSnM2hN/NjDuo5DktTekbN6oap6MMkq\ncC5wIMmJVXUgyTbgvuZh9wLPGnra9qbsxyQxqUjSBKoqbR7f9eymZ67NXEryFOAXgN3ANcCbm4e9\nCbi62b4GeH2SJyV5DnAqcEub16yqpbrt3Llz7jEsys26sC6si81vk+i6JfF3gMuSHMEgIX22qr6Q\n5KvAVUneAtwNvBagqu5MchVwJ/Aw8LYa8c4mfcPaXDL6JMM6l5ZPp0miqu4AXrJB+QPA3x/xnPcB\n75v0NUcd5DzAjcd6kjRsZmMS02YyGFhZWZl3CAvDujjIujjIujg8nS+m60KSUb1QkqQRklCLNHAt\nSeq33nY3jbII3VCbDf6OMml8i/B+JzXt2PtcF9Ki6m1306j7+vh+JGkW7G6SJE2VSUKSNFJvxyTa\ndiu5SEyS2uttkmjLRCBJ7fU2SbSdyWJLQpLa622SGMVpkJI0Pb1NEh70Jal7vU0SbdndJEnt9TZJ\ntO1WMhFIUnu9TRLqh0lacJNc1mSz/UmanEkCu6K6NEn9WefS4jBJMNlBycQiaRlsuSQxqymwJgJJ\ny2DLJQkP3pI0Pb1NEiYDSepeb5OEK6slqXu9TRImg805sC5pGnqbJLQ5E4GkafBHhyRJI/W2JeGY\nhCR1r7dJYt7JwD5/Scugt0liFBfTaVF5YqE+6m2SsLtJfeNnU33U6cB1ku1JbkryrSR3JPm1pnxn\nku8kubW5nTv0nAuT7EmyO8k5XcYnSdpcujy7SbIN2FZVu5I8Hfg6cD7wOuCvquoD6x7/AuAK4KXA\nduBG4LRaF2SS9UWSpENIQlW1uhZ/py2JqtpfVbua7YeA3cBJzd0bBXo+cGVVPVJVe4E9wI4uY5Qk\njTazdRJJTgHOBG5uit6eZFeSjyc5pik7Cbhn6Gn3cjCprN/fhjdJ0vTMJEk0XU2fA97ZtCg+Cjy3\nqs4E9gO/23afVbXhTf036gTAkwBp9jqf3ZTkSAYJ4tNVdTVAVd0/9JD/BFzbbN8LPGvovu1N2RNc\nfPHFj2+vrKywsrIytZg1XyZ7aTpWV1dZXV09rH10OnANkORTwP+pqncNlW2rqv3N9r8CXlpVb0zy\nQuBy4GcYdDPdgAPXkjQVkwxcd9qSSHI28E+AO5LcBhRwEfDGJGcCjwF7gV8FqKo7k1wF3Ak8DLxt\nVDZwncTAJPUwabfNqH1Oe5HYtLuVlu0zIU1T5y2JLix6S8KVtZIW0cK1JLq0yC2JRYhBkqaht0li\nmjzzVx9N8rn1s96dLup2EU6Ge5sk2laSXw5tNZN8bv2sd6eLul2E/6/eJom2FqGyJalv/GU6SdJI\nvW1JtJ0maUtCktrrbZKYZGBOktROb5NE21H/aS8gm9QizFaQpHH1NklM86A6ywO0yUBSn/Q2SbQ9\nI/fgLEnt9TZJSH3jWh310ZZLEvb5a1H5GVQf9TZJ+IWTpO71NklIUlfsGjyot0nCbiVJXfE4cpCX\n5ZAkjdTbloSZXpK619skMYrdUJI0Pb1NEl6jSet5giBNX2+ThF98rednQpq+3iYJzxolqXu9TRIm\nA0nqXm+TxCh9bWG4eEfSItpySaKvB9S+xi1pa+ttkvDnSyWpe71NEh70Jal7vU0SbfW5z3/aa0IW\n/f1KWhxLkyT6fGDsc+yS+m1pksS0WxJ9bpno8E3SuvNzpj7q9CqwSbYnuSnJt5LckeQdTfmxSa5P\ncleS65IcM/ScC5PsSbI7yTmb7HvD2yhVNfI2iWnvT/2y2f+/nzNtJenyw5ZkG7CtqnYleTrwdeB8\n4JeB71bV7yR5D3BsVV2Q5IXA5cBLge3AjcBptS7IJCOD7uuXxzNGSV1LQlW1agZ32pKoqv1VtavZ\nfgjYzeDgfz5wWfOwy4BXN9vnAVdW1SNVtRfYA+wYse8Nb21bGIvCM0ZJi+iQSSLJqU2X0Deav89I\ncmHbF0pyCnAm8FXgxKo6AINEApzQPOwk4J6hp93blI3NA21/9DWhS8tknIHrjwMXAR9p/r4D+Azw\nvnFfpOlq+hzwzqp6aIPuotZH8b5efkMH+X+1vOxenY3V1VVWV1cPax/jJImnVdX/WPtPrapK8vC4\nL5DkSAYJ4tNVdXVTfCDJiVV1oBm3uK8pvxd41tDTtzdlT7DIHyS/ANLm/B7MxsrKCisrK4///d73\nvrf1PsYZk/hukufQnO0neTWwv8VrfAK4s6o+OFR2DfDmZvtNwNVD5a9P8qTmNU8FbmnxWgvB8QVJ\nW8UhZzclORX4GPAy4H5gH/CGqvr2IXeenA38MYMuqmpuFzE48F/FoNVwN/Daqvp+85wLgbcCDzPo\nnrp+g/2un/A0fN+G5R6gNW+2MDVvk8xuGnsKbLOWIWsH83nailNgJalrkySJkWMSawvfNnoRgKr6\nUKvoJEm9s9nA9fEzi2IC02wx2A0gSRvrdMV1VzYbk5hwfyPv62P9SNJGOllxneSUJJ9Psr+5/Zdm\nYdxcTXMhlrORJGlj40yB/QyDqanPbm7XNmVz5UFdkro3zhTY26vqjHVl36iqn+o0ss1jcnaTJLU0\n1dlNQ76Q5N3AlQzWObwO+K9JjgaoqgdbRypJ6oVxWhL3bHJ3VdWzpxvSodmS0Ly5aFN91OliukUy\n7dlNh3itDcv7WG+Sllsn3U1JjgDOBU4ZfryL6STp8M3qp3AnNc6YxNUMxiLuAB7rNpzxzeoM3xaD\npC4t+jFmnCRxSlW9uPNIWlr0itXicLGkNLlx1klcl+TnO49kCxm10G+zg9Vmz5lkfzrIxZLS5MZp\nSXwJuLaZUfQ3QBjMajqu08hmaNpnmrN6jtRXtu76Y5wpsN8GXsO6MYmqerTb0DaNySmwktRSV4vp\nvgPcNrM5p2NasHAkaUsaJ0n8L+CmJF8AfrRW6BTYyUx7VtYk+7OpL2lc47YkvgMc3XEsrfR1kdsi\nTNGdZUKS1G+uuJakJdHViutnAr8OnA48ea28qs5pHeEMeLYrSdMzzjqJ/wzsBX4SuATYD+zqMKax\njFo34Hx4SZqecabAfr2qfnrtdyUyOFW/uap2zCbEDWNyCqwktdTVFNiHm3/3J3kl8JfAM9oGN20m\nA0nq3jhJ4reTHAO8G/gIg1lOv9FpVGNw7EGSuufsJklaEpN0Nx1y4DrJ+5IcneTIJNclOZDkjZOH\nqY1M+wJ/k+5v2hcZ9OKEUr+NM7vpVc3vWP9DYB/wAuA9nUa1hDa7UukkVzGddH/TjOFQcUhafOOM\nSaw95heBq6rqgc1mFy0LL20haRmM05L4oyTfBH4GuKFZXPejQzwHgCSXNt1Ttw+V7UzynSS3Nrdz\nh+67MMmeJLuTbLpYb96/u+AZsqRlMNbAdZITgAeq6pEkTweOqap7x3jezwIPAZ+qqjOasp3AX1XV\nB9Y99gXAFcBLge3AjcBpG41Qu05CktrrZOAaoKruq6pHmu2HxkkQzWO/DHxvg7s2CvJ84MqqeqSq\n9gJ7gJEL9jyLl6TujZUkOvD2JLuSfLxZgwFwEnDP0GPubcokSXMyzsD1tH0U+K2qqiT/Fvhd4Ffa\n7uTiiy9+fHtlZYWVlZVNH79sA83L9n4lPdHq6iqrq6uHtY9xrt10xgbFPwDuqarHNrhv/fNPBq5d\nG5MYdV+SCxj8dvYlzX1fBHZW1c0bPM8xCUlqqasxiUuBrwOfAj4N/ClwNbAnySvGiYuhMYgk24bu\n+0fAN5vta4DXJ3lSkucApwK3jLH/H38xF25J0tSM0920F3hrVd0OkOTFwL8BLgI+B5w56olJrgBW\ngGck+QtgJ/DyJGcCjzX7/lWAqrozyVXAnQwuKvi2za69YYtBkro3TnfTN6vqRRuVJdlVVSOTRFem\n3d1k/72kZTBJd9M4LYk/S/Jh4Mrm79c1ZUcBj7SMcSGZCLQRTx6k8VoSTwV+DfjZpugrwIeBvwae\nXlU/6DTCjWOyJbEFjKp361zqxiQtid5eKnzUfX18P5I0C510NyV5GYMB55OHH19VP9k6wikyGUhS\n98bpbtoN/CaDabCPrpVX1YFuQ9s0Jn90SJJa6mrg+sGqunbCmCRJPTZOS+J9zeYfMHSJ8LV1E/Mw\n7ZaEA9eSlkEnA9dJvrRBcVXV32vzQtO0WZKY1YyZSVdxO/tK0rw4uwkPmsvMKbXS5qY6JpHkDVX1\nmSTv2Oj+qvpQ2wCnyS++1vMzsVhm2dpeBFu1xb/ZwPWxzb/HzyKQtjxrlBbbsn0Xt+r7tbtJkpZE\nV4vpngm8BTiFH19M98/aBjhNJoMBW1SSujTOOomrga8CX2ZoMZ0Wg8lAUpfGmQI7l8uBb8YV15LU\nXle/TPdHSc6ZMKaFMeoX6/zVOkkabZyWxPeAY4AfAn/D4KdIq6qO6z68kTHZkpCklrq6dtMzJ4yn\nUw7YSlL3NltMd1pV7QFOH/GQuV27CUwGkjQLI7ubklxaVW/t27WbNnnOyPtMOJKWwVJdu6mPcUvS\nPHU1JkGS5wMvBJ68VlZVV7QLT5uxpSNpEY2z4vpfA+cAzweuA17JYGHdXJPEVhu47mvckra2cdZJ\nvA54ObCvqn4J+CngaZ1GJUlaCON0N/2/qno0ySNJ/hawHzi547imbtrdOXYPSVoG4ySJ25L8beAT\nwJ8CDwK3dBrVGNoeiKd94J5lIpj2qnCTmKRxbTq7KYOj07aq2tf8fSpwdFXdOqP4RsXlpcIPwZaO\npPW6+o3rb1bViw4rsikzSUhSe11d4G9XkrMmDOjSJAeS3D5UdmyS65PcleS6JMcM3Xdhkj1Jdm+F\niwpKUt+NTBJJ1sYrzgK+1hzUb01yW5Jxu5s+yWDK7LALgBur6nnATcCFzeu9EHgt8ALgVcBHs0mf\nSVVtePNKr5I0PZsNXN8CvAQ4b9KdV9WXk6yfCXU+8HPN9mXAKoPEcR5wZVU9AuxNsgfYAdzc8jUn\nDVeStM5mSSIAVfW/p/yaJ1TVgWbf+5Oc0JSfBPzJ0OPubco2Dq5l62DS5LHVFu1JUhubJYnjk7xr\n1J1V9YEpxTDR0Xbnzp2Pb6+srLCysgI4XVSS1qyurrK6unpY+9jsKrD7gP9A06JYr6reO9YLDLqb\nrq2qM5q/dwMrVXUgyTbgv1fVC5JcMNhtXdI87ovAzqp6QnfTIlzgzymmkvpm2hf421dVv3WYMcEg\nyQwHdQ3wZuAS4E3A1UPllyf5PQbdTKeyAIv2RjERSFoGhxyTOBxJrgBWgGck+QtgJ/B+4PeTvAW4\nm8GMJqrqziRXAXcCDwNvm3tzQZKW3GbdTcdV1QMzjmcsLqaTpPaW6keHRt3Xx/cjSbPQ2Y8OqR0H\ntSVtFb1NEot8sF3k2CSpjd4miVktppsVWx+SFlFvk8RWO3ButfcjaWvobZKYN8/8JS2D3iaJeV9T\nyUQgaRn0NkmMMu/kIUlbyZZLEiYDSZqe3iYJk4Ekda+3SWIUu5skaXp6myRMBpLUvZG/cS1JUm9b\nEtM0yZqHSX8Bb9FbOq7/kDTMJMFkB7+tesDcqu9L0mTsbpIkjbQ0LQm7USSpvaVJEiYCSWqvt0nC\ng74kdc8xCUnSSL1tSbTlmIQktdfbJNF2xbWJQJLa622SaHvQtyUhSe31NknYkpCk7jlwLUkaqbct\nibbsbjrIupA0rqVJEjrIRCBpXEuTJDwwSlJ7c0sSSfYCPwAeAx6uqh1JjgU+C5wM7AVeW1U/mFeM\nkrTs5jlw/RiwUlVnVdWOpuwC4Maqeh5wE3Dh3KLTUkgy8iZpvkkiG7z++cBlzfZlwKtnGlELHly2\nhqoaeZMEmdeXIcmfA98HHgX+Y1V9PMn3qurYocc8UFXHbfDckUFP+/34W9qHNstf6XNmljS5JFRV\nqy/sPAeuz66qfUmOB65Pchew/ls+s2Qw79fps1nWkf8f0mzNLUlU1b7m3/uT/CGwAziQ5MSqOpBk\nG3DfqOe3PXud9OBiS0JSX62urrK6unpY+5hLd1OSpwJHVNVDSZ4GXA+8F3gF8EBVXZLkPcCxVXXB\nBs+fewtDkvpmku6meSWJ5wCfZ9CddCRweVW9P8lxwFXAs4C7GUyB/f4Gz+9tkrBlImleepMkDleS\nWuS4Zzm4uuhJZ9p1Mcn+HOyWBvo2cL2Upn1QX4SD3KQH4UnqYpL3uwh1JPXV0iSJWZ5NLttBqc8J\nTtLmepskZjW7SZKWWW+TxCgu0JKk6dlySWISJgJJ2lhvk0TbmSwmAklqr7dJom0ysEtJktrrbZJo\ny0TQHROwtHUtTZJQd0wE0tbV2yThgUmSutfbJOEAtSR1r7dJYpIB6rb7kqRl19skMYoH/MXioLbU\nb1suSWixmAikfuttknBMQpK619sk0ZbdHpLU3tIkCROBJLV3xLwDkCQtrt62JGwZSFL3bElIkkYy\nSUiSRuptd1Nbzm6SpPaWJkkseiKYdhKbdH+LcFkTE7q0OJYmSSy6aR/8Jt3fIhyEFyEGSQO9TRKu\nuJak7vU2SZgMJKl7vU0StiQkqXtOgZUkjbSQSSLJuUn+LMn/TPKeeccjSctq4ZJEkiOAfw+8Ejgd\neEOS5883qsW1uro67xAWhnVxkHVxkHVxeBYuSQA7gD1VdXdVPQxcCZy//kFVteEtyYa3WRoVQxdx\n+AU4yLo4yLo4yLo4PIs4cH0ScM/Q399hkDh+zCIPXC9CDLPk4jdp61rEJNELHhgPWrb3Ky2TLNoX\nPMnLgIur6tzm7wuAqqpLhh6zWEFLUk9UVat+70VMEj8B3AW8AtgH3AK8oap2zzUwSVpCC9fdVFWP\nJnk7cD2DgfVLTRCSNB8L15KQJC2ORZwCu6llXmiX5NIkB5LcPlR2bJLrk9yV5Lokx8wzxllJsj3J\nTUm+leSOJO9oypeuPpIcleTmJLc1dbGzKV+6uoDBWqsktya5pvl7KesBIMneJN9oPhu3NGWt6qNX\nScKFdnySwXsfdgFwY1U9D7gJuHDmUc3HI8C7qup04O8C/6L5LCxdfVTVj4CXV9VZwJnAq5LsYAnr\novFO4M6hv5e1HgAeA1aq6qyqWltK0Ko+epUkGHOh3VZVVV8Gvreu+Hzgsmb7MuDVMw1qTqpqf1Xt\narYfAnYD21ne+vhhs3kUg7HGYgnrIsl24BeBjw8VL109DAlPPM63qo++JYmNFtqdNKdYFsUJVXUA\nBgdO4IQ5xzNzSU5hcAb9VeDEZayPpovlNmA/cENVfY3lrIvfA36DQZJcs4z1sKaAG5J8LcmvNGWt\n6mPhZjfpsC3VTIQkTwc+B7yzqh7aYA3NUtRHVT0GnJXkaODzSU7nie99S9dFkn8AHKiqXUlWNnno\nlq6Hdc6uqn1JjgeuT3IXLT8XfWtJ3As8e+jv7U3ZMjuQ5ESAJNuA++Ycz8wkOZJBgvh0VV3dFC9t\nfQBU1YPAKnAuy1cXZwPnJflz4DPAzyf5NLB/yerhcVW1r/n3fuAPGXTZt/pc9C1JfA04NcnJSZ4E\nvB64Zs4xzVqa25prgDc3228Crl7/hC3sE8CdVfXBobKlq48kz1yboZLkKcAvMBijWaq6qKqLqurZ\nVfVcBseGm6rql4BrWaJ6WJPkqU1LmyRPA84B7qDl56J36ySSnAt8kIML7d4/55BmJskVwArwDOAA\nsJPB2cHvA88C7gZeW1Xfn1eMs5LkbOCPGXzoq7ldxGCF/lUsUX0keTGDAcgjmttnq+rfJTmOJauL\nNUl+Dvj1qjpvWeshyXOAzzP4bhwJXF5V729bH71LEpKk2elbd5MkaYZMEpKkkUwSkqSRTBKSpJFM\nEpKkkUwSkqSRTBLSCEkebS45fVvz729Ocd8nJ7ljWvuTuuK1m6TR/m9VvaTD/btISQvPloQ02oY/\nGJ/k20kuSXJ7kq8meW5TfnKS/5ZkV5IbmstWk+SEJH/QlN+W5GXNro5M8rEk30zyxSRHzeh9SWMz\nSUijPWVdd9M/Hrrve1V1BvARBpeJAfgw8MmqOhO4ovkb4EPAalP+EuBbTflpwIer6kXAD4DXdPx+\npNa8LIc0QpIHq+roDcq/zeCX4PY2V6LdV1XHJ7kf2FZVjzblf1lVJyS5Dzip+aGstX2cDFzf/DoY\nzXjHkVX12zN5c9KYbElIk6kR2238aGj7URwj1AIySUijbTgm0Xhd8+/rgT9ptr8CvKHZ/qfAl5rt\nG4G3weO/ILfWOtls/9JC8MxFGu3JSW5lcDAv4ItVdVFz37FJvgH8NQcTwzuATyZ5N3A/8MtN+b8E\nPpbkrcAjwD9n8DOj9vVq4TkmIbXUjEn8dFU9MO9YpK7Z3SS155mVloYtCUnSSLYkJEkjmSQkSSOZ\nJCRJI5kkJEkjmSQkSSOZJCRJI/1/xhWdaamtd0wAAAAASUVORK5CYII=\n", 768 | "text/plain": [ 769 | "" 770 | ] 771 | }, 772 | "metadata": {}, 773 | "output_type": "display_data" 774 | } 775 | ], 776 | "source": [ 777 | "# Show flippings for a few training samples.\n", 778 | "plt.pcolor(flipped[:300], cmap='Greys')\n", 779 | "plt.xlabel('Epoch')\n", 780 | "plt.ylabel('Training sample')\n", 781 | "\n", 782 | "# plt.savefig('plots/bw-two-rectangles_flips.png', dpi=300)" 783 | ] 784 | }, 785 | { 786 | "cell_type": "code", 787 | "execution_count": 11, 788 | "metadata": { 789 | "ExecuteTime": { 790 | "end_time": "2016-07-08T02:38:09.494000", 791 | "start_time": "2016-07-08T02:38:09.091000" 792 | }, 793 | "collapsed": false 794 | }, 795 | "outputs": [ 796 | { 797 | "data": { 798 | "text/plain": [ 799 | "(0, 1)" 800 | ] 801 | }, 802 | "execution_count": 11, 803 | "metadata": {}, 804 | "output_type": "execute_result" 805 | }, 806 | { 807 | "data": { 808 | "image/png": "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\n", 809 | "text/plain": [ 810 | "" 811 | ] 812 | }, 813 | "metadata": {}, 814 | "output_type": "display_data" 815 | } 816 | ], 817 | "source": [ 818 | "# Plot metrics on the training data. \n", 819 | "mean_ious_epoch = np.mean(ious_epoch, axis=0)\n", 820 | "mean_dists_epoch = np.mean(dists_epoch, axis=0)\n", 821 | "mean_mses_epoch = np.mean(mses_epoch, axis=0)\n", 822 | "plt.plot(mean_ious_epoch, label='Mean IOU') # between predicted and assigned true bboxes\n", 823 | "plt.plot(mean_dists_epoch, label='Mean distance') # relative to image size\n", 824 | "plt.plot(mean_mses_epoch, label='Mean mse')\n", 825 | "plt.annotate(np.round(np.max(mean_ious_epoch), 3), (len(mean_ious_epoch)-1, mean_ious_epoch[-1]+0.03), horizontalalignment='right', color='b')\n", 826 | "plt.annotate(np.round(np.min(mean_dists_epoch), 3), (len(mean_dists_epoch)-1, mean_dists_epoch[-1]+0.03), horizontalalignment='right', color='g')\n", 827 | "plt.annotate(np.round(np.min(mean_mses_epoch), 3), (len(mean_mses_epoch)-1, mean_mses_epoch[-1]+0.03), horizontalalignment='right', color='r')\n", 828 | "\n", 829 | "plt.legend()\n", 830 | "plt.ylim(0, 1)" 831 | ] 832 | }, 833 | { 834 | "cell_type": "code", 835 | "execution_count": 12, 836 | "metadata": { 837 | "ExecuteTime": { 838 | "end_time": "2016-07-08T02:38:19.683000", 839 | "start_time": "2016-07-08T02:38:19.452000" 840 | }, 841 | "collapsed": false 842 | }, 843 | "outputs": [ 844 | { 845 | "data": { 846 | "text/plain": [ 847 | "(10000L, 2L, 4L)" 848 | ] 849 | }, 850 | "execution_count": 12, 851 | "metadata": {}, 852 | "output_type": "execute_result" 853 | } 854 | ], 855 | "source": [ 856 | "# Predict bounding boxes on the test images.\n", 857 | "pred_y = model.predict(test_X)\n", 858 | "pred_bboxes = pred_y * img_size\n", 859 | "pred_bboxes = pred_bboxes.reshape(len(pred_bboxes), num_objects, -1)\n", 860 | "pred_bboxes.shape" 861 | ] 862 | }, 863 | { 864 | "cell_type": "code", 865 | "execution_count": 14, 866 | "metadata": { 867 | "ExecuteTime": { 868 | "end_time": "2016-07-08T02:38:27.705000", 869 | "start_time": "2016-07-08T02:38:26.975000" 870 | }, 871 | "collapsed": false 872 | }, 873 | "outputs": [ 874 | { 875 | "data": { 876 | "image/png": "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\n1slZa2x1UqUcyX2xpG9ExKmI+Imkv5X02n6HBWRBdlEicotSkV2MytGEbZ4t6eHTvv6W5kEGxo7s\nokRF5vaSSy7RpZdeKp08qauuumro4WAYRWYX9XJELN7A/m1Jr46I322+fpOkF0fEjXu2W1wISBAR\nzlUrJbvkFrnkyi5zLtZp3XNuczvZRWcp2U05kvttSc857evLmttW3hmwZkuzS24xQsy5KBXZxaik\nrMm9XdIv296wfa6k10v6dL/DArIguygRuUWpyC5GZemR3Ih40vbvS/qs5k3xByPivt5HBnREdlEi\ncotSkV2MzdI1uQAAAEBpOn/iWa4TP9v+oO3HbN/VcTyX2f687a/bvtv2jcvvtW+d82x/yfYdTZ3j\nHcc1sX3SduuXbmxv2/5aM6Yvd6hzse1P2L6veZyublnnymYsJ5t/H+/weL/d9j2277L9kealrl7l\nyC65Ta4zmuyS2906ZDetDtnNhOwm16NfWFwrPbsR0fqieZP835I2JJ0j6U5Jz21Z62WSXijpro5j\nukTSC5vrF0r6zw5jOtb8e0TSf2j+LtG243q7pL+R9OkONR6Q9HNdHp+mzl9KuqG5flTSRRlqTiQ9\nIukXW9z30uZ7O7f5+uOS3tx1TAnj7Zxdclt2dg9rbptaZDetDtnNcCG7683uWHN7WhbWkt2uR3Kz\nnfg5Ir4o6Qcdx6OIeDQi7myu/1jSfZqfu69NrSeaq+dp/sNttbbD9mWSXiPpA23uf3opdTz6bvsi\nSb8WEbdIUkT8NCL+p+O4JOlaSd+MiIeXbrm/I5IusH1U0jHNfwH6lCW75Da9nMaZ3UOZW4nsrlJO\nZDcHspuAfiFJcna7Nrn7nfi5VUD6YHtT82d7X2p5/4ntOyQ9Kum2iLi95VDeK+kdahn604Sk22zf\nbvstLWtcLul7tm9pXjZ4v+3zO45Lkl4n6WNt7hgRj0h6t6SHND/dzA8j4nMZxrTIaLNbYW6l8WaX\n3GZEdg9EdsluKvqFBVbNbuc1uWNl+0JJt0p6W/MMbWURsRMRL9L8XH9X235ei3H8pqTHmmeLbi5t\nXRMRV2n+LO+ttl/WosZRSVdJ+oum1hOSbuowJtk+R9L1kj7R8v7P0PwZ/YbmL0VcaPuNXcZUqkpz\nK40wu+Q2L7K7ENkdsUqzO7rcSuvPbtcmN+nEz+vWHMK+VdJfR8Tfd63XHJ7/F0nXtbj7NZKut/2A\n5s9cft32X7Ucx3eaf78r6VNq93GJ35L0cER8pfn6Vs1D3MVvSPpqM642rpX0QER8PyKelPRJSS/t\nOKZlRpfdWnPbjGWM2SW3mZDdpcgu2U1Bv7DcStnt2uTmPvFzjmfdkvQhSfdGxPtaD8R+pu2Lm+vn\nS3qlpPtXrRMR74qI50TEFZo/Pp+PiDe3GM+x5tmmbF8g6VWS7mkxnsckPWz7yuamV0i6d9U6e7xB\nLV96aDwk6SW2n2bbzZj6PrdizuyS28VjGmt2D3tuJbK7bExkNx+yuwT9QpLVshvd3yV3nebvSPyG\npJs61Pmo5ouH/6/5Jm5oWecaSU9q/s7NOySdlHRdizq/2tz3Tkl3SfrjDI/Vy9Xy3ZKar4156nu6\nu+Nj/QLNJ5w7NX8WdHGHWsckfVfS0zs+NseboN4l6cOSzun6eCfss3N2yW2Z2T3suW3qkN3l9ye7\nGS9kdz3ZHWNum1przy4fBgEAAIDqVPvGMwAAABxeNLkAAACoDk0uAAAAqkOTCwAAgOrQ5AIAAKA6\nNLkAAACoDk0uAAAAqvP/PLurt16sBz4AAAAASUVORK5CYII=\n", 877 | "text/plain": [ 878 | "" 879 | ] 880 | }, 881 | "metadata": {}, 882 | "output_type": "display_data" 883 | } 884 | ], 885 | "source": [ 886 | "# Show a few images and predicted bounding boxes from the test dataset. \n", 887 | "plt.figure(figsize=(12, 3))\n", 888 | "for i_subplot in range(1, 5):\n", 889 | " plt.subplot(1, 4, i_subplot)\n", 890 | " i = np.random.randint(len(test_X))\n", 891 | " plt.imshow(test_imgs[i].T, cmap='Greys', interpolation='none', origin='lower', extent=[0, img_size, 0, img_size])\n", 892 | " for pred_bbox, exp_bbox in zip(pred_bboxes[i], test_bboxes[i]):\n", 893 | " plt.gca().add_patch(matplotlib.patches.Rectangle((pred_bbox[0], pred_bbox[1]), pred_bbox[2], pred_bbox[3], ec='r', fc='none'))\n", 894 | "\n", 895 | "# plt.savefig('plots/bw-two-rectangles_with-flipping.png', dpi=300)" 896 | ] 897 | }, 898 | { 899 | "cell_type": "code", 900 | "execution_count": null, 901 | "metadata": { 902 | "collapsed": true 903 | }, 904 | "outputs": [], 905 | "source": [] 906 | } 907 | ], 908 | "metadata": { 909 | "kernelspec": { 910 | "display_name": "Python 2", 911 | "language": "python", 912 | "name": "python2" 913 | }, 914 | "language_info": { 915 | "codemirror_mode": { 916 | "name": "ipython", 917 | "version": 2 918 | }, 919 | "file_extension": ".py", 920 | "mimetype": "text/x-python", 921 | "name": "python", 922 | "nbconvert_exporter": "python", 923 | "pygments_lexer": "ipython2", 924 | "version": "2.7.11" 925 | } 926 | }, 927 | "nbformat": 4, 928 | "nbformat_minor": 0 929 | } 930 | --------------------------------------------------------------------------------