Créer avec l’IA

Comment passer d’un classeur à la détection d’objets dans les images?

Écrit en date du · Publié le · Mis à jour le · Par Robert Scales, avec l’aide d’outils d’IA · 5 min de lecture

Réponse courte

Un classeur donne une étiquette par image, alors qu’un détecteur transforme le même genre de réseau en une grille où chaque cellule dit si un objet y est centré, où est sa boîte et ce que c’est. Sur des formes synthétiques, un détecteur de 73 000 paramètres construit ainsi a atteint une précision moyenne supérieure à 0,98 à un test de chevauchement strict, après environ 15 secondes d’entraînement.

« Y a-t-il un chat sur cette photo? » et « où se trouve chaque chat sur cette photo? » semblent être des problèmes différents. Dans le code, ils sont étonnamment proches. Le premier réseau finit par faire la moyenne de tout ce qu’il a trouvé dans l’image pour donner une seule réponse. Le second garde les réponses séparées, endroit par endroit.

Ce projet génère ses propres images : des cercles, des carrés et des triangles sur un fond gris bruité, de 64 pixels sur 64. Comme un script les dessine, vous obtenez des étiquettes parfaites, des données illimitées et aucun souci de droits, et l’entraînement prend quelques secondes. Le script est 05_classify_then_detect.py; il exige PyTorch et NumPy et utilise un GPU si vous en avez un. Les résultats ci-dessous ont été obtenus sur le GPU intégré d’un Apple M5 Max avec PyTorch 2.15. Les autres machines n’ont pas été testées.

Partie 1 : le classeur

Le corps compte six petites couches de convolution, des filtres qui glissent sur l’image, avec trois réductions de moitié de la taille de l’image. Une image de 64 sur 64 devient 8 cellules sur 8, chacune décrite par 64 nombres.

import torch.nn as nn

def backbone():
    layers, ch = [], 1
    for out in (16, 32, 64):        # trois réductions de moitié : de 64 à 8 cellules
        layers += [nn.Conv2d(ch, out, 3, padding=1), nn.BatchNorm2d(out), nn.ReLU(),
                   nn.Conv2d(out, out, 3, padding=1), nn.BatchNorm2d(out), nn.ReLU(),
                   nn.MaxPool2d(2)]
        ch = out
    return nn.Sequential(*layers)

class Classifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.body, self.head = backbone(), nn.Linear(64, 3)
    def forward(self, x):
        return self.head(self.body(x).mean((2, 3)))   # la moyenne efface le « où »

Après 600 étapes et 4,7 secondes, avec une forme par image, ce modèle de 72 435 paramètres a réussi 1 000 nouvelles images de test sur 1 000. Le script lui a ensuite montré 200 images contenant trois formes d’au moins deux types. Il a continué à répondre avec une probabilité maximale moyenne de 94 %, une étiquette par image. Il est sûr de lui, alors que la question à laquelle il répond ne correspond plus à l’image. Ce .mean((2, 3)) en est la cause : il jette la position.

Partie 2 : garder la grille

Un détecteur, dans l’esprit de YOLO, remplace cette moyenne et traite le travail comme la prédiction de nombres pour des zones fixes de l’image, le tout en une seule passe. Ici, chacune des 64 cellules prédit sept valeurs.

class Detector(nn.Module):
    def __init__(self):
        super().__init__()
        self.body = backbone()
        self.head = nn.Conv2d(64, 1 + 3 + 3, 1)
        # par cellule : un objet ici?, décalage x, décalage y, taille, puis 3 scores de classe
    def forward(self, x):
        return self.head(self.body(x))

Seulement 260 paramètres séparent les deux modèles. Ce qui change, c’est la cible et la perte, le score que l’entraînement cherche à réduire. La cellule qui contient le centre d’une forme doit dire « oui » et donner la boîte et la classe. Toutes les autres doivent dire « non ». La plupart des cellules sont vides : sans un poids plus élevé pour le « oui », le modèle peut obtenir un bon score en ne prédisant rien du tout.

Ensuite, une étape appelée suppression des non-maximums conserve la plus forte des boîtes qui se chevauchent.

Comment note-t-on des boîtes?

Une boîte est juste si elle chevauche suffisamment la vraie. L’IoU, intersection sur union, est le chevauchement divisé par la surface totale couverte : 1 est parfait et 0,5 est une note de passage courante. La précision moyenne classe toutes les prédictions par confiance et regarde comment la précision tient le coup quand on essaie de trouver davantage d’objets. Le mAP en est la moyenne pour toutes les classes.

Le jeu de test compte 500 images fraîches. Chaque modèle s’est entraîné pendant les mêmes 2 500 étapes, de 15 à 18 secondes, sur une pile fixe d’images :

Images d’entraînementmAP à IoU 0,5mAP à IoU 0,75mAP sur ses images d’entraînement (IoU 0,5)
1000,8880,4061,000
5000,9900,8301,000
2 0000,9930,9891,000
8 0001,0000,9931,000

Le tableau renferme une leçon que le classeur ne pouvait pas montrer. Avec 100 images, le modèle semble acceptable au test souple, 0,888, et faible au test strict, 0,406. Trouver les choses s’apprend plus facilement que les placer avec précision, et le placement exige plus de données. Les quatre modèles sont parfaits sur ce qu’ils ont vu à l’entraînement, ces scores ne disent donc rien.

Le script a ensuite testé le modèle à 8 000 images sur des scènes plus étroites et plus chargées :

TestmAP à IoU 0,5mAP à IoU 0,75
Seulement les plus petites formes (rayon de 4 ou 5 pixels)0,9970,986
Seulement les plus grandes formes (rayon de 10 ou 11 pixels)1,0001,000
Jusqu’à 8 objets, l’entraînement en avait 3 au plus0,9900,971

Sur le processeur, une image a pris 0,65 milliseconde. Cette grille a une limite intégrée : une cellule ne contient qu’un objet, si bien que deux objets centrés dans la même cellule ne peuvent pas être trouvés tous les deux. Les images d’entraînement gardent les formes séparées, ce qui explique en partie ces scores si élevés.

À essayer : modifiez la fonction draw pour que les formes puissent se chevaucher, entraînez de nouveau le modèle à 2 000 images et comparez les deux colonnes de mAP. Prédisez laquelle chute le plus avant de lancer le code.

Qu’est-ce qui change avec de vraies photos?

Presque tout, sauf la structure. Ces scores sont élevés parce que la tâche est facile : formes plates, fond uni, ni éclairage ni perspective, et images de test issues du même procédé que les images d’entraînement. Ils montrent que la méthode fonctionne et comment la mesurer. Ils ne disent rien de la performance d’un détecteur sur vos photos, et rien dans ce projet n’a été testé sur de vraies images.

Avec de vraies images, les étiquettes deviennent le principal coût. Quelqu’un doit dessiner chaque boîte et s’entendre avec ses collègues sur ce qui compte comme un objet. Utilisez un corps préentraîné : les premières couches d’un réseau entraîné sur des millions de photos détectent déjà les contours et les textures, et vos données entraînent surtout la tête. Testez sur des photos d’autres jours, d’autres appareils et d’autres lieux, car partager les images d’une même séance entre entraînement et test, c’est la fuite du projet quatre sous une autre forme. Les personnes sur les images ajoutent des obligations de confidentialité : prévoyez le consentement ou le floutage.

Avant d’entraîner quoi que ce soit, voyez si un simple classeur suffit. Si vous avez seulement besoin de savoir « la tablette est-elle vide? », vous n’avez pas besoin de boîtes. Il faut beaucoup moins d’étiquettes, puisqu’un mot par image se note bien plus vite qu’une boîte autour de chaque objet.

Téléchargez le code de cette série (zip), avec tous les scripts et les résultats enregistrés.

Sources

  1. You Only Look Once: Unified, Real-Time Object Detection — arXiv, 8 juin 2015
  2. A Recipe for Training Neural Networks — Andrej Karpathy, 25 avril 2019

Tiré du Guide de l’intelligence artificielle, par Robert Scales, publié par Holistic Hybrid inc. Partage et adaptation permis selon la licence CC BY-NC-SA 4.0 : citez le guide, mettez un lien vers https://guidetoartificialintelligence.com/fr/apprendre/du-classeur-a-la-detection-objets/, pas d’usage commercial sans permission, et gardez la même licence.

Recevez gratuitement le Guide de l’intelligence artificielle

Abonnez-vous à l’infolettre et recevez le guide gratuit : ce qui a changé en IA, une leçon, un prompt à essayer. Désabonnement en un clic.

Ce que nous faisons de votre adresse

Retour en haut

Affichage

Vos choix sont enregistrés dans ce navigateur seulement. Aucune donnée n’est transmise.

Taille du texte
100 %
Couleurs
Lecture
Autres réglages
Déclaration d’accessibilité

Obtenir l’appli

Ajoutez le guide à votre écran d’accueil. Il s’ouvre comme une application, et les pages déjà lues restent disponibles hors ligne.

Lire sans connexion : télécharger les articles

iPhone et iPad (Safari, Chrome, Edge)

  1. Touchez le bouton Partager (le carré avec une flèche). Dans Chrome et Edge, il est dans la barre d’adresse ou le menu.
  2. Choisissez « Sur l’écran d’accueil ».
  3. Touchez « Ajouter ».

Android (Chrome, Edge, Samsung Internet, Firefox)

  1. Ouvrez le menu du navigateur (⋮ ou ☰).
  2. Choisissez « Installer l’application » ou « Ajouter à l’écran d’accueil ».
  3. Confirmez avec « Installer ».

Ordinateur (Chrome, Edge)

  1. Cliquez sur l’icône d’installation au bout de la barre d’adresse, ou ouvrez le menu du navigateur (⋮ ou …).
  2. Dans Chrome, choisissez « Caster, enregistrer et partager », puis « Installer la page en tant qu’application ». Dans Edge, choisissez « Applications », puis « Installer ce site en tant qu’application ».
  3. Cliquez sur « Installer ».

Mac (Safari)

  1. Ouvrez le menu Fichier.
  2. Choisissez « Ajouter au Dock ».
  3. Cliquez sur « Ajouter ».

Firefox sur ordinateur ne peut pas installer un site comme application. Utilisez plutôt Chrome, Edge ou Safari.