Groupe2 / src /train.py
FranckB237's picture
final project
44f39b1
import torch
import torch.nn.functional as F
from torch.utils.data import DataLoader
from codecarbon import EmissionsTracker
import pandas as pd
from model import CLIPClassifier, get_processor
from utils import load_dataset_images, CustomImageDataset
import os
# 🔹 Démarrer le suivi des émissions carbone avec CodeCarbon
tracker = EmissionsTracker(project_name="IM-IAD_CLIP", output_dir=".")
# ✅ Démarrage de la mesure des émissions
tracker.start()
# 🔹 Configuration du dataset
data_dir = "./data/Images" # Assure-toi que ce chemin est correct !
batch_size = 8
num_epochs = 5
learning_rate = 1e-3
# 🔹 Chargement du dataset d'entraînement
image_paths, labels, class_to_idx = load_dataset_images(data_dir)
if len(image_paths) == 0:
raise ValueError("❌ Aucune image trouvée ! Vérifie que le dossier ./data/Images contient des sous-dossiers avec des images.")
processor = get_processor()
dataset = CustomImageDataset(image_paths, labels, processor)
train_dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
# 🔹 Vérification des premières images chargées
print(f"🔍 Exemple d'images chargées : {image_paths[:5]}")
print(f"🔍 Labels associés : {labels[:5]}")
# 🔹 Charger le modèle CLIP
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
num_classes = len(class_to_idx)
model = CLIPClassifier(num_classes=num_classes).to(device)
optimizer = torch.optim.Adam(model.classifier.parameters(), lr=learning_rate)
# 🔹 Entraînement du modèle
model.train()
for epoch in range(num_epochs):
total_loss = 0
for pixel_values, labels in train_dataloader:
pixel_values = pixel_values.to(device)
labels = labels.to(device)
optimizer.zero_grad()
logits = model(pixel_values)
loss = F.cross_entropy(logits, labels)
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}/{num_epochs} - Loss: {total_loss/len(train_dataloader):.4f}")
# ✅ Arrêter CodeCarbon et récupérer les émissions CO₂
tracker.stop()
# 🔹 Lire les émissions enregistrées par CodeCarbon
emissions_df = pd.read_csv("emissions.csv")
# ✅ Calcul de l'impact environnemental
eq_kg_co2 = emissions_df["emissions"].sum() # Total des émissions en kg CO₂
max_eq_kg_co2 = 1 # 1kwh en moyenne mondiale qui vaut 0.056 kg/co2 On prend notre modèle comme référence pour le moment
# Accuracy obtenue après test (remplace par la vraie valeur après l'évaluation)
accuracy = 0.9427
# Appliquer la formule de l'impact environnemental
impact_env = accuracy * (1 - (eq_kg_co2 / max_eq_kg_co2))
print(f"🌍 Impact Environnemental Calculé : {impact_env:.4f}")
# 🔹 Sauvegarde du modèle après entraînement
model_save_path = "./clip_model.pth"
torch.save(model.state_dict(), model_save_path)
print(f"✅ Modèle sauvegardé sous {model_save_path}")