
    +h>&                        S SK JrJr  S SKJrJr  S SKrS SKrS SK	r	S SK
r
S SKJr  S SKrS SKJrJrJr  S SKr\R&                  " \R(                  SS9  \R*                  " S5      r\" S	S
9rSSSSS.r \R2                  R5                  5       (       a  SOSr\R9                  S\ 35        \" S5      r\R=                  \5        \R9                  S5         " S S\5      r" " S S\5      r# " S S\5      r$ " S S\5      r%S\&S\RN                  4S jr(S \RN                  S\RN                  4S! jr)S"\*S\\#   4S# jr+\RY                  S$\%S%9S&\$4S' j5       r-\R]                  S(5      S) 5       r/\R]                  S*5      S+ 5       r0\1S,:X  a  S SK2r2\2Rf                  " S-S.S/S0S19  gg! \ a   r \RC                  S\  35        Sr Sr C NSr C ff = f)2    )FastAPIHTTPException)	BaseModelFieldN)YOLO)ListDictAnyz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatDroneDetectionAPIzDrone Object Detection API)titlepersonvehicleheavy_equipment)r   cartruckbuscudacpuu   Utilisation du périphérique: z
yolov8n.ptu!   Modèle YOLO chargé avec succèsu&   Erreur de chargement du modèle YOLO: c                   >    \ rS rSr% \\S'   \\S'   \\S'   \\S'   Srg)BoundingBox,   xywidthheight N)__name__
__module____qualname____firstlineno__int__annotations____static_attributes__r       "c:\xampp\htdocs\ai-service\main.pyr   r   ,   s    
F
FJKr&   r   c                   b    \ rS rSr% \" SSS9r\\S'   \" SSSSS	9r\	\S
'   \" SSS9r
\\S'   Srg)DetectionResult2   .u5   Nom de la classe détectée (ex: 'person', 'vehicle')description
class_namer      u$   Niveau de confiance de la détectiongeler,   
confidenceu$   Coordonnées de la boîte englobantebboxr   N)r   r    r!   r"   r   r-   strr$   r2   floatr3   r   r%   r   r&   r'   r)   r)   2   s<    C-deJecaA;abJbc/UVD+Vr&   r)   c                       \ rS rSr% \" SSS9r\\S'   \\S'   \\S'   \	\\
4   \S'   \\S	'   \" S
SSSS9r\
\S'   \" 0 SS9r\	\\4   \S'   Srg)DetectionRequest7   .u'   Données de l'image encodées en Base64r+   
image_datadrone_idzone_idgps_coordinates	timestampgffffff?r   r.   u/   Seuil de confiance pour filtrer les détectionsr/   confidence_thresholdu   Métadonnées additionnellesmetadatar   N)r   r    r!   r"   r   r9   r4   r$   r#   r	   r5   r>   r?   r
   r%   r   r&   r'   r7   r7   7   sc    C-VWJWML#u*%%N"'aEv"w%w$R5STHd38nTr&   r7   c                       \ rS rSr% \" / SS9r\\   \S'   \" SSS9r	\
\S'   \" SSS9r\\S	'   \" SS
S9r\\S'   \" SSS9r\\S'   \" 0 SS9r\\\
4   \S'   Srg)DetectionResponse@   u   Liste des objets détectésr+   
detections.u.   Temps de traitement de la requête en secondesprocessing_timez1Identifiant unique du cadre, souvent le timestampframe_idu   Identifiant du drone émetteurr:   u"   Identifiant de la zone surveilléer;   u   Coordonnées GPS du droner<   r   N)r   r    r!   r"   r   rC   r   r)   r$   rD   r5   rE   r4   r:   r#   r;   r<   r	   r%   r   r&   r'   rA   rA   @   s|    (-b>[(\J_%\"34deOUe#+^_Hc_#+KLHcL*NOGSO(-b>Y(ZOT#u*%Zr&   rA   r9   returnc                 l    [         R                  " U 5      n[        R                  " U[        R                  5      n[
        R                  " U[
        R                  5      nUb  UR                  S:X  a  [        S5      eU$ ! [         a'  n[        R                  SU 35        [        SSS9eSnAff = f)uA   Décode l'image Base64 et la renvoie sous forme de tableau NumPy.Nr   u   L'image décodée est vide.u    Erreur de décodage de l'image: i  u   Données d'image invalides.status_codedetail)base64	b64decodenp
frombufferuint8cv2imdecodeIMREAD_COLORsize
ValueError	Exceptionloggererrorr   )r9   image_bytesnparrimagees        r'   decode_base64_imager\   H   s    	S&&z2k2884UC$4$45=EJJ!O:;; S7s;<4QRRSs   A?B 
B3"B..B3rZ   c                    U R                   SS u  p[        X!5      S:  a@  S[        X!5      -  n[        X#-  5      n[        X-  5      n[        R                  " XU45      n [        R
                  " U [        R                  5      n[        R                  " U5      u  pxn	[        R                  " SSS9n
U
R                  U5      n[        R                  " XU	45      n[        R
                  " U[        R                  5      n U $ )u   
Applique un prétraitement à l'image pour améliorer la détection.
- Redimensionnement si l'image est trop grande.
- Amélioration du contraste avec CLAHE.
N   i   g       @)   r_   )	clipLimittileGridSize)shapemaxr#   rP   resizecvtColorCOLOR_BGR2LABsplitcreateCLAHEapplymergeCOLOR_LAB2BGR)rZ   r   r   scale	new_width
new_heightlab	l_channel	a_channel	b_channelclahecllab_processeds                r'   preprocess_imagerv   U   s     KKOMF
5D s5))&	(


5j"9: ,,uc//
0C&)iin#I)OOc?E	Y	BIIri89MLL(9(9:ELr&   r>   c                    / nU  H  nUR                   nUc  M  U H  n[        UR                  5      n[        UR                  5      nUR
                  U   nXa:  d  MC  U[        ;   d  MO  [        U   n	[        [        UR                  S   5      u  ppX-
  nX-
  n[        U	U[        XXS9S9nUR                  U5        M     M     U$ )u   
Extrait les détections des résultats YOLO, filtre les classes pertinentes
et formate le tout en une liste de DetectionsResult Pydantic.
r   )r   r   r   r   )r-   r2   r3   )boxesr5   confr#   clsnamesRELEVANT_CLASSES_MAPPINGmapxyxyr)   r   append)resultsr>   rC   resultrx   boxr2   class_idr-   mapped_class_namex1y1x2y2r   r   	detections                    r'   process_yolo_resultsr   m   s    
 )+J"388_
sww<#\\(3
 5*H`:`(@(L% &)chhqk%:NBBGEWF !0#4#-(25P!I
 %%i0+  4 r&   z/api/v1/detect)response_modelrequestc                   #    [         R                  " 5       R                  5       n[        c  [        R                  S5        [        SSS9e [        U R                  5      n[        U5      n[        X0R                  SS9n[        X@R                  5      n[         R                  " 5       R                  5       U-
  n[        R                  SU R                   S	U R                   S
[        U5       SUS S3	5        [!        UUU R"                  U R                  U R                  U R$                  S9$ ! [         a  nUeSnAf[&         a2  n[        R                  SU 3SS9  [        SS[)        U5       3S9eSnAff = f7f)u3  
Endpoint principal de détection d'objets sur une image de drone.

- Décode l'image Base64.
- Applique des opérations de prétraitement.
- Exécute l'inférence YOLO.
- Filtre les résultats selon un seuil de confiance et des classes pertinentes.
- Renvoie une réponse structurée avec les détections.
Nu2   Requête reçue mais le modèle n'est pas chargé.  ua   Le service de détection n'est pas disponible. Le modèle n'a pas pu être chargé au démarrage.rH   F)ry   verboseu   Requête traitée - Drone ID: z, Zone ID: u   , Détections: z, Temps de traitement: z.3fs)rC   rD   rE   r:   r;   r<   zErreur de traitement inconnue: T)exc_infoi  z.Erreur interne du serveur lors du traitement: )asyncioget_event_looptimemodelrV   rW   r   r\   r9   rv   r>   r   infor:   r;   lenrA   r=   r<   rU   r4   )r   
start_timerZ   processed_imager   final_detectionsrD   r[   s           r'   detect_objectsr      s     '')..0J}IJ  5X  Y  	Y$o#G$6$67 +51
 .J.JTYZ 09U9UV!002779JF4W5E5E4F G  '0 1$$'(8$9#: ;,,;C+@C 	D
 !'+&&%%OO#33
 	
   o6qc:TJ6dehijekdl4mnnos7   A
F C$D2 1F 2
E=<D>>E=-E88E==F z/healthc                  |   #    [         b,  SS[        [         R                  5      [        R                  S.$ SSSS.$ 7f)u5   Endpoint de santé pour vérifier l'état du service.healthyT)statusmodel_loadeddevicetorch_version	unhealthyFu)   Le modèle YOLO n'a pas pu être chargé.)r   r   message)r   r4   r   torch__version__r   r&   r'   health_checkr      sG       %,,'"..	
 	
 "!B
 	
s   :<z/model/infoc                  <  #    [         c
  [        SSS9e[         R                  S[         R                   R                  R	                  SS5      [        [         R                  5      [        [        R                  5       5      [        [         R                  5      S.$ 7f)u@   Informations détaillées sur le modèle de détection utilisé.r   u   Modèle non chargérH   YOLOv8imgszi  )
model_name
model_type
input_sizetotal_classesrelevant_classesr   )r   r   ptargsgetr   r{   listr|   valuesr4   r   r   r&   r'   
model_infor      st      }4IJJ hhkk&&**7C8U[[) !9!@!@!BCell# s   BB__main__zmain:appz0.0.0.0i  T)hostportreload)4fastapir   r   pydanticr   r   rP   numpyrM   rK   r   ultralyticsr   loggingtypingr   r	   r
   r   basicConfigINFO	getLoggerrV   appr|   r   is_availabler   r   r   torU   r[   rW   r   r)   r7   rA   r4   ndarrayr\   rv   r5   r   postr   r   r   r   r   uvicornrunr   r&   r'   <module>r      s   * % 
      " "    ',,/e f			.	/ 01
 	 zz..00VeF
KK1&:;E	HHV
KK34) Wi W
Uy U[	 [SC SBJJ SBJJ 2:: 0! !$BW !F 
+<=4o"2 4o >4ol 
 
    zKK
dC C  
LL9!=>Es   4A!F$ $G
*GG
