Skip to content

Entraîner et suivre les courbes de perte

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.

epoch 1/3 - loss moyenne: 0.7154
epoch 2/3 - loss moyenne: 0.4524
epoch 3/3 - loss moyenne: 0.4804
temps d'entrainement: 54.6s

Moins 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).

model.eval()
with torch.no_grad():
pred_after = model([F.to_tensor(sample_img)])[0]
mask_after = pred_after["scores"] > 0.5
print("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): 3
Formes 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).

👉 Évaluer avec le mAP


Junior TSAFACK – 12/09/2026