Servir les données au modèle : Dataset et DataLoader
Une « recette », pas un stock
Section titled “Une « recette », pas un stock”Un Dataset PyTorch ne charge pas toutes les images en mémoire : c’est une recette qui explique comment fabriquer l’échantillon i à la demande, via deux méthodes.
class ShapesDataset(torch.utils.data.Dataset): def __init__(self, raw_data): self.raw_data = raw_data
def __len__(self): return len(self.raw_data)
def __getitem__(self, idx): img, boxes, labels = self.raw_data[idx] image_tensor = F.to_tensor(img) target = { "boxes": torch.as_tensor(boxes, dtype=torch.float32), "labels": torch.as_tensor(labels + 1, dtype=torch.int64), # +1 : 0 = fond } return image_tensor, targetNotez le +1 sur les labels : torchvision réserve par convention l’indice 0 à la classe fond (l’absence d’objet) — un décalage à retenir, sans quoi le modèle confondrait la classe « cercle » avec l’arrière-plan.
Pourquoi un DataLoader standard ne suffit pas
Section titled “Pourquoi un DataLoader standard ne suffit pas”DataLoader tire des indices, appelle la recette du Dataset, puis empile les résultats en un batch. Ce dernier empilement suppose que tous les éléments ont la même forme — vrai pour une image seule, mais faux ici : une image peut contenir 2 pièces, une autre 4, et empiler des tenseurs de tailles différentes est impossible.
def collate_fn(batch): return tuple(zip(*batch))
loader = torch.utils.data.DataLoader( dataset, batch_size=4, shuffle=True, collate_fn=collate_fn)collate_fn personnalisé remplace l’empilement automatique par un simple regroupement en listes parallèles (tuple(zip(*batch)) transforme une liste de paires (image, target) en deux listes séparées) — le modèle Faster R-CNN de torchvision est justement conçu pour accepter des listes d’images de tailles variables plutôt qu’un unique tenseur empilé.
Prochaine étape
Section titled “Prochaine étape”Junior TSAFACK – 12/09/2026