File size: 5,823 Bytes
e9d86db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""
Modèles de données pour l'application Detection
Créé par Marino ATOHOUN - FireWatch AI Project
"""
from django.db import models
from django.utils import timezone
import uuid
import os


def upload_to_images(instance, filename):
    """Fonction pour définir le chemin d'upload des images"""
    ext = filename.split('.')[-1]
    filename = f"{uuid.uuid4()}.{ext}"
    return os.path.join('uploads/images/', filename)


def upload_to_videos(instance, filename):
    """Fonction pour définir le chemin d'upload des vidéos"""
    ext = filename.split('.')[-1]
    filename = f"{uuid.uuid4()}.{ext}"
    return os.path.join('uploads/videos/', filename)


def upload_to_results(instance, filename):
    """Fonction pour définir le chemin d'upload des résultats"""
    ext = filename.split('.')[-1]
    filename = f"result_{uuid.uuid4()}.{ext}"
    return os.path.join('results/', filename)


class Contact(models.Model):
    """
    Modèle pour stocker les messages de contact
    Par Marino ATOHOUN
    """
    name = models.CharField(max_length=100, verbose_name="Nom")
    email = models.EmailField(verbose_name="Email")
    message = models.TextField(verbose_name="Message")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Date de création")
    is_read = models.BooleanField(default=False, verbose_name="Lu")

    class Meta:
        verbose_name = "Contact"
        verbose_name_plural = "Contacts"
        ordering = ['-created_at']

    def __str__(self):
        return f"Message de {self.name} ({self.email}) - {self.created_at.strftime('%d/%m/%Y %H:%M')}"


class DetectionSession(models.Model):
    """
    Modèle pour stocker les sessions de détection
    Par Marino ATOHOUN
    """
    DETECTION_TYPES = [
        ('image', 'Image'),
        ('video', 'Vidéo'),
        ('camera', 'Caméra'),
    ]

    session_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    detection_type = models.CharField(max_length=10, choices=DETECTION_TYPES, verbose_name="Type de détection")
    original_file = models.FileField(upload_to=upload_to_images, null=True, blank=True, verbose_name="Fichier original")
    result_file = models.FileField(upload_to=upload_to_results, null=True, blank=True, verbose_name="Fichier résultat")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Date de création")
    processing_time = models.FloatField(null=True, blank=True, verbose_name="Temps de traitement (secondes)")
    is_processed = models.BooleanField(default=False, verbose_name="Traité")

    class Meta:
        verbose_name = "Session de détection"
        verbose_name_plural = "Sessions de détection"
        ordering = ['-created_at']

    def __str__(self):
        return f"Session {self.session_id} - {self.get_detection_type_display()} - {self.created_at.strftime('%d/%m/%Y %H:%M')}"


class Detection(models.Model):
    """
    Modèle pour stocker les résultats de détection individuels
    Par Marino ATOHOUN
    """
    DETECTION_CLASSES = [
        ('fire', 'Incendie'),
        ('smoke', 'Fumée'),
        ('person', 'Personne'),
        ('intrusion', 'Intrusion'),
        ('vehicle', 'Véhicule'),
        ('other', 'Autre'),
    ]

    session = models.ForeignKey(DetectionSession, on_delete=models.CASCADE, related_name='detections')
    class_name = models.CharField(max_length=20, choices=DETECTION_CLASSES, verbose_name="Classe détectée")
    confidence = models.FloatField(verbose_name="Confiance")
    bbox_x = models.FloatField(verbose_name="Boîte englobante X")
    bbox_y = models.FloatField(verbose_name="Boîte englobante Y")
    bbox_width = models.FloatField(verbose_name="Largeur boîte englobante")
    bbox_height = models.FloatField(verbose_name="Hauteur boîte englobante")
    frame_number = models.IntegerField(default=0, verbose_name="Numéro de frame (pour vidéo)")
    timestamp = models.FloatField(null=True, blank=True, verbose_name="Timestamp (pour vidéo)")

    class Meta:
        verbose_name = "Détection"
        verbose_name_plural = "Détections"
        ordering = ['-session__created_at', 'frame_number']

    def __str__(self):
        return f"{self.get_class_name_display()} - {self.confidence:.2%} - Session {self.session.session_id}"

    @property
    def bbox_dict(self):
        """Retourne la bounding box sous forme de dictionnaire"""
        return {
            'x': self.bbox_x,
            'y': self.bbox_y,
            'width': self.bbox_width,
            'height': self.bbox_height
        }


class AIModelStatus(models.Model):
    """
    Modèle pour suivre le statut des modèles IA
    Par Marino ATOHOUN
    """
    MODEL_TYPES = [
        ('fire', 'Modèle Incendie'),
        ('intrusion', 'Modèle Intrusion'),
    ]

    model_type = models.CharField(max_length=20, choices=MODEL_TYPES, unique=True, verbose_name="Type de modèle")
    model_path = models.CharField(max_length=500, verbose_name="Chemin du modèle")
    is_loaded = models.BooleanField(default=False, verbose_name="Modèle chargé")
    last_loaded = models.DateTimeField(null=True, blank=True, verbose_name="Dernière fois chargé")
    model_version = models.CharField(max_length=50, null=True, blank=True, verbose_name="Version du modèle")
    accuracy = models.FloatField(null=True, blank=True, verbose_name="Précision du modèle")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Date de création")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="Date de mise à jour")

    class Meta:
        verbose_name = "Statut du modèle IA"
        verbose_name_plural = "Statuts des modèles IA"

    def __str__(self):
        status = "Chargé" if self.is_loaded else "Non chargé"
        return f"{self.get_model_type_display()} - {status}"