
    綦i                     z   d dl Z d dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZmZmZ d dlmZmZ d dlmZmZ  edd	
        ed e ej6                         d            Zej:                  defd       Zej:                  defd       ZejA                  d      dede	fd       Z!y)    N)RequestSanic	Websocket)Config)Defaultsload_dotenv)EmbeddingGalleryget_onnx_sessionget_positive_facespreprocess_input_onlyfacepreprocess_input_scrfd)FaceDetectionInferenceResponse)FaceTrackerget_identity_resolver_classz.envF)overridezfr-in-the-cloudFR_)defaults
env_prefix)configappc                 L  K   t        | j                  j                        \  | j                  _        | j                  _        | j                  _        t        | j                  j                        \  | j                  _        | j                  _	        | j                  _
        y wN)r
   r   FD_ONNX_PATHctx
fd_sessionfd_input_namefd_output_namesFR_ONNX_PATH
fr_sessionfr_input_namefr_output_names)r   s    fr-in-the-cloud/app/main.pyinitialize_modelsr$      sl     IYZ]ZdZdZqZqIrFCGG-sww/FIYZ]ZdZdZqZqIrFCGG-sww/Fs   B"B$c                    K   t               }|j                  | j                  j                         || j                  _        y wr   )r	   loadr   GALLERY_EMBEDDING_PATHr   gallery)r   r(   s     r#   load_galleryr)   #   s/      GLL223CGGOs   AA/requestwsc           
      L  K   t               }t        t        j                  j                        }t        j
                  j                  t        j                  j                  t        j                  j                  t        j                  j                  d}t        t        j                  |j                        j                        }|j                         D ci c]  \  }}||v s|| }}} |d(i |}|2 3 d{   }	t!        j"                         }
t!        j                          }i }t!        j"                         }t%        j&                  |	t$        j(                        }t+        j,                  |t*        j.                        }t!        j"                         |z
  dz  |d<   t!        j"                         }t+        j0                  |t*        j2                        }t5        |      \  }}t!        j"                         |z
  dz  |d<   t!        j"                         }t        j
                  j6                  j9                  t        j
                  j:                  t        j
                  j<                  t%        j>                  |jA                  d      g d      i      }t!        j"                         |z
  dz  |d	<   t!        j"                         }t%        jB                  |d
   d
   t        j                  jD                  k\        }tG        ||t        j                  jH                  |t        j                  j                        \  }}}tK        |      d
kD  r{|ddddf   }|dddf   |ddd
f   z
  }|dddf   |dddf   z
  }|t        j                  jL                  k\  |t        j                  jL                  k\  z  }||   }||   }||   }t!        j"                         |z
  dz  |d<   t!        j"                         }|jO                  |||      }t!        j"                         |z
  dz  |d<   |jP                  dd \  }}g }g } t!        j"                         }tS        tK        |            D ]W  }!|jT                  |!   jA                  tV              \  }"}#}$}%|jX                  |!   }&t[        d
t]        |"|dz
              }"t[        d
t]        |#|dz
              }#t[        d
t]        |$|            }$t[        d
t]        |%|            }%|$|"k  s|%|#k  r||#|%|"|$ddf   }'d}(t        j                  j^                  rZd|j`                  v rL|j`                  d   |!   })|)jc                  dd      t%        jd                  |"|#gt$        jf                        z
  }(ti        |'|(      \  }*}+|jk                  |*       | jk                  |&       Z t!        j"                         |z
  dz  |d<   g },t!        j"                         }tK        |      d
kD  rt%        jl                  |d
      }-t        j
                  jn                  j9                  t        j
                  jp                  t        j
                  jr                  |-jA                  d      i      }.|.d
   jA                  d      }/tK        |      }0|/jc                  |0dd      ju                  d      }1t%        jv                  t$        jx                  j{                  |1dd      d      }2t}        |1|2z        },t!        j"                         |z
  dz  |d<   t!        j"                         }|j                  |,|       }3t!        j"                         |z
  dz  |d<   g }4tS        tK        |            D ]j  }!|jX                  |!   }&|jT                  |!   j                         }5|3j                  |&ddd      }6|4jk                  t        |6d   |6d    xs d!|5"             l t        ||4#      }7tW        tK        |            |d$<   tW        tK        |            |d%<   t!        j"                         |
z
  dz  |d&<   |7j                         }8||8d'<   |j                  t        j                  |8             d{    c c}}w 7 7 6 yw))a  WebSocket endpoint for face detection and recognition.

    Receives encoded image bytes (JPEG/PNG), runs the full FD/FR/tracking
    pipeline, and returns a JSON response with detected face identities.

    One tracker and identity resolver is maintained per WebSocket connection.

    Input:  Binary WebSocket message containing encoded image bytes (JPEG/PNG).
    Output: JSON-serialized `InferenceResponse` with a timestamp and a list of
            `FaceDetection` items (identity, confidence, bbox) for each tracked face.
    )r(   top_kmax_historydeviceN)dtypeg     @@	decode_msfd_preprocess_msfloat32)r            fd_infer_msr   )r0      r7   r5   r6   fd_postprocess_ms)	keypointstrack_msr;      fr_prepare_ms)axisfloatT)r?   keepdimsg-q=fr_infer_msidentity_resolve_ms)namescorerE   rF   g        )identity
confidencebbox)	timestamp
detectionstracked_faces	fr_inputstotal_msmetrics )Hr   r   r   r   TRACK_AGGREGATION_STRATEGYr   r(   TRACK_VOTING_TOP_KTRACK_MAX_HISTORYTORCH_DEVICEsetinspect	signature__init__
parametersitemstimeperf_counternp
frombufferuint8cv2imdecodeIMREAD_COLORcvtColorCOLOR_BGR2RGBr   r   runr   r   	transposeastypewhereDETECTOR_THRESHOLDr   DETECT_NUM_FACESlenTRACK_MIN_FACE_SIZEupdateshaperangexyxyint
tracker_idmaxminUSE_LANDMARK_ALIGNMENTdatareshapearrayr4   r   appendconcatenater    r"   r!   summaximumlinalgnormlistupdate_identitiestolistgetr   r   
model_dumpsendjsondumps)9r+   r,   trackerIdentityResolverresolver_kwargsaccepted_paramskvresolvermsg
perf_startreceive_timestamprO   t_stageframe_bytesframe	frame_rgbdetection_inputdetection_scaledetection_outputpositive_indicesdetection_bboxesall_keypointsdetection_scoresbboxeswidthsheightskeeptrackedhwrM   fr_track_idsix1y1x2y2track_id	face_crop	landmark5kps_flatpreprocessed_batch_embeddingsbatch_input
raw_outputraw_embeddings	num_facessummednorms
identitiesrK   rI   identity_inforesponsepayloads9                                                            r#   inferr   *   s     mG23::3X3XY77??..zz33**))	O '++,<,E,EFQQRO(7(=(=(?X11CWq!tXOX2/2H F+ F+c&&(
 IIK*,##%mmCrxx8[#*:*:; $ 1 1 3g =G ##%LL(9(9:	+A)+L('+'8'8':W'D&N"# ##%77--11GG##%%r||#**95 (
 #'"3"3"5"?6!I##%88Q"cjj&C&CC
 =OJJ''::**=
9-)9  1$%a!e,FAqD\F1a4L0FQTlVAqD\1Gcjj<<<3::999D  05)$/M/5(,(9(9(;g(E'O#$##%..!13C}.]#002W<F
 r"1	##%s7|$ 	*A$\\!_33C8NBB))!,HQBA'BQBA'BQB
#BQB
#BRx28!"R%B/2IIzz00[GLL5P"<<4Q7$,,Q2RXXr2hbjj5YY	7	9MOL!\*)-	*. %)$5$5$7'$AV#K  ##%y>A..;K++//''&&(:(:9(EFJ (]11':NII#++Iq"=AAqAIFJJryy~~f1t~LeTE#FUN3"&"3"3"5"?6!I##%//0@,O
*.*;*;*=*G6)Q%& 
s7|$ 	A))!,H<<?))+D&NN8dT5RSM*62,W5<	 %/@ZX#&s7|#4 "3y>2#002Z?6I
%%'$	ggdjj)***S YF+L 	+M sO   Cb$b)b.b$;b"?b b"^b$b b$b" b$"b$)"rV   r   r[   r`   numpyr]   sanicr   r   r   sanic.configr   
app.configr   r   app.facer	   r
   r   r   r   
app.modelsr   r   	app.trackr   r   dumpr   before_server_startr$   r)   	websocketr   rP       r#   <module>r      s       
  + +  ,  8 > FU #=8==?u= s s s
 E   s_+ _+i _+ _+r   