{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "German Traffic Sign Recognition Benchmark (GTSRB)\n", "=================================================\n", "---\n", "Introduction au Deep Learning (IDLE) - S. Aria, E. Maldonado, JL. Parouty - CNRS/SARI/DEVLOG - 2020\n", "\n", "## Episode 2 : First Convolutions\n", "\n", "Our main steps:\n", " - Read dataset\n", " - Build a model\n", " - Train the model\n", " - Model evaluation\n", "\n", "\n", "\n", "\n", "## 1/ Import and init" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras.callbacks import TensorBoard\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import h5py\n", "import os,time\n", "\n", "import idle.pwk as ooo\n", "from importlib import reload\n", "\n", "ooo.init()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2/ Reload dataset\n", "We're going to retrieve a previously recorded dataset. \n", "For example: set-24x24-L" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%time\n", "\n", "dataset ='set-24x24-L'\n", "\n", "# ---- Read dataset\n", "#\n", "filename='./data/'+dataset+'.h5'\n", "with h5py.File(filename) as f:\n", " x_train = f['x_train'][:]\n", " y_train = f['y_train'][:]\n", " x_test = f['x_test'][:]\n", " y_test = f['y_test'][:]\n", "\n", "# ---- Dataset shape\n", "#\n", "(n,lx,ly,lz) = x_train.shape\n", "data_shape = (lx, ly, lz)\n", "\n", "# ---- done\n", "print('Dataset loaded ({:.1f} Mo)\\n'.format(os.path.getsize(filename)/(1024*1024)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3/ Have a look to the dataset\n", "We take a quick look as we go by..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"x_train : \", x_train.shape)\n", "print(\"y_train : \", y_train.shape)\n", "print(\"x_test : \", x_test.shape)\n", "print(\"y_test : \", y_test.shape)\n", "\n", "ooo.plot_images(x_train, y_train, range(6), columns=3, x_size=4, y_size=3)\n", "ooo.plot_images(x_train, y_train, range(36), columns=12, x_size=1, y_size=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4/ Create model\n", "Nous allons maintenant construire un modèle et effectuer un apprentissage.. \n", "\n", "\n", "Some hyperparameters :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "batch_size = 64\n", "num_classes = 43\n", "epochs = 16" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "My models :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# A basic model\n", "#\n", "def get_model_v1():\n", " model = keras.models.Sequential()\n", " model.add( keras.layers.Conv2D(96, (3,3), activation='relu', input_shape=(lx,ly,lz)))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Conv2D(192, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Flatten()) \n", " model.add( keras.layers.Dense(500, activation='relu'))\n", " model.add( keras.layers.Dense(500, activation='relu'))\n", " model.add( keras.layers.Dense(43, activation='softmax'))\n", " return model\n", " \n", "# A more sophisticated model\n", "#\n", "def get_model_v2():\n", " model = keras.models.Sequential()\n", "\n", " model.add( keras.layers.Conv2D(64, (3, 3), padding='same', input_shape=(lx,ly,lz), activation='relu'))\n", " model.add( keras.layers.Conv2D(64, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D(pool_size=(2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Conv2D(128, (3, 3), padding='same', activation='relu'))\n", " model.add( keras.layers.Conv2D(128, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D(pool_size=(2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Conv2D(256, (3, 3), padding='same',activation='relu'))\n", " model.add( keras.layers.Conv2D(256, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D(pool_size=(2, 2)))\n", " model.add( keras.layers.Dropout(0.2))\n", "\n", " model.add( keras.layers.Flatten())\n", " model.add( keras.layers.Dense(512, activation='relu'))\n", " model.add( keras.layers.Dropout(0.5))\n", " model.add( keras.layers.Dense(43, activation='softmax'))\n", " return model\n", "\n", "# My sphisticated model, but small and fast\n", "#\n", "def get_model_v3():\n", " model = keras.models.Sequential()\n", " model.add( keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(lx,ly,lz)))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Conv2D(64, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Conv2D(128, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Conv2D(256, (3, 3), activation='relu'))\n", " model.add( keras.layers.MaxPooling2D((2, 2)))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Flatten()) \n", " model.add( keras.layers.Dense(1152, activation='relu'))\n", " model.add( keras.layers.Dropout(0.5))\n", "\n", " model.add( keras.layers.Dense(43, activation='softmax'))\n", " return model\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ---- The model I want to test..\n", "#\n", "model = get_model_v1()\n", "model.summary()\n", "model.compile(optimizer='adam',\n", " loss='sparse_categorical_crossentropy',\n", " metrics=['accuracy'])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5/ Run model" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%time\n", "\n", "history = model.fit( x_train[:3000], y_train[:3000],\n", " batch_size=batch_size,\n", " epochs=epochs,\n", " verbose=1,\n", " validation_data=(x_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6/ Evaluation" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "score = model.evaluate(x_test, y_test, verbose=0)\n", "\n", "print('Test loss : {:5.4f}'.format(score[0]))\n", "print('Test accuracy : {:5.4f}'.format(score[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Results : \n", "```\n", "set-24x24-L : size=230 Mo, 90.67% \n", "set-24x24-L-LHE : size=230 Mo, 93.90% \n", "set-24x24-RGB : size=784 Mo, 92.82% \n", "set-24x24-RGB-HE : size=784 Mo, 92.64% \n", "set-48x48-L-LHE : size=230 Mo, 97.70% (v2) 1'52\" \n", "set-48x48-RGB-HE : size=xxx Mo, 96.94% (v2) \n", "set-48x48-L-LHE : size=784 Mo, 97.67% (v3) 42\" \n", "...\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 4 }