File size: 2,905 Bytes
44f39b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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}")