Division de données d'images pour l'entraînement ResNet avec Python

Problématique

Lors de la préparation de données pour des modèles de reconnaissance d'imagse, la division manuelle des ensembles après augmentation devient chronophage. Cette automatisation utilise Python pour répartir les images selon des ratios prédéfinis.

Solution Python

import os
import numpy as np
from sklearn.model_selection import train_test_split
import shutil

def diviser_dataset(source, cible, train=0.7, test=0.2, valid=0.1):
    """
    Répartit un ensemble d'images en sous-ensembles d'entraînement, test et validation
    :param source: Répertoire source des images
    :param cible: Répertoire cible pour les sous-ensembles
    :param train: Proportion pour l'entraînement
    :param test: Proportion pour le test
    :param valid: Proportion pour la validation
    """
    # Validation des ratios
    if abs(train + test + valid - 1.0) > 0.001:
        raise ValueError("La somme des ratios doit égaler 1")

    # Initialisation des répertoires
    chemins = {
        'entrainement': os.path.join(cible, 'entrainement'),
        'test': os.path.join(cible, 'test'),
        'validation': os.path.join(cible, 'validation')
    }
    for dossier in chemins.values():
        os.makedirs(dossier, exist_ok=True)

    # Collecte des images
    fichiers = []
    for dossier, _, noms_fichiers in os.walk(source):
        for nom in noms_fichiers:
            if nom.lower().endswith(('.png', '.jpg', '.jpeg')):
                fichiers.append(os.path.join(dossier, nom))
    
    np.random.shuffle(fichiers)
    
    # Calcul des tailles
    idx_train, idx_temp = train_test_split(
        range(len(fichiers)), 
        train_size=train, 
        random_state=42
    )
    idx_test, idx_valid = train_test_split(
        idx_temp,
        test_size=valid/(test+valid),
        random_state=42
    )
    
    # Copie des fichiers
    def copier(chemins, indices, destination):
        for i in indices:
            shutil.copy(chemins[i], destination)
            
    copier(fichiers, idx_train, chemins['entrainement'])
    copier(fichiers, idx_test, chemins['test'])
    copier(fichiers, idx_valid, chemins['validation'])
    
    print(f"Répartition terminée:\n"
          f"Entraînement: {len(idx_train)} images\n"
          f"Test: {len(idx_test)} images\n"
          f"Validation: {len(idx_valid)} images")

# Exemple d'utilisation
diviser_dataset(
    source="chemin/vers/images_augmentees",
    cible="chemin/vers/dataset_divise",
    train=0.7,
    test=0.2,
    valid=0.1
)

Fonctionnalités clés

  • Ratios cofnigurables : 70% entraînement, 20% test, 10% validation
  • Mélange aléatoire des données avant sépaartion
  • Création automatique de l'arborescence des répertoires

Intégration avec PyTorch

import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader

preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

train_data = datasets.ImageFolder('chemin/vers/dataset_divise/entrainement', preprocess)
test_data = datasets.ImageFolder('chemin/vers/dataset_divise/test', preprocess)
valid_data = datasets.ImageFolder('chemin/vers/dataset_divise/validation', preprocess)

chargeurs = {
    'entrainement': DataLoader(train_data, batch_size=64, shuffle=True),
    'test': DataLoader(test_data, batch_size=64),
    'validation': DataLoader(valid_data, batch_size=64)
}

print(f"Exemples d'entraînement: {len(train_data)}")

Dépendances requises

pip install scikit-learn torch torchvision

Étiquettes: Python Scikit-learn PyTorch traitement d'images ResNet

Publié le 8 juin à 21h44