Skip to content
Snippets Groups Projects
01-Preparation-of-data.ipynb 2.04 MiB
Newer Older
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "<img width=\"800px\" src=\"../fidle/img/00-Fidle-header-01.svg\"></img>\n",
    "\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "# <!-- TITLE --> [GTS1] - CNN with GTSRB dataset - Data analysis and preparation\n",
    "<!-- DESC --> Episode 1 : Data analysis and creation of a usable dataset\n",
    "<!-- AUTHOR : Jean-Luc Parouty (CNRS/SIMaP) -->\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "## Objectives :\n",
    " - Understand the **complexity associated with data**, even when it is only images\n",
    " - Learn how to build up a simple and **usable image dataset**\n",
    "\n",
    "The German Traffic Sign Recognition Benchmark (GTSRB) is a dataset with more than 50,000 photos of road signs from about 40 classes.  \n",
    "The final aim is to recognise them !  \n",
    "Description is available there : http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset\n",
    "\n",
    "\n",
    "## What we're going to do :\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    " - Understanding the dataset\n",
    " - Preparing and formatting enhanced data\n",
    " - Save enhanced datasets in h5 file format\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 1 -  Import and init"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       "\n",
       "div.warn {    \n",
       "    background-color: #fcf2f2;\n",
       "    border-color: #dFb5b4;\n",
       "    border-left: 5px solid #dfb5b4;\n",
       "    padding: 0.5em;\n",
       "    font-weight: bold;\n",
       "    font-size: 1.1em;;\n",
       "    }\n",
       "\n",
       "\n",
       "\n",
       "div.nota {    \n",
       "    background-color: #DAFFDE;\n",
       "    border-left: 5px solid #92CC99;\n",
       "    padding: 0.5em;\n",
       "    }\n",
       "\n",
       "div.todo:before { content:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1My44OTEyIiBoZWlnaHQ9IjE0My4zOTAyIiB2aWV3Qm94PSIwIDAgNTMuODkxMiAxNDMuMzkwMiI+PHRpdGxlPjAwLUJvYi10b2RvPC90aXRsZT48cGF0aCBkPSJNMjMuNDU2OCwxMTQuMzAxNmExLjgwNjMsMS44MDYzLDAsMSwxLDEuODE1NywxLjgyNEExLjgyMDksMS44MjA5LDAsMCwxLDIzLjQ1NjgsMTE0LjMwMTZabS0xMC42NjEyLDEuODIyQTEuODI3MiwxLjgyNzIsMCwxLDAsMTAuOTgsMTE0LjMsMS44MiwxLjgyLDAsMCwwLDEyLjc5NTYsMTE2LjEyMzZabS03LjcwNyw0LjU4NzR2LTVzLjQ4NjMtOS4xMjIzLDguMDIxNS0xMS45Njc1YTE5LjIwODIsMTkuMjA4MiwwLDAsMSw2LjA0ODYtMS4yNDU0LDE5LjE3NzgsMTkuMTc3OCwwLDAsMSw2LjA0ODcsMS4yNDc1YzcuNTM1MSwyLjgzNDcsOC4wMTc0LDExLjk2NzQsOC4wMTc0LDExLjk2NzR2NS4wMjM0bC4wMDQyLDcuNjgydjIuNGMuMDE2Ny4xOTkyLjAzMzYuMzkyMS4wMzM2LjU4NzEsMCwuMjEzOC0uMDE2OC40MTA5LS4wMzM2LjYzMzJ2LjA1ODdoLS4wMDg0YTguMzcxOSw4LjM3MTksMCwwLDEtNy4zNzM4LDcuNjU0N3MtLjk5NTMsMy42MzgtNi42OTMzLDMuNjM4LTYuNjkzNC0zLjYzOC02LjY5MzQtMy42MzhhOC4zNyw4LjM3LDAsMCwxLTcuMzcxNi03LjY1NDdINS4wODQzdi0uMDU4N2MtLjAxODktLjIyLS4wMjk0LS40MTk0LS4wMjk0LS42MzMyLDAtLjE5MjkuMDE2Ny0uMzgzNy4wMjk0LS41ODcxdi0yLjRtMTguMDkzNy00LjA0YTEuMTU2NSwxLjE1NjUsMCwxLDAtMi4zMTI2LDAsMS4xNTY0LDEuMTU2NCwwLDEsMCwyLjMxMjYsMFptNC4wODM0LDBhMS4xNTk1LDEuMTU5NSwwLDEsMC0xLjE2MzYsMS4xN0ExLjE3NSwxLjE3NSwwLDAsMCwyNy4yNjE0LDEyNC4zNzc5Wk05LjM3MzksMTE0LjYzNWMwLDMuMTA5MywyLjQxMzIsMy4zMSwyLjQxMzIsMy4zMWExMzMuOTI0MywxMzMuOTI0MywwLDAsMCwxNC43MzQ4LDBzMi40MTExLS4xOTI5LDIuNDExMS0zLjMxYTguMDc3Myw4LjA3NzMsMCwwLDAtMi40MTExLTUuNTUxOWMtNC41LTMuNTAzMy05LjkxMjYtMy41MDMzLTE0Ljc0MTEsMEE4LjA4NTEsOC4wODUxLDAsMCwwLDkuMzczOSwxMTQuNjM1WiIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjMzLjE0MzYiIGN5PSIxMjQuNTM0IiByPSIzLjgzNjMiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48cmVjdCB4PSIzNS42NjU5IiB5PSIxMTIuOTYyNSIgd2lkdGg9IjIuMDc3IiBoZWlnaHQ9IjEwLjU0NTgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxLjYgMjQxLjExMjEpIHJvdGF0ZSgtMTU1Ljc0NikiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48Y2lyY2xlIGN4PSIzOC44NzA0IiBjeT0iMTEzLjQyNzkiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjUuMjI0OCIgY3k9IjEyNC41MzQiIHI9IjMuODM2MyIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxyZWN0IHg9IjEuNDE2NCIgeT0iMTI0LjYzMDEiIHdpZHRoPSIyLjA3NyIgaGVpZ2h0PSIxMC41NDU4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0LjkwOTcgMjU5LjgwNikgcm90YXRlKC0xODApIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PGNpcmNsZSBjeD0iMi40MDkxIiBjeT0iMTM3LjA5OTYiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxwYXRoIGQ9Ik0xOC4wNTExLDEwMC4xMDY2aC0uMDE0NlYxMDIuNjFoMi4zdi0yLjQyNzlhMi40MjI5LDIuNDIyOSwwLDEsMC0yLjI4NTQtLjA3NTVaIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PHBhdGggZD0iTTM5LjQyMTQsMjcuMjU4djEuMDVBMTEuOTQ1MiwxMS45NDUyLDAsMCwwLDQ0LjU5NTQsNS43OWEuMjQ0OS4yNDQ5LDAsMCwxLS4wMjM1LS40MjI3TDQ2Ljc1LDMuOTUxNWEuMzg5Mi4zODkyLDAsMCwxLC40MjYyLDAsMTQuODQ0MiwxNC44NDQyLDAsMCwxLTcuNzU0MywyNy4yNTkxdjEuMDY3YS40NS40NSwwLDAsMS0uNzA0Ny4zNzU4bC0zLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsMC0uNzUxNmwzLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsLjY5NDYuMzc1OFpNNDMuMjMsMi41ODkyLDM5LjM4NzguMDc5NGEuNDUuNDUsMCwwLDAtLjcwNDYuMzc1OHYxLjA2N2ExNC44NDQyLDE0Ljg0NDIsMCwwLDAtNy43NTQzLDI3LjI1OTEuMzg5LjM4OSwwLDAsMCwuNDI2MSwwbDIuMTc3Ny0xLjQxOTNhLjI0NS4yNDUsMCwwLDAtLjAyMzUtLjQyMjgsMTEuOTQ1MSwxMS45NDUxLDAsMCwxLDUuMTc0LTIyLjUxNDZ2MS4wNWEuNDUuNDUsMCwwLDAsLjcwNDYuMzc1OGwzLjg1NTMtMi41MWEuNDUuNDUsMCwwLDAsMC0uNzUxNlpNMzkuMDUyMywxNC4yNDU4YTIuMTIwNiwyLjEyMDYsMCwxLDAsMi4xMjA2LDIuMTIwNmgwQTIuMTI0LDIuMTI0LDAsMCwwLDM5LjA1MjMsMTQuMjQ1OFptNi4wNzMyLTQuNzc4MS44MjU0LjgyNTVhMS4wNTY4LDEuMDU2OCwwLDAsMSwuMTE3NSwxLjM0MjFsLS44MDIsMS4xNDQyYTcuMTAxOCw3LjEwMTgsMCwwLDEsLjcxMTQsMS43MTEybDEuMzc1Ny4yNDE2YTEuMDU2OSwxLjA1NjksMCwwLDEsLjg3NTcsMS4wNHYxLjE2NDNhMS4wNTY5LDEuMDU2OSwwLDAsMS0uODc1NywxLjA0bC0xLjM3MjQuMjQxNkE3LjExLDcuMTEsMCwwLDEsNDUuMjcsMTkuOTNsLjgwMTksMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLS4xMTc0LDEuMzQyMmwtLjgyODguODQ4OWExLjA1NywxLjA1NywwLDAsMS0xLjM0MjEuMTE3NGwtMS4xNDQyLS44MDE5YTcuMTMzOCw3LjEzMzgsMCwwLDEtMS43MTEzLjcxMTNsLS4yNDE2LDEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLTEuMDQuODc1N0gzOC40Njg0YTEuMDU2OCwxLjA1NjgsMCwwLDEtMS4wNC0uODc1N2wtLjI0MTYtMS4zNzI0YTcuMTM1NSw3LjEzNTUsMCwwLDEtMS43MTEzLS43MTEzbC0xLjE0NDEuODAxOWExLjA1NzEsMS4wNTcxLDAsMCwxLTEuMzQyMi0uMTE3NGwtLjgzNTUtLjgyNTVhMS4wNTcsMS4wNTcsMCwwLDEtLjExNzQtMS4zNDIxbC44MDE5LTEuMTQ0MmE3LjEyMSw3LjEyMSwwLDAsMS0uNzExMy0xLjcxMTJsLTEuMzcyNC0uMjQxNmExLjA1NjksMS4wNTY5LDAsMCwxLS44NzU3LTEuMDRWMTUuNzgyNmExLjA1NjksMS4wNTY5LDAsMCwxLC44NzU3LTEuMDRsMS4zNzU3LS4yNDE2YTcuMTEsNy4xMSwwLDAsMSwuNzExNC0xLjcxMTJsLS44MDItMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLC4xMTc1LTEuMzQyMmwuODI1NC0uODI1NEExLjA1NjgsMS4wNTY4LDAsMCwxLDM0LjMyNDUsOS4zNmwxLjE0NDIuODAxOUE3LjEzNTUsNy4xMzU1LDAsMCwxLDM3LjE4LDkuNDUxbC4yNDE2LTEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLDEuMDQtLjg3NTdoMS4xNjc3YTEuMDU2OSwxLjA1NjksMCwwLDEsMS4wNC44NzU3bC4yNDE2LDEuMzcyNGE3LjEyNSw3LjEyNSwwLDAsMSwxLjcxMTIuNzExM0w0My43NjY2LDkuMzZBMS4wNTY5LDEuMDU2OSwwLDAsMSw0NS4xMjU1LDkuNDY3N1ptLTIuMDMsNi44OTg3QTQuMDQzMyw0LjA0MzMsMCwxLDAsMzkuMDUyMywyMC40MWgwQTQuMDQ2NSw0LjA0NjUsMCwwLDAsNDMuMDk1NSwxNi4zNjY0WiIgc3R5bGU9ImZpbGw6I2UxMjIyOSIvPjxwb2x5Z29uIHBvaW50cz0iMzkuNDEzIDM0Ljc1NyAzOS41MzcgMzQuNzU3IDM5LjY3NSAzNC43NTcgMzkuNjc1IDEwOS41MSAzOS41MzcgMTA5LjUxIDM5LjQxMyAxMDkuNTEgMzkuNDEzIDM0Ljc1NyAzOS40MTMgMzQuNzU3IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojOTk5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS13aWR0aDowLjMwODg1NDQ1MDU2MDE2MThweDtmaWxsLXJ1bGU6ZXZlbm9kZCIvPjwvc3ZnPg==);\n",
       "    float:left;\n",
       "    margin-right:20px;\n",
       "    margin-top:-20px;\n",
       "    margin-bottom:20px;\n",
       "}\n",
       "div.todo{\n",
       "    font-weight: bold;\n",
       "    font-size: 1.1em;\n",
       "    margin-top:40px;\n",
       "}\n",
       "div.todo ul{\n",
       "    margin: 0.2em;\n",
       "}\n",
       "div.todo li{\n",
       "    margin-left:60px;\n",
       "    margin-top:0;\n",
       "    margin-bottom:0;\n",
       "}\n",
       "\n",
       "\n",
       "</style>\n",
       "\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "FIDLE 2020 - Practical Work Module\n",
      "Version              : 0.57 DEV\n",
      "Run time             : Wednesday 16 September 2020, 16:00:46\n",
      "TensorFlow version   : 2.0.0\n",
      "Keras version        : 2.2.4-tf\n",
      "Current place        : Fidle at HOME\n",
      "Datasets dir         : /home/pjluc/datasets\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "source": [
    "import os, time, sys\n",
    "import csv\n",
    "import math, random\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "import matplotlib.pyplot as plt\n",
    "import h5py\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "from skimage.morphology import disk\n",
    "from skimage.util import img_as_ubyte\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "from skimage.filters import rank\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "from skimage import io, color, exposure, transform\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "from importlib import reload\n",
    "sys.path.append('..')\n",
    "import fidle.pwk as ooo\n",
    "\n",
    "place, datasets_dir = ooo.init()"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2 - Read the dataset\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "Description is available there : http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset\n",
    " - Each directory contains one CSV file with annotations (\"GT-<ClassID>.csv\") and the training images\n",
    " - First line is fieldnames: Filename;Width;Height;Roi.X1;Roi.Y1;Roi.X2;Roi.Y2;ClassId  \n",
    "    \n",
    "### 2.1 - Understanding the dataset\n",
    "The original dataset is in : **\\<dataset_dir\\>/origine.**  \n",
    "There is 3 subsets : **Train**, **Test** and **Meta**.  \n",
    "Each subset have an **csv file** and a **subdir**.\n",
    "    "
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Width</th>\n",
       "      <th>Height</th>\n",
       "      <th>Roi.X1</th>\n",
       "      <th>Roi.Y1</th>\n",
       "      <th>Roi.X2</th>\n",
       "      <th>Roi.Y2</th>\n",
       "      <th>ClassId</th>\n",
       "      <th>Path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>53</td>\n",
       "      <td>54</td>\n",
       "      <td>6</td>\n",
       "      <td>5</td>\n",
       "      <td>48</td>\n",
       "      <td>49</td>\n",
       "      <td>16</td>\n",
       "      <td>Test/00000.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>42</td>\n",
       "      <td>45</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>36</td>\n",
       "      <td>40</td>\n",
       "      <td>1</td>\n",
       "      <td>Test/00001.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>48</td>\n",
       "      <td>52</td>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "      <td>43</td>\n",
       "      <td>47</td>\n",
       "      <td>38</td>\n",
       "      <td>Test/00002.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>27</td>\n",
       "      <td>29</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>22</td>\n",
       "      <td>24</td>\n",
       "      <td>33</td>\n",
       "      <td>Test/00003.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>60</td>\n",
       "      <td>57</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>55</td>\n",
       "      <td>52</td>\n",
       "      <td>11</td>\n",
       "      <td>Test/00004.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>52</td>\n",
       "      <td>56</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>47</td>\n",
       "      <td>51</td>\n",
       "      <td>38</td>\n",
       "      <td>Test/00005.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>147</td>\n",
       "      <td>130</td>\n",
       "      <td>12</td>\n",
       "      <td>12</td>\n",
       "      <td>135</td>\n",
       "      <td>119</td>\n",
       "      <td>18</td>\n",
       "      <td>Test/00006.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>32</td>\n",
       "      <td>33</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>12</td>\n",
       "      <td>Test/00007.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>45</td>\n",
       "      <td>50</td>\n",
       "      <td>6</td>\n",
       "      <td>5</td>\n",
       "      <td>40</td>\n",
       "      <td>45</td>\n",
       "      <td>25</td>\n",
       "      <td>Test/00008.png</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>81</td>\n",
       "      <td>86</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>74</td>\n",
       "      <td>79</td>\n",
       "      <td>35</td>\n",
       "      <td>Test/00009.png</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Width  Height  Roi.X1  Roi.Y1  Roi.X2  Roi.Y2  ClassId            Path\n",
       "0     53      54       6       5      48      49       16  Test/00000.png\n",
       "1     42      45       5       5      36      40        1  Test/00001.png\n",
       "2     48      52       6       6      43      47       38  Test/00002.png\n",
       "3     27      29       5       5      22      24       33  Test/00003.png\n",
       "4     60      57       5       5      55      52       11  Test/00004.png\n",
       "5     52      56       5       5      47      51       38  Test/00005.png\n",
       "6    147     130      12      12     135     119       18  Test/00006.png\n",
       "7     32      33       5       5      26      28       12  Test/00007.png\n",
       "8     45      50       6       5      40      45       25  Test/00008.png\n",
       "9     81      86       7       7      74      79       35  Test/00009.png"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "df = pd.read_csv(f'{datasets_dir}/GTSRB/origine/Test.csv', header=0)\n",
    "display(df.head(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 - Usefull functions\n",
    "A nice function to read a subset..."
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "execution_count": 3,
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [],
   "source": [
    "def  read_csv_dataset(csv_file): \n",
    "    '''\n",
    "    Reads traffic sign data from German Traffic Sign Recognition Benchmark dataset.\n",
    "    Arguments:  \n",
    "        csv filename :  Description file, Example /data/GTSRB/Train.csv\n",
    "    Returns:\n",
    "        x,y          :  np array of images, np array of corresponding labels\n",
    "    '''\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "    path = os.path.dirname(csv_file)\n",
    "    name = os.path.basename(csv_file)\n",
    "\n",
    "    # ---- Read csv file\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    #\n",
    "    df = pd.read_csv(csv_file, header=0)\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    \n",
    "    # ---- Get filenames and ClassIds\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    #\n",
    "    filenames = df['Path'].to_list()\n",
    "    y         = df['ClassId'].to_list()\n",
    "    x         = []\n",
    "    \n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    # ---- Read images\n",
    "    #\n",
    "    for filename in filenames:\n",
    "        image=io.imread(f'{path}/{filename}')\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "        x.append(image)\n",
    "        ooo.update_progress(name,len(x),len(filenames))\n",
    "    \n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    # ---- Return\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    #\n",
    "    return np.array(x,dtype=object),np.array(y)"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "### 2.2 - Read the data\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "We will read the following datasets:\n",
    " - **x_train, y_train** : Learning data\n",
    " - **x_test, y_test** : Validation or test data\n",
    " - x_meta, y_meta : Illustration data\n",
    " \n",
    "The learning data will be randomly mixted and the illustration data (Meta) sorted.  \n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "Will take about 1'30s on HPC."
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "execution_count": 4,
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Train.csv        [########################################] 100.0% of 39209\n",
      "Test.csv         [########################################] 100.0% of 12630\n",
      "Meta.csv         [########################################] 100.0% of 43\n",
      "CPU times: user 15.7 s, sys: 35.3 s, total: 51 s\n",
      "Wall time: 51 s\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "source": [
    "%%time\n",
    "\n",
    "# ---- Read datasets\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "(x_train,y_train) = read_csv_dataset(f'{datasets_dir}/GTSRB/origine/Train.csv')\n",
    "(x_test ,y_test)  = read_csv_dataset(f'{datasets_dir}/GTSRB/origine/Test.csv')\n",
    "(x_meta ,y_meta)  = read_csv_dataset(f'{datasets_dir}/GTSRB/origine/Meta.csv')\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    \n",
    "# ---- Shuffle train set\n",
    "x_train, y_train = ooo.shuffle_np_dataset(x_train, y_train)\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "# ---- Sort Meta\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "combined = list(zip(x_meta,y_meta))\n",
    "combined.sort(key=lambda x: x[1])\n",
    "x_meta,y_meta = zip(*combined)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "## Step 3 - Few statistics about train dataset\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "We want to know if our images are homogeneous in terms of size, ratio, width or height.\n",
    "\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "### 3.1 - Do statistics "
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "execution_count": 5,
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [],
   "source": [
    "train_size  = []\n",
    "train_ratio = []\n",
    "train_lx    = []\n",
    "train_ly    = []\n",
    "\n",
    "test_size   = []\n",
    "test_ratio  = []\n",
    "test_lx     = []\n",
    "test_ly     = []\n",
    "\n",
    "for image in x_train:\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    (lx,ly,lz) = image.shape\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    train_size.append(lx*ly/1024)\n",
    "    train_ratio.append(lx/ly)\n",
    "    train_lx.append(lx)\n",
    "    train_ly.append(ly)\n",
    "\n",
    "for image in x_test:\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    (lx,ly,lz) = image.shape\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "    test_size.append(lx*ly/1024)\n",
    "    test_ratio.append(lx/ly)\n",
    "    test_lx.append(lx)\n",
    "    test_ly.append(ly)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "### 3.2 - Show statistics"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "execution_count": 6,
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x_train shape :  (39209,)\n",
      "y_train shape :  (39209,)\n",
      "x_test  shape :  (12630,)\n",
      "y_test  shape :  (12630,)\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
     ]
    },
    {
     "data": {
      "image/png": "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\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "text/plain": [
       "<Figure size 1152x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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
Loading
Loading full blame...