Entraîner et suivre les courbes de perte
Une perte composite
Section titled “Une perte composite”Contrairement aux modules précédents (une seule fonction de coût), un modèle de détection d’objets en mode entraînement renvoie un dictionnaire de plusieurs pertes nommées : une perte de classification des boîtes, une perte de régression de leurs coordonnées, et deux pertes propres au RPN (proposer de bonnes régions, distinguer objet/fond).
model.train()for epoch in range(N_EPOCHS): epoch_losses = [] for images, targets in train_loader: loss_dict = model(list(images), list(targets)) loss = sum(loss_dict.values()) optimizer.zero_grad() loss.backward() optimizer.step() epoch_losses.append(loss.item()) print(f"epoch {epoch+1} - loss moyenne: {np.mean(epoch_losses):.4f}")En mode entraînement (et uniquement dans ce mode), model(images, targets) attend aussi les annotations réelles et renvoie ce dictionnaire de pertes plutôt que des prédictions — un comportement à double face propre aux modèles de détection torchvision, différent des modèles de classification des modules précédents.
Les résultats
Section titled “Les résultats”epoch 1/3 - loss moyenne: 0.7154epoch 2/3 - loss moyenne: 0.4524epoch 3/3 - loss moyenne: 0.4804temps d'entrainement: 54.6sMoins d’une minute pour 3 epochs sur CPU — la conséquence directe du gel du backbone (leçon précédente) : seule une fraction du réseau doit être traversée par la rétropropagation. La perte baisse nettement entre l’epoch 1 et 2, puis remonte légèrement à l’epoch 3 — une fluctuation normale sur un aussi petit nombre d’itérations, à surveiller mais qui ne remet pas en cause l’entraînement dans son ensemble (l’évaluation de la leçon suivante le confirmera).
Le détecteur fine-tuné à l’œuvre
Section titled “Le détecteur fine-tuné à l’œuvre”model.eval()with torch.no_grad(): pred_after = model([F.to_tensor(sample_img)])[0]
mask_after = pred_after["scores"] > 0.5print("Detections (score>0.5):", mask_after.sum().item())print("Formes predites:", [SHAPE_NAMES[l-1] for l in pred_after["labels"][mask_after].tolist()])print("Vraies formes:", [SHAPE_NAMES[l] for l in sample_labels])Detections (score>0.5): 3Formes predites: ['etoile', 'triangle', 'etoile']Vraies formes: ['triangle', 'etoile', 'etoile']Le modèle, qui ne détectait strictement rien avant fine-tuning (leçon 2), détecte maintenant les 3 pièces présentes, avec les bonnes catégories (2 étoiles et 1 triangle, dans les deux cas — seul l’ordre de la liste diffère, sans conséquence puisque chaque détection reste associée à sa propre position dans l’image).
Prochaine étape
Section titled “Prochaine étape”Junior TSAFACK – 12/09/2026