\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",
" \n",
" "
],
"text/plain": [
""
]
},
"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": [
"