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