TP-reseaux-profond/TP7.ipynb

1554 lines
298 KiB
Plaintext
Raw Permalink Normal View History

2023-06-22 18:35:38 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "CVz03XXMKMoz"
},
"source": [
"# Détection d'objet : version simplifiée de YOLO\n",
"\n",
"<center> <img src=\"https://drive.google.com/uc?id=1V4aAS7K_Akj83apuMZ2vRjNvjgdgoOCh\" width=500></center>\n",
"<caption><center> Pipeline de l'algorithme YOLO ([Redmon 2016]) </center></caption>\n",
"\n",
"Dans ce TP, nous allons tenter d'aller un peu plus loin que le TP précédent en considérant le problème plus complexe de la détection d'objet, c'est-à-dire de la localisation et la classification conjointe de tous les objets dans l'image ; pour cela nous allons implémenter une version simplifiée de YOLO. Cette version est considérée simplifiée car ne reprenant pas l'intégralité des éléments décrite dans l'article de Redmon (par exemple, sur le choix de l'optimiseur). Une des simplifications principales est également que nous ne considérerons **qu'un objet par cellule**.\n",
"\n",
"Pour rappel, l'idée de YOLO est de découper l'image en une grille de cellules et de réaliser une prédiction de plusieurs boîtes englobantes ainsi qu'une classification par cellule. La vidéo de la cellule suivante rappelle les concepts vus en cours sur YOLO et la détection d'objet en général.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "H-8wH0b0jquq"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"640\"\n",
" height=\"360\"\n",
" src=\"https://video.polymny.studio/?v=012cd29c-db98-458f-80d3-6cc5c1da9be3/\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" \n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7fa23d798610>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import IFrame\n",
"IFrame(\"https://video.polymny.studio/?v=012cd29c-db98-458f-80d3-6cc5c1da9be3/\", width=640, height=360)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Nsjid8knt6GZ"
},
"source": [
"Récupération des données"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "wvf5aZetUIE0"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fatal: le chemin de destination 'wildlife' existe déjà et n'est pas un répertoire vide.\n"
]
}
],
"source": [
"!git clone https://github.com/axelcarlier/wildlife.git"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MZu_3SudL_ll"
},
"source": [
"\n",
"## Fonctions utiles"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hw4t0vv5uAYv"
},
"source": [
"Définition des différentes variables utiles pour la suite"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "79AGCFLvMUlw"
},
"outputs": [],
"source": [
"IMAGE_SIZE = 64 # Dimension des images en entrée du réseau\n",
"CELL_PER_DIM = 8 # Nombre de cellules en largeur et en hauteur\n",
"BOX_PER_CELL = 1 # Nombre d'objets par cellule\n",
"NB_CLASSES = 4 # Nombre de classes du problème\n",
"PIX_PER_CELL = round(IMAGE_SIZE/CELL_PER_DIM)\n",
"\n",
"CLASS_LABELS = ['buffalo', 'elephant', 'rhino', 'zebra']"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ynBA-Pn5RUmY"
},
"source": [
"### Chargement des données"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qyJTpIjFTGii"
},
"source": [
"On charge les images dans la dimension demandée, dans un tenseur $x$. Pour les labels, on ne les structure pas directement dans le format YOLO, mais on les place dans une liste de liste de listes : la longueur de la liste parente est celle du nombre d'images de la base, celle de la liste intermédiaire est celle du nombre d'objets d'une image donnée, et enfin la liste de plus bas niveau a une longueur 5 et contiendra les coordonnées de boîte englobante et les labels de classe associés. "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "gStC1HJXTFe8"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_918015/1607050384.py:40: DeprecationWarning: ANTIALIAS is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.LANCZOS instead.\n",
" img = img.resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"import math\n",
"\n",
"\n",
"import PIL\n",
"from PIL import Image\n",
"import glob, os, sys\n",
"\n",
"for file in glob.glob(\"*.txt\"):\n",
" print(file)\n",
"\n",
"def load_data_detection(ds_path):\n",
" \n",
" y_paths = []\n",
" # Détermination du nombre d'images total\n",
" for c in CLASS_LABELS:\n",
" path = ds_path + c + '/'\n",
" for file in os.listdir(path):\n",
" if file.endswith('.txt'):\n",
" y_paths.append(os.path.join(path, file))\n",
"\n",
" dataset_size = len(y_paths)\n",
" \n",
" # Préparation des structures de données pour x et y\n",
" x = np.zeros((dataset_size, IMAGE_SIZE, IMAGE_SIZE, 3))\n",
" y = []\n",
"\n",
" for i in range(len(y_paths)):\n",
" text_path = y_paths[i]\n",
" img_path = text_path[:-3] + 'jpg'\n",
" \n",
" if not os.path.exists(img_path):\n",
" img_path = text_path[:-3] + 'JPG'\n",
"\n",
" # Lecture de l'image : on va remplir la variable x\n",
" # Lecture de l'image\n",
" img = Image.open(img_path)\n",
" # Mise à l'échelle de l'image\n",
" img = img.resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)\n",
" # Remplissage de la variable x\n",
" x[i] = np.asarray(img, dtype=np.int32)\n",
"\n",
" # Texte : coordonnées de boîtes englobantes pour remplir y\n",
" boxes = []\n",
" # Texte : coordonnées de boîtes englobantes pour remplir y\n",
" text_file = open(text_path, \"r\")\n",
" # Récupération des lignes du fichier texte\n",
" rows = text_file.read().split('\\n')\n",
" # Parcours de chaque ligne\n",
" for row in rows:\n",
" if row != '':\n",
" # Séparation des différentes informations\n",
" row = list(row.split(' '))\n",
" box = []\n",
" # réorganisation : les 4 coordonnées de boîte englobantes (castées en flottants) d'abord\n",
" for r in row[1:]:\n",
" box.append(float(r))\n",
" \n",
" box_normal = [box[0]-box[2]/2, box[1]-box[3]/2, box[0]+box[2]/2, box[1]+box[3]/2] \n",
"\n",
" # Puis le label de classe (casté en entier) à la suite\n",
" box.append(int(row[0]))\n",
" boxes.append(box)\n",
"\n",
" y.append(boxes)\n",
" return x, y\n",
"\n",
"# Chemin vers la base de données\n",
"ds_path = \"./wildlife/\" \n",
"x, y = load_data_detection(ds_path)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1HQNMBwSDhXp"
},
"source": [
"### Affichage des données\n",
"\n",
"Le code ci-dessous vous permettra d'afficher les images ainsi que leurs boîtes englobantes associées. On peut spécifier l'id d'une image en particulier ou, si l'on en spécifie pas, visualiser une image aléatoire."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "gK0Xl-CgDjjd"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from scipy.special import softmax\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def print_data_detection(x, y, id=None, classes=CLASS_LABELS, image_size=IMAGE_SIZE):\n",
" if id==None:\n",
" # Tirage aléatoire d'une image dans la base\n",
" num_img = np.random.randint(x.shape[0]) \n",
" else:\n",
" num_img = id\n",
"\n",
" img = x[num_img]\n",
" if np.max(img) > 1:\n",
" img = img/255\n",
" boxes = y[num_img]\n",
"\n",
" colors = [\"blue\", \"yellow\", \"red\", \"orange\"] # Différentes couleurs pour les différentes classes\n",
"\n",
" # Affichage de l'image\n",
" plt.imshow(img)\n",
" for box in boxes:\n",
"\n",
" # Détermination de la classe\n",
" class_id = box[4]\n",
" \n",
" # Détermination des extrema de la boîte englobante\n",
" p_x = [(box[0]-box[2]/2) * IMAGE_SIZE, (box[0]+box[2]/2) * IMAGE_SIZE]\n",
" p_y = [(box[1]-box[3]/2) * IMAGE_SIZE, (box[1]+box[3]/2) * IMAGE_SIZE]\n",
"\n",
" # Affichage de la boîte englobante, dans la bonne couleur\n",
" plt.plot([p_x[0], p_x[0]],p_y,color=colors[class_id])\n",
" plt.plot([p_x[1], p_x[1]],p_y,color=colors[class_id])\n",
" plt.plot(p_x,[p_y[0],p_y[0]],color=colors[class_id])\n",
" plt.plot(p_x,[p_y[1],p_y[1]],color=colors[class_id], label=classes[class_id])\n",
" #plt.title(\"Vérité Terrain : Image {}\".format(num_img, classes[class_id]))\n",
" \n",
" plt.legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n",
" plt.axis('off')\n",
" plt.show() \n",
"\n",
"\n",
"print_data_detection(x, y, id=22)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "77EZpBu8F1Y2"
},
"source": [
"### Écriture des labels au format YOLO"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JOVhY98p5WDZ"
},
"source": [
"Les deux fonctions ci-dessous sont essentielles car elles permettent de convertir les boîtes englobantes dans le format adopté par YOLO (voir la section Modèle un peu plus bas), mais également de faire l'opération inverse afin d'interpréter la sortie du réseau.\n",
"\n",
"Notez que la fonction *get_box_from_yolo* intègre dans les boîtes englobantes une information supplémentaire par rapport aux données chargées initialement : la probabilité de présence associée à la boîte englobante."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "vYbQVxZXGAET"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[[0.43125, 0.50188, 0.5925, 0.996241, 0]], [[0.565625, 0.499324, 0.51875, 0.639189, 0]]]\n",
"[[[0.43125, 0.50188, 0.5925, 0.996241, 0, 1.0]], [[0.565625, 0.499324, 0.51875, 0.639189, 0, 1.0]]]\n"
]
}
],
"source": [
"from tensorflow.keras.utils import to_categorical\n",
"from scipy.special import expit, softmax\n",
"\n",
"\n",
"def set_box_for_yolo(y, num_classes=NB_CLASSES, image_size=IMAGE_SIZE, cell_size=PIX_PER_CELL):\n",
" nb_cells_per_dim = round(image_size/cell_size)\n",
"\n",
" y_YOLO = np.zeros((len(y), nb_cells_per_dim, nb_cells_per_dim, 1 + 4 + num_classes))\n",
"\n",
" for i in range(len(y)):\n",
" for box in y[i]:\n",
" # Coordonnées du centre de la boîte englobante dans le repère image\n",
" cx, cy = box[0] * image_size, box[1] * image_size\n",
" # Détermination des indices de la cellule dans laquelle tombe le centre\n",
" ind_x, ind_y = int(cx // cell_size), int(cy // cell_size)\n",
" # YOLO : \"The (x, y) coordinates represent the center of the box relative to the bounds of the grid cell.\"\n",
" # On va donc calculer les coordonnées du centre relativement à la cellule dans laquelle il se situe\n",
" y_YOLO[i, ind_x, ind_y, 1] = (cx - ind_x * cell_size) / cell_size\n",
" y_YOLO[i, ind_x, ind_y, 2] = (cy - ind_y * cell_size) / cell_size\n",
" # Largeur et hauteur de boîte\n",
" y_YOLO[i, ind_x, ind_y, 3] = box[2]\n",
" y_YOLO[i, ind_x, ind_y, 4] = box[3]\n",
"\n",
" # Indice de confiance de la boîte englobante pour la cellule correspondante\n",
" y_YOLO[i, ind_x, ind_y, 0] = 1\n",
" # On range les probabilités de classe à la fin du vecteur ([ Présence ; cx ; cy ; w ; h ; CLASSES])\n",
" y_YOLO[i, ind_x, ind_y, 5:] = to_categorical(box[4], num_classes=num_classes)\n",
"\n",
" return y_YOLO\n",
"\n",
"# Si mode = 'pred', il s'agit d'une prédiction du réseau, il faut alors utiliser la fonction sigmoide\n",
"# pour obtenir la présence prédite, et la fonction softmax pour obtenir les probabilités de classe \n",
"def get_box_from_yolo(y_YOLO, mode=None, confidence_threshold=0.5, num_classes=NB_CLASSES, image_size=IMAGE_SIZE, cell_size=PIX_PER_CELL):\n",
" nb_cells_per_dim = round(image_size/cell_size)\n",
"\n",
" y = []\n",
" for i in range(y_YOLO.shape[0]):\n",
" boxes = []\n",
" for ind_x in range(cell_size):\n",
" for ind_y in range(cell_size):\n",
" if mode == 'pred':\n",
" presence = expit(y_YOLO[i, ind_x, ind_y, 0])\n",
" classes_probabilities = softmax(y_YOLO[i, ind_x, ind_y, 5:])\n",
" # coords = expit(y_YOLO[i, ind_x, ind_y, 1:5])\n",
" else:\n",
" presence = y_YOLO[i, ind_x, ind_y, 0]\n",
" classes_probabilities = y_YOLO[i, ind_x, ind_y, 5:]\n",
"\n",
" coords = y_YOLO[i, ind_x, ind_y, 1:5]\n",
" if presence > confidence_threshold:\n",
"\n",
" box = []\n",
" box.append((coords[0] * cell_size + ind_x * cell_size) / image_size)\n",
" box.append((coords[1] * cell_size + ind_y * cell_size) / image_size)\n",
" box.append(coords[2])\n",
" box.append(coords[3])\n",
" box.append(np.argmax(y_YOLO[i, ind_x, ind_y, 5:]))\n",
" box.append(presence)\n",
" boxes.append(box)\n",
"\n",
" y.append(boxes)\n",
"\n",
" return y \n",
"\n",
"# On s'assure de pouvoir passer d'une représentation à l'autre sans altérer les données\n",
"print(y[:2])\n",
"print(get_box_from_yolo(set_box_for_yolo(y[:2])))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AVXo7WaCBNWT"
},
"source": [
"### Augmentation de données"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vgXVpt6z6jRU"
},
"source": [
"Il nous faut une version récente de la librairie Albumentations pour pouvoir profiter des fonctionnalités lies aux boîtes englobantes."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "_anbyrRRBRK9"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found existing installation: opencv-python-headless 4.1.2.30\n",
"Uninstalling opencv-python-headless-4.1.2.30:\n",
" Would remove:\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/*\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/opencv_python_headless-4.1.2.30.dist-info/*\n",
" Would not remove (might be manually added):\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSans-Bold.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSans-BoldOblique.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSans-ExtraLight.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSans-Oblique.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSans.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSansCondensed-Bold.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSansCondensed-BoldOblique.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSansCondensed-Oblique.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/fonts/DejaVuSansCondensed.ttf\n",
" /tmp/deepl/.env/lib/python3.8/site-packages/cv2/qt/plugins/platforms/libqxcb.so\n",
"\u001b[31mERROR: Exception:\n",
"Traceback (most recent call last):\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/cli/base_command.py\", line 186, in _main\n",
" status = self.run(options, args)\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py\", line 78, in run\n",
" uninstall_pathset = req.uninstall(\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/req/req_install.py\", line 687, in uninstall\n",
" uninstalled_pathset.remove(auto_confirm, verbose)\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py\", line 388, in remove\n",
" if auto_confirm or self._allowed_to_proceed(verbose):\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py\", line 431, in _allowed_to_proceed\n",
" return ask('Proceed (y/n)? ', ('y', 'n')) == 'y'\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/utils/misc.py\", line 240, in ask\n",
" _check_no_input(message)\n",
" File \"/tmp/deepl/.env/lib/python3.8/site-packages/pip/_internal/utils/misc.py\", line 230, in _check_no_input\n",
" raise Exception(\n",
"Exception: No input was expected ($PIP_NO_INPUT set); question: Proceed (y/n)? \u001b[0m\n",
"Requirement already satisfied: opencv-python-headless==4.1.2.30 in ./.env/lib/python3.8/site-packages (4.1.2.30)\n",
"Requirement already satisfied: numpy>=1.17.3 in ./.env/lib/python3.8/site-packages (from opencv-python-headless==4.1.2.30) (1.22.3)\n",
"albumentations==1.1.0 is successfully installed\n"
]
}
],
"source": [
"!pip uninstall --no-input opencv-python-headless==4.5.5.62\n",
"!pip install --no-input opencv-python-headless==4.1.2.30\n",
"!pip install --no-input -q -U albumentations\n",
"!echo \"$(pip freeze | grep albumentations) is successfully installed\""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pXIF0AMf6pqF"
},
"source": [
"Dans la cellule ci-dessous, il vous faudra intégrer les augmentations que vous aurez choisi. **Attention, ne faites cette partie que dans un second temps, lorsque vous aurez une première version du réseau qui fonctionnera !**\n",
"\n",
"Aidez-vous de [cette page](https://albumentations.ai/docs/getting_started/transforms_and_targets/) pour déterminer des augmentations qui peuvent fonctionner."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "2-z8AmRpCdLK"
},
"outputs": [],
"source": [
"from albumentations import (Compose, HorizontalFlip)\n",
"import albumentations as A\n",
"\n",
"AUGMENTATIONS_TRAIN = Compose([\n",
" #### A COMPLETER, MAIS SEULEMENT LORSQUE VOUS AVEZ UN RESEAU QUI (SUR-)APPREND !\n",
" # HorizontalFlip(p=0.5), \n",
" # ...\n",
"], bbox_params=A.BboxParams(format='yolo'))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q2oSuKEV7DyU"
},
"source": [
"L'objet Sequence défini ci-dessous nous permettra la mise en batch de nos données. On est obligé d'avoir recours à cette solution (plutôt qu'un ImageDataGenerator comme lors du TP3) car ici les augmentations à appliquer altèrent également les labels, ce qui n'est pas supporté par un ImageDataGenerator."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "yALbgasfBYOI"
},
"outputs": [],
"source": [
"from tensorflow.keras.utils import Sequence\n",
"\n",
"class YOLOSequence(Sequence):\n",
" # Initialisation de la séquence avec différents paramètres\n",
" def __init__(self, x_set, y_set, batch_size,augmentations):\n",
" self.x, self.y = x_set, y_set\n",
" self.batch_size = batch_size\n",
" self.augment = augmentations\n",
" self.indices1 = np.arange(x_set.shape[0], dtype='int') \n",
" np.random.shuffle(self.indices1) # Les indices permettent d'accéder\n",
" # aux données et sont randomisés à chaque epoch pour varier la composition\n",
" # des batches au cours de l'entraînement\n",
"\n",
" # Fonction calculant le nombre de pas de descente du gradient par epoch\n",
" def __len__(self):\n",
" return int(np.ceil(len(self.x) / float(self.batch_size)))\n",
" \n",
"\n",
" # Il y a des problèmes d'arrondi dans les conversions de boîtes englobantes \n",
" # internes à la librairie Albumentations\n",
" # Pour les contourner, si les boîtes sont trop proches des bords, on les érode un peu\n",
" def erode_bounding_box(self, box, epsilon = 0.02):\n",
" eroded_box = []\n",
" \n",
" xmin = max(box[0] - box[2]/2, epsilon)\n",
" ymin = max(box[1] - box[3]/2, epsilon)\n",
" xmax = min(box[0] + box[2]/2, 1-epsilon)\n",
" ymax = min(box[1] + box[3]/2, 1-epsilon)\n",
" \n",
" cx = xmin + (xmax - xmin)/2\n",
" cy = ymin + (ymax - ymin)/2\n",
" width = xmax - xmin\n",
" height = ymax - ymin\n",
" \n",
" eroded_box = [cx, cy, width, height, box[4]]\n",
" return eroded_box\n",
"\n",
" # Application de l'augmentation de données à chaque image du batch et aux\n",
" # boîtes englobantes associées\n",
" def apply_augmentation(self, bx, by):\n",
"\n",
" batch_x = np.zeros((bx.shape[0], IMAGE_SIZE, IMAGE_SIZE, 3))\n",
" batch_y = []\n",
"\n",
" # Pour chaque image du batch\n",
" for i in range(len(bx)):\n",
" boxes = []\n",
" # Erosion des boîtes englobantes\n",
" for box in by[i]:\n",
" boxes.append(self.erode_bounding_box(box))\n",
"\n",
" # Application de l'augmentation à l'image et aux boîtes englobantes\n",
" transformed = self.augment(image=bx[i].astype('float32'), bboxes=boxes)\n",
" batch_x[i] = transformed['image']\n",
" batch_y_transformed = transformed['bboxes']\n",
" batch_y.append(batch_y_transformed)\n",
"\n",
" return batch_x, batch_y\n",
"\n",
" # Fonction appelée à chaque nouveau batch : sélection et augmentation des données\n",
" def __getitem__(self, idx):\n",
" # Sélection des indices des données du prochain batch\n",
" batch_indices = self.indices1[idx * self.batch_size:(idx + 1) * self.batch_size]\n",
" # Récupération des données puis des labels du batch\n",
" batch_x = self.x[batch_indices]\n",
" batch_boxes = [self.y[item] for item in list(batch_indices)]\n",
" # Application de l'augmentation de données\n",
" batch_x_aug, batch_boxes_aug = self.apply_augmentation(batch_x, batch_boxes)\n",
" \n",
" # Préparation des données pour le réseau :\n",
" # Normalisation des entrées\n",
" batch_x_aug = batch_x_aug/255\n",
" # Passage des sorties au format YOLO\n",
" batch_y_YOLO = set_box_for_yolo(batch_boxes_aug)\n",
" \n",
" return np.array(batch_x_aug), batch_y_YOLO\n",
"\n",
" # Fonction appelée à la fin d'un epoch ; on randomise les indices d'accès aux données\n",
" def on_epoch_end(self):\n",
" np.random.shuffle(self.indices1)\n",
" \n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"id": "FekjKk5rDcrY"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Instanciation d'une Sequence\n",
"train_gen = YOLOSequence(x[:1], y[:1], 1, augmentations=AUGMENTATIONS_TRAIN)\n",
"\n",
"# Pour tester la séquence, nous sélectionnons les éléments du premier batch et les affichons\n",
"batch_x, batch_y = train_gen.__getitem__(0)\n",
"\n",
"print_data_detection(batch_x, get_box_from_yolo(batch_y))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FDkeWyl0TCJ1"
},
"source": [
"## Implémentation de YOLO"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tT7sNJTC120-"
},
"source": [
"### Modèle"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zrEtJvKAwsB2"
},
"source": [
"\n",
"<center> <img src=\"https://drive.google.com/uc?id=1_wXc_gTIAr37STaxu3chq1EEjVSKv6a5\" width=500></center>\n",
"<caption><center> Illustration de la couche de sortie de YOLO. </center></caption>\n",
"\n",
"Le modèle que je vous propose ci-dessous n'est qu'une possibilité parmi beaucoup d'autres. \n",
"A vous de compléter la dernière couche pour avoir une sortie de la bonne dimension.\n",
"\n",
"**Remarque importante** : comme le tenseur de sortie de YOLO est un peu complexe à manipuler, on choisit ici de regrouper l'ensemble des prédictions dans une seule et même sortie, ce qui nous oblige à utiliser la même fonction d'activation pour toutes nos sorties. On utilisera donc l'activation **linéaire** pour toutes ces sorties. On appliquera les fonctions sigmoïde et softmax pour les sorties \"présence\" et \"probablités de classe\" directement dans la fonction de coût !"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"id": "o3VZsE7EmRPC"
},
"outputs": [],
"source": [
"from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Reshape, Dropout, Input\n",
"from tensorflow.keras.models import Model, Sequential\n",
"from tensorflow.keras import regularizers\n",
"\n",
"\n",
"def create_model_YOLO(input_shape=(64, 64, 3)):\n",
" input_layer = Input(shape=input_shape)\n",
"\n",
" conv1 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(input_layer)\n",
" conv1 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)\n",
" pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)\n",
" \n",
" conv2 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)\n",
" conv2 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)\n",
" pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)\n",
" \n",
" conv3 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)\n",
" conv3 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)\n",
" pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)\n",
"\n",
" conv4 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)\n",
"\n",
" output = Conv2D(NB_CLASSES + 5 * BOX_PER_CELL, 1, activation = 'linear')(conv4)\n",
"\n",
" model = Model(input_layer, output)\n",
"\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"id": "qGi3Yz8Tm4li"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"model_6\"\n",
"_________________________________________________________________\n",
" Layer (type) Output Shape Param # \n",
"=================================================================\n",
" input_8 (InputLayer) [(None, 64, 64, 3)] 0 \n",
" \n",
" conv2d_59 (Conv2D) (None, 64, 64, 32) 896 \n",
" \n",
" conv2d_60 (Conv2D) (None, 64, 64, 32) 9248 \n",
" \n",
" max_pooling2d_21 (MaxPoolin (None, 32, 32, 32) 0 \n",
" g2D) \n",
" \n",
" conv2d_61 (Conv2D) (None, 32, 32, 64) 18496 \n",
" \n",
" conv2d_62 (Conv2D) (None, 32, 32, 64) 36928 \n",
" \n",
" max_pooling2d_22 (MaxPoolin (None, 16, 16, 64) 0 \n",
" g2D) \n",
" \n",
" conv2d_63 (Conv2D) (None, 16, 16, 128) 73856 \n",
" \n",
" conv2d_64 (Conv2D) (None, 16, 16, 128) 147584 \n",
" \n",
" max_pooling2d_23 (MaxPoolin (None, 8, 8, 128) 0 \n",
" g2D) \n",
" \n",
" conv2d_65 (Conv2D) (None, 8, 8, 1024) 1180672 \n",
" \n",
" conv2d_66 (Conv2D) (None, 8, 8, 9) 9225 \n",
" \n",
"=================================================================\n",
"Total params: 1,476,905\n",
"Trainable params: 1,476,905\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model = create_model_YOLO()\n",
"model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z7QasIJE2wiG"
},
"source": [
"### Fonction de coût"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yuCP3Ju8Uo9e"
},
"source": [
"<center> <img src=\"https://drive.google.com/uc?id=1Fbt_Wh_BqZj8Pwt3-04325ItCkQp5G9X\" style=\"width:500;height:300px;\"></center>\n",
"<caption><center> Détail de la fonction de perte définie dans l'article YOLO v1 </center></caption>\n",
"\n",
"Nous arrivons maintenant à la partie délicate de l'implémentation de YOLO : la définition de la fonction de coût à utiliser.\n",
"\n",
"Comme nous l'avons vu dans le TP4, lorsque l'on écrit une fonction de coût personnalisée en Keras, il est nécessaire d'utiliser uniquement les fonctions présentes sur la page suivante : \n",
"https://keras.rstudio.com/articles/backend.html\n",
"\n",
"En effet cette fonction de coût qui sera appelée pendant l'entraînement traitera des tenseurs, et non des tableau *numpy*. On doit donc utiliser la librairie Tensorflow qui permet de manipuler les tenseurs.\n",
"\n",
"Une partie essentielle de la fonction est déjà écrite : celle qui permet de séparer les données des cellules dites \"vide\" (la vérité terrain ne contient pas de boîte englobante) des \"non vides\".\n",
"\n",
"Le détail de la fonction de coût est indiqué ci-dessus : dans l'article $\\lambda_{\\text{coord}} = 5$ et $\\lambda_{\\text{noobj}} = 0.5$. Les $x_i$, $y_i$, $w_i$, $h_i$ correspondent aux coordonnées d'une boîte englobante, $C_i$ correspond à la probabilité de présence d'un objet dans la cellule, et les $p_i(c)$ sont les probabilités de classe.\n",
"\n",
"A vous de compléter l'expression des sous-fonctions de la fonction de coût (les fonctions *K.sum*, *K.square*, *K.sigmoid* et *K.softmax* devraient vous suffire !). **N'oubliez pas d'appliquer une sigmoïde aux présences ($C_i$) et une softmax aux probabilités de classe $p_i$) !!**\n",
"\n",
"**NB : cette implémentation de la fonction de coût est très simplifiée et prend en compte le fait qu'il n'y a qu'une seule boîte englobante par cellule.**"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"id": "uS91oePKnE_K"
},
"outputs": [],
"source": [
"from keras import backend as K\n",
"\n",
"# Définition de la fonction de perte YOLO\n",
"def YOLOss(lambda_coord, lambda_noobj, batch_size):\n",
"\n",
" # Partie \"verte\" : sous-partie concernant l'indice de confiance et les \n",
" # probabilités de classe dans le cas où une boîte est présente dans la cellule\n",
" def box_loss(y_true, y_pred):\n",
" loss = 0\n",
" loss += K.sum(K.square(y_true[:,0] - K.sigmoid(y_pred[:,0])))\n",
" loss += K.sum(K.sum(K.square(y_true[:, 5:9] - K.softmax(y_pred[:, 5:9]))))\n",
" return loss\n",
"\n",
" # Partie \"bleue\" : sous-partie concernant les coordonnées de boîte englobante \n",
" # dans le cas où une boîte est présente dans la cellule\n",
" def coord_loss(y_true, y_pred):\n",
" loss = 0\n",
" loss += K.sum(K.square(y_true[:,1] - y_pred[:,1]))\n",
" loss += K.sum(K.square(y_true[:,2] - y_pred[:,2]))\n",
"\n",
" loss += K.sum(K.square(K.sqrt(y_true[:,3]) - K.sqrt(y_pred[:,3])))\n",
" loss += K.sum(K.square(K.sqrt(y_true[:,4]) - K.sqrt(y_pred[:,4])))\n",
" return loss\n",
"\n",
"\n",
" # Partie \"rouge\" : sous-partie concernant l'indice de confiance \n",
" # dans le cas où aucune boîte n'est présente dans la cellule\n",
" def nobox_loss(y_true, y_pred):\n",
" loss = 0\n",
" loss += K.sum(K.square(y_true[:,0] - K.sigmoid(y_pred[:,0])))\n",
" return loss\n",
"\n",
"\n",
" def YOLO_loss(y_true, y_pred):\n",
"\n",
" # On commence par reshape les tenseurs de bs x S x S x (5B+C) à (bsxSxS) x (5B+C)\n",
" y_true = K.reshape(y_true, shape=(-1, 9))\n",
" y_pred = K.reshape(y_pred, shape=(-1, 9))\n",
"\n",
" # On cherche (dans les labels y_true) les indices des cellules pour lesquelles au moins la première boîte englobante est présente\n",
" not_empty = K.greater_equal(y_true[:, 0], 1) \n",
" indices = K.arange(0, K.shape(y_true)[0])\n",
" indices_notempty_cells = indices[not_empty]\n",
"\n",
" empty = K.less_equal(y_true[:, 0], 0)\n",
" indices_empty_cells = indices[empty]\n",
"\n",
" # On sépare les cellules de y_true et y_pred avec ou sans boîte englobante\n",
" y_true_notempty = K.gather(y_true, indices_notempty_cells)\n",
" y_pred_notempty = K.gather(y_pred, indices_notempty_cells)\n",
"\n",
" y_true_empty = K.gather(y_true, indices_empty_cells)\n",
" y_pred_empty = K.gather(y_pred, indices_empty_cells)\n",
"\n",
" return (box_loss(y_true_notempty, y_pred_notempty) + lambda_coord*coord_loss(y_true_notempty, y_pred_notempty) + lambda_noobj*nobox_loss(y_true_empty, y_pred_empty))/batch_size\n",
"\n",
" \n",
" # Return a function\n",
" return YOLO_loss"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "urf1W1nl22EP"
},
"source": [
"### Apprentissage"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "J9nL1qrv8o1b"
},
"source": [
"Comme d'habitude, on sépare nos données en plusieurs ensembles (ici apprentissage et validation suffiront)."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"id": "wsW6jpYsvIK7"
},
"outputs": [],
"source": [
"# Séparation des données en ensemble de validation et d'apprentissage\n",
"indices = np.arange(x.shape[0], dtype='int') \n",
"np.random.seed(1)\n",
"np.random.shuffle(indices)\n",
"\n",
"x_train = x[indices[:1355]]\n",
"y_train = [y[i] for i in indices[:1355]]\n",
"\n",
"x_val = x[indices[1355:]]\n",
"y_val = [y[i] for i in indices[1355:]]\n",
"\n",
"y_val_YOLO = set_box_for_yolo(y_val)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_42Z4gjN8xK2"
},
"source": [
"Prenez le temps de tester votre modèle et votre fonction de coût, ainsi que vos réglages d'hyperparamètres, en sur-apprenant sur une image d'abord, puis sur un batch d'images. Entraînez votre réseau et visualisez ses prédictions sur les données d'entraînement, puis de validation, pour obtenir une intuition sur les valeurs de *loss* permettant d'obtenir des résultats \"acceptables\"."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "91QkqtUCZc78"
},
"outputs": [],
"source": [
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.callbacks import ModelCheckpoint\n",
"import tensorflow as tf\n",
"\n",
"\n",
"batch_size=16\n",
"model = create_model_YOLO()\n",
"learning_rate = 1e-4\n",
"opt = Adam(learning_rate=learning_rate) \n",
"\n",
"# Instanciation de la séquence pour préparer les données et, plus tard, \n",
"train_gen = YOLOSequence(x_train, y_train, batch_size, augmentations=AUGMENTATIONS_TRAIN)\n",
"\n",
"# Comme l'entraînement est instable, on déclenche une sauvegarde du modèle à chaque fois que\n",
"# la perte de validation atteint un nouveau minimum\n",
"model_saver = ModelCheckpoint('tmp/best_weights', monitor='val_loss', verbose=1, save_weights_only=True, save_best_only=True, mode='min')\n",
"\n",
"loss=[YOLOss(5, 0.5, batch_size)]\n",
"\n",
"model.compile(loss=loss,\n",
" optimizer=opt)\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.9844\n",
"Epoch 1: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.9844 - val_loss: 5.2965\n",
"Epoch 2/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.9115\n",
"Epoch 2: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.9115 - val_loss: 5.4211\n",
"Epoch 3/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.8580\n",
"Epoch 3: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.8580 - val_loss: 5.2131\n",
"Epoch 4/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.7808\n",
"Epoch 4: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.7808 - val_loss: 5.4535\n",
"Epoch 5/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.7321\n",
"Epoch 5: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.7321 - val_loss: 5.2900\n",
"Epoch 6/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.6989\n",
"Epoch 6: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.6989 - val_loss: 5.3179\n",
"Epoch 7/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.6898\n",
"Epoch 7: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.6898 - val_loss: 5.3656\n",
"Epoch 8/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.7137\n",
"Epoch 8: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.7137 - val_loss: 5.4410\n",
"Epoch 9/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.6198\n",
"Epoch 9: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.6198 - val_loss: 5.3616\n",
"Epoch 10/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.5681\n",
"Epoch 10: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.5681 - val_loss: 5.4706\n",
"Epoch 11/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.5454\n",
"Epoch 11: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.5454 - val_loss: 5.4999\n",
"Epoch 12/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.5339\n",
"Epoch 12: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.5339 - val_loss: 5.5265\n",
"Epoch 13/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.5280\n",
"Epoch 13: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.5280 - val_loss: 5.3426\n",
"Epoch 14/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.5328\n",
"Epoch 14: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.5328 - val_loss: 5.5101\n",
"Epoch 15/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.4303\n",
"Epoch 15: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.4303 - val_loss: 5.4970\n",
"Epoch 16/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.3850\n",
"Epoch 16: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.3850 - val_loss: 5.4678\n",
"Epoch 17/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.3286\n",
"Epoch 17: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.3286 - val_loss: 5.4427\n",
"Epoch 18/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.3441\n",
"Epoch 18: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.3441 - val_loss: 5.4016\n",
"Epoch 19/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.3138\n",
"Epoch 19: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.3138 - val_loss: 5.3618\n",
"Epoch 20/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.2716\n",
"Epoch 20: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.2716 - val_loss: 5.5261\n",
"Epoch 21/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.2530\n",
"Epoch 21: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.2530 - val_loss: 5.5041\n",
"Epoch 22/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.1285\n",
"Epoch 22: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.1285 - val_loss: 5.5205\n",
"Epoch 23/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.1394\n",
"Epoch 23: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.1394 - val_loss: 5.5057\n",
"Epoch 24/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0966\n",
"Epoch 24: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0966 - val_loss: 5.6128\n",
"Epoch 25/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0823\n",
"Epoch 25: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0823 - val_loss: 5.5188\n",
"Epoch 26/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0245\n",
"Epoch 26: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0245 - val_loss: 5.5571\n",
"Epoch 27/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0234\n",
"Epoch 27: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0234 - val_loss: 5.6479\n",
"Epoch 28/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0620\n",
"Epoch 28: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0620 - val_loss: 5.6678\n",
"Epoch 29/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0227\n",
"Epoch 29: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0227 - val_loss: 5.5731\n",
"Epoch 30/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.0236\n",
"Epoch 30: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.0236 - val_loss: 5.5618\n",
"Epoch 31/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.9298\n",
"Epoch 31: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.9298 - val_loss: 5.5772\n",
"Epoch 32/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.8803\n",
"Epoch 32: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.8803 - val_loss: 5.5985\n",
"Epoch 33/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.9596\n",
"Epoch 33: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.9596 - val_loss: 5.5050\n",
"Epoch 34/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.9670\n",
"Epoch 34: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.9670 - val_loss: 5.6204\n",
"Epoch 35/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.9812\n",
"Epoch 35: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.9812 - val_loss: 5.4566\n",
"Epoch 36/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.8827\n",
"Epoch 36: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.8827 - val_loss: 5.4542\n",
"Epoch 37/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7940\n",
"Epoch 37: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7940 - val_loss: 5.5093\n",
"Epoch 38/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7499\n",
"Epoch 38: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7499 - val_loss: 5.5257\n",
"Epoch 39/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7058\n",
"Epoch 39: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7058 - val_loss: 5.5092\n",
"Epoch 40/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7094\n",
"Epoch 40: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7094 - val_loss: 5.5911\n",
"Epoch 41/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7509\n",
"Epoch 41: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7509 - val_loss: 5.6771\n",
"Epoch 42/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7350\n",
"Epoch 42: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7350 - val_loss: 5.6715\n",
"Epoch 43/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7038\n",
"Epoch 43: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7038 - val_loss: 5.4962\n",
"Epoch 44/50\n",
"85/85 [==============================] - ETA: 0s - loss: 1.1871\n",
"Epoch 44: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 1.1871 - val_loss: 5.5976\n",
"Epoch 45/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7698\n",
"Epoch 45: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7698 - val_loss: 5.3620\n",
"Epoch 46/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.8461\n",
"Epoch 46: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.8461 - val_loss: 5.4388\n",
"Epoch 47/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.7162\n",
"Epoch 47: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.7162 - val_loss: 5.3595\n",
"Epoch 48/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.6588\n",
"Epoch 48: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.6588 - val_loss: 5.4414\n",
"Epoch 49/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.6026\n",
"Epoch 49: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.6026 - val_loss: 5.4616\n",
"Epoch 50/50\n",
"85/85 [==============================] - ETA: 0s - loss: 0.5965\n",
"Epoch 50: val_loss did not improve from 5.02758\n",
"85/85 [==============================] - 6s 65ms/step - loss: 0.5965 - val_loss: 5.4642\n"
]
}
],
"source": [
"\n",
"history = model.fit(train_gen,\n",
" epochs=50,\n",
" batch_size=batch_size, \n",
" validation_data=(x_val/255, y_val_YOLO),\n",
" callbacks = [model_saver])\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "q-coL0Hx24Ei"
},
"source": [
"### Test et affichage des résultats"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EIaImTjf1fvF"
},
"source": [
"#### Test de la version à la fin de l'entrainement"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lHD3nVgG2-G4"
},
"source": [
"**Sur l'ensemble d'apprentissage**"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"id": "ZjPnyo6G1b1W"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"y_pred = model.predict(x_train/255)\n",
"y_pred_YOLO = get_box_from_yolo(y_pred, confidence_threshold=0.5, mode='pred')\n",
"print_data_detection(x_train, y_pred_YOLO)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3EmVROimOQml"
},
"source": [
"Une fois les prédictions effectuées, vous pouvez pour aller plus rapidement uniquement relancer l'affichae aléatoire d'un seul résultat."
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"id": "sPZeZxIRg_M1"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAATMAAADnCAYAAABygLHTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABH8klEQVR4nO29abAlx3UmlrVX3f3tS7/eF3SjAYJYCJIACVHiMmMORJOj0QxDlIIzEiWHaVlBzQ+FI+wfDtmOgOaXwjEe/zA1lDlhW4wZTlgYUitoDUUySALCwgVLo7uB3vvt7+639vKP97rO+ZLAo8luj4TC+f503s68WVlZ9fLmd/I75xhFUSiBQCB4q8P82x6AQCAQ3AnIYiYQCCoBWcwEAkElIIuZQCCoBGQxEwgElYC9X+Vn/sn7yqPOPMZ1766jy2X59MlDUPcfX3i1LCchnZbO1wJod3CpQx8MA+rculeWl+aXynIQ+NAuTsOyPBhvQ91z518sy+e7m2X50vMTaNfbHJTln3vsBNR9//vXaUw1nINnX7haln/rs4+X5YMnW9DuX/5vf1mW2+y+lFLq0XcdLctzy1N0LR+v1duiMfeGfahbOtIpy5MsK8vf+/YqtHMCpyzbWv+W6dK1HXoWy81paJf0orJ88fI61B07MVeWM0XjmJuahXadNl2r06hDnZGw98BMy2Jg47tT86jPwsqwzqJ3JEmxLi3ysuya1Ocgxnen16V3IkkSqHMsmruaQ+NP3AjarW3Qc6pp45/q0Bg//Mv/Pb78gp8KsjMTCASVgCxmAoGgEtiXZnYW21Q2kR7NLTXKcnc0hrr5OdpSr69S3dQUUooDK0QVQnMEdesT2qJv2rTmWgbSzCInmrkdDqDO6dA45qxOWTbO1qDd89+ma//VN89B3fQMjXl+Gemj9wpN38JhmqtLN5B+jfo0xpZG75pzRLmsJrGN9V4P2jU6NA7Px8eWOUSdHPacXMeCdrU6+1xDsXQSEpXKY+p/9eYOtPMUjXFhugN1nSbNT2ZTf5tb2MeRg8dpGD7SLyOm/gcRfS/Lc2iXKaLd/TE+dyOgZzFO8L2KUhqXZ9N7sDPZgnb9nL43NTUFdTWH3kG7YO9mhu/VyjzdW+BqNNnGvwXB7UN2ZgKBoBLYd2cmEAj+buLZZ5+dt23780qpe9TbY1OSK6V+mKbpZx588MH1N2ogi5lA8BaEbdufX1xcPDM3N7djmmblHazzPDc2NjbuXl1d/bxS6mNv1GbfxSw06Kg51Gw9I59sYcMe2iVsZlqqDcnWMaihHajrk92tN0G5gWrQ0HqK+s9GaDtx2R3YPkoAWjnZNkz242Ur7GP5AN3L898+D3W1OvUx1q7dalLd2jpJP66c24R2LnvV3vUzp6Bu6gCzGzLbWt1C+0urTTYWy4+hLkvIFtbxmmXZD1xo5zVJmjE1hzbQjetkgypSGvBAs4eOLbI5zdQbULfa7ZblYyc7ZXlnfQjtnn7plbL8jrtWoK7jzZTlekC2KsfBV3WQ0vtiWXifOxnJLCIrhDojovseG9Qu9iKtHc1polCaEbHnWbB1xCzwb6Rdo2dhGWgzM29/M3XP22UhU0op0zSLubm53urq6j1v2uY/5YAEAsEdg/l2WchuYe9+33TNksVMIBBUAvvSTHtMVOfmAGlgo0MUY1o7op9MSHVt+LRFjw3crq8ldBxeM1FpbmVEiSzGJSMT6YBiUgGrjmpvx6MfrqmA6Nx4jPdSrxGlaHVQ+tHt0/Umr6DdseESvdnpEpV68cUb0O7kPYtl+Z33HYe6HUbRLYcoUKBJYfhPcJrhY6sZRMe4gmHxAEpJ1teIcjmaN8ZCjdFaxos7K0glX714oSzHIc637dBc2Yz6njw2B+0uvkaeCeNN9MaoLdJ81Fx6J3K8lGrZ1GdhY+VGSs8ijPB9aTAlfpjRZGVaH7UmPdskRvNCf0Jj9CzyUjBt3BsU7Kl5DvZhKZTNvNVx7tw59/HHHz95/jxzu9nD5z73ueUPfOADg49//OODN/runYIcAAgEgttGURQq17SAt/D7v//7N96w4g5DaKZAIPipcO7cOffIkSP3fOITnzhy//33nw3D0PzkJz95+MSJE2cfffTRk8Ph0FBKqV/4hV848oUvfGFKKaUOHDhw72//9m8v33333WdOnTp19/PPP+8rpdTa2pr1oQ996PipU6fuvu+++05/97vfDfa79htBdmYCwVsdv/qrB9UPf1j78Q1/Atxzz1j963999cc1u3LlivcHf/AHrz/xxBM3zp49e+9v/dZvrT/yyCOXP/rRjx774he/OPXZz352W//O7Oxs+tJLL738xBNPzD3xxBMLX/rSly7/zu/8zvJ99903fuqppy4++eSTzU9/+tNHX3nllZd+kiHvu5jNL3bKcryKcgDHJM7v+Li9tJktaZyRDcrVIkb0emRD8wOsq3lMEjEkG0VhanaamI6/uxnOm+mTPcPNyPYTTnC8Rw9SVI7XXr4Jdc1pkkRcPr8BdZZH9rrFA2TDiSJ0iXrg/pNlOXBwM2wz+UHEJAA/YjNjdsMiQ3tLx6V7S9i9HVhAO+Rgi2x+1gR/+NpTzEZpUP/LSyh3uXqF7F0LHaxTLbr2dpfsc8vzHWi2tEjjshzNrYdFvAiZS5GjUH7RL6guVCj9iFJ67p4mcQkzaps71E5T66jRhMw7VobPwmLznxpk8/MNtFGGzHVqECHTqgolWlpaij/4wQ+Ozp075x44cCB65JFHJkopdf/9948vXbrkvdF3fumXfmlHKaUefvjh8ZNPPjmllFJPP/1088tf/vIFpZT62Mc+NviN3/gNe3t725yenn5j7voGkJ2ZQPBWx/+HHdT/X6jVauVi47p0cmRZVjGZTN5wzfZ9v1BKKdu2izRN71j4o6r8QAgEgrcw3v3udw++8IUvzCil1Fe+8pXm1NRU+pPsypT6MTszz6ej5UNLi1CXF7RFNzTaM12fL8s+izCwHWJkgjqLZNEKkPY4Li3YrkPbd8vA+/N92sk2EqQivk3j78dESwzt1OWu06RC/4s/ew7qhjtElwrt2lFCvwVP/jv6nm3hj82JIxS8MopQntLwKMJDNKb5CQuk9Tw6Q6uN1CkzSaVvpUTbAgtlJp05+hwUTajLmbeHz7ofRihj8WwWlaOO/U8v0bVfv05BLScZajvjnN4Xy0ea6bmdsmwaZFJwLAfa3dghL4Kmj/KRGYveF0ejmb2EvFB48BHLx2cW2fTcayaO0Vf0rloFdaJTWnxbUvhUyD4C8Hu/93s3PvWpTx05derU3UEQ5H/4h3/4+k/ah9BMgUDwU+Guu+6Kb+nKeFkppX73d3937Vb5y1/+8qVb5evXr//gVvmxxx4bP/300+eUUmphYSF76qmnLt7OeOTnQSAQVAL77sxqHlVPL2snY0wFPV3DU626R9twu0a0KnNwGx4E9DkrulDXT2hbXguINhQm0rSUKbATTZHu5kRNaowCJDHSnsYU1TWaSFmusjj3Ux2NsgyJirz6Mp1WPcDi+iulVL3VKcuTESrSc8X6NLpl0be1k3bGWcIUKahhEA0y2AmdayE96vg0j4GNj75ep7ZRQSd5oxAV+gmjjMNU86Rg089PUsMYKZbBKOMo0kThXfbcGd91tECTQdEpyzPuAvbPlPemjd+bZV4WjknjSDQTgvLos23gXEUxUdWCnZyGBQZSME1GQU2k5GGKDvyC24fszASCtybyPM/fVolQ9u73TQ8FZDETCN6a+OHGxkb77bKg7cUzayulfvhmbeQAQCB4CyJN08+srq5+fi++19thU1JGmn2zBvsuZolFaulaHe1itkW2pcxAO9B6SokorIJ+OAxNvT8Mu2V5kmMfEQuEOHLJvuBqkQm4raNItTqH7DZmQvaRMMRrhTH1v7CINrObV8mroNB+BA0W+SA3aRxHTixBu5gpwcMYrx0XNFdmncZvKpSqhAm1S3Mt4GBMdqDcYjYuA9spNsdxhDIZPq1c1e46OB+NOr0y586ht8TsIo35wNyRshyh2U0lTRbYc6QlI8lYghdm7nIUislnWLIa10N7V
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_data_detection(x_train, y_pred_YOLO)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "raKF5JGC3B88"
},
"source": [
"**Sur l'ensemble de validation**"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"id": "X5MKydNv1djI"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"y_pred = model.predict(x_val/255)\n",
"y_pred_YOLO = get_box_from_yolo(y_pred, confidence_threshold=0.5, mode='pred')\n",
"print_data_detection(x_val, y_pred_YOLO)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"id": "gbsnVJ6_0E3e"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_data_detection(x_val, y_pred_YOLO)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FqMHwVaJ1iyN"
},
"source": [
"#### Test de la meilleure version sauvegardée"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "F09SWs1n9iD8"
},
"source": [
"La cellule ci-dessous vous permettra de charger les poids sauvegardés lorsque la meilleur performance a été atteinte sur l'ensemble de validation pendant l'entraînement."
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"id": "RRjn1SLn0JL4"
},
"outputs": [
{
"data": {
"text/plain": [
"<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7fa20aa1dac0>"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.load_weights('tmp/best_weights')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "g66MczLI3GGL"
},
"source": [
"**Sur l'ensemble d'apprentissage**"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"id": "dfytX2yC1AdY"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"y_pred = model.predict(x_train/255)\n",
"y_pred_YOLO = get_box_from_yolo(y_pred, confidence_threshold=0.4, mode='pred')\n",
"print_data_detection(x_train, y_pred_YOLO)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"id": "uXr2p3MHx_hF"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_data_detection(x_train, y_pred_YOLO)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2elJjjts3JtD"
},
"source": [
"**Sur l'ensemble de validation**"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"id": "zBiTzmyu0QqH"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"y_pred = model.predict(x_val/255)\n",
"y_pred_YOLO = get_box_from_yolo(y_pred, confidence_threshold=0.3, mode='pred')\n",
"print_data_detection(x_val, y_pred_YOLO)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"id": "6YkUFRQ70M3t"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print_data_detection(x_val, y_pred_YOLO)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "T1ZZ1P4nOe3F"
},
"source": [
"**Si vous êtes rapide** \n",
"\n",
"Une amélioration possible pourrait être d'inclure une étape supplémentaire de suppression des prédictions \"non maximales\" (*non-max suppression*) pour se débarasser des boîtes redondantes, comme illustré sur la figure ci-dessous :\n",
"\n",
"<center> <img src=\"https://drive.google.com/uc?id=1XDpmffe_x_gDvsQZ_9sr6J5AuJPuSW0B\" width=300>\n",
"<img src=\"https://drive.google.com/uc?id=1b9QgSFQlzOA7aJIbNc2Kl_eEMRDY0pQm\" width=300>\n",
"</center>\n",
"\n",
"Pour cela, référez-vous au cours, il faut procéder de la manière suivante. Une fois les boîtes présentant un indice de confiance inférieur à un seuil (que nous avons fixé à $0.5$ plus tôt dans le TP) éliminées, on sélectionne la boîte englobante d'indice de confiance maximal $b_{max}$. Puis on parcourt l'ensemble des autres prédictions, et on élimine celles associées à la même classe qui présentent une intersection sur union avec $b_{max}$ supérieure à un second seuil (que, soyons honnêtes, on prend également souvent égal à $0.5$).\n",
"\n",
"On procède ainsi jusqu'à avoir visité toutes les boîtes !\n",
"\n",
"\n"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "TP7 - YOLO - Sujet.ipynb",
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": ".env",
"language": "python",
"name": ".env"
},
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}