
    j.                       U d dl mZ d dlZd dlZd dlmZ d dlmZ d dlZd dl	Z
d dlmZmZmZmZmZ ed k    rF	  ej        e            ej        de           n## e$ rZ ej        de           Y dZ[ndZ[ww xY wdZd	Zd
ZdZdZdZdZdZdZ ej                    Z da!de"d<   d Z#d:dZ$d;dZ% G d d          Z& G d d          Z'd:dZ(d<d Z)d=d#Z*d>d&Z+d?d)Z,efd@d-Z-d.eeefdAd7Z.	 dBdCd9Z/dS )D    )annotationsN)Path)Optional)FACE_BLUR_THRESHFACE_MODEL_DETFACE_MODEL_RECOPENCV_NUM_THREADSloggerz!Configured OpenCV CPU threads: %sz*failed to configure OpenCV CPU threads: %si  i  i   g      ?g?(   )p   r   g?z.tuple['FaceDetector', 'FaceRecognizer'] | None_MODELSc                 V    	 dd l } n"# t          $ r}t          d          |d }~ww xY w| S )Nr   zDonnxruntime is not installed; face identity features are unavailable)onnxruntimeImportErrorRuntimeError)ortexcs     H/home/longshao/multi-rider-rag/modules/face/services/identity_service.py_get_onnxruntimer   %   sQ    l!!!!! l l labbhkklJs    
&!&returnboolc                 2    	 dd l } dS # t          $ r Y dS w xY w)Nr   TF)r   r   )r   s    r   _onnxruntime_availabler   -   s:    t   uus    

model_pathr   strc                   |                      | j        dz             }|                                rt          |          S 	 dd l}n4# t
          $ r' t          j        d|            t          |           cY S w xY w|                    t          |                     }d}|j	        j
        D ]^}|j        j        }|                    d          r;|j        j        D ].}|j        dk    r!|                    d           d|_        |dz  }/_|                    |t          |                     t          j        d||           t          |          S )	Nz	_dyn.onnxr   z4onnx is not installed; using original face model: %sshape	dim_valuedyn   z0Patched %d face-model output dims to dynamic: %s)	with_namestemexistsr   onnxr   r
   warningloadgraphoutputtypetensor_typeHasFieldr   dimr   
ClearField	dim_paramsaveinfo)r   patched_pathr$   modelpatchedr(   r*   r,   s           r   _patch_onnx_dynamic_outputsr4   5   se   ''
+(EFFL !<      MzZZZ: IIc*oo&&EG+$ ! !k-(( 	!"(, ! !=1$$NN;///$)CMqLGIIeS&&'''
KBG\ZZZ|s   A .A87A8c                  F    e Zd ZddZefdd
ZefddZedd            ZdS )FaceDetectorr   
str | Pathc                8   t          |          }|                                st          d|           t          |          }t	                      }|                    |ddg          | _        | j                                        d         j        | _	        d S )Nz face detection model not found: CUDAExecutionProviderCPUExecutionProvider	providersr   
r   r#   FileNotFoundErrorr4   r   InferenceSessionsession
get_inputsname
input_nameselfr   	load_pathr   s       r   __init__zFaceDetector.__init__Q   s    *%%
  "" 	U#$Sz$S$STTT/
;;	  ++IBY[qAr+ss,1133A6;    img
np.ndarraymax_sizeintr   tuple[np.ndarray, float]c                   |j         d d         \  }}|t          ||          z  }t          ||z            t          ||z            }}t          j        |||f          }|dz   dz  dz  }	|dz   dz  dz  }
t          j        |	|
dft
          j                  }||d |d |f<   |dz
  dz  }|                    ddd	          t
          j	                 
                    t
          j                  }||fS )
N             dtype     _@      `@r   r    )r   maxrL   cv2resizenpzerosfloat32	transposenewaxisastype)rE   rI   rK   hwscalenew_hnew_wresizedpad_hpad_wcanvastensors                r   
preprocesszFaceDetector.preprocessZ   s    y!}13q!99$1u9~~s1u9~~u*S5%.11"*#r)"*#r)5%+2:>>>!(vvvv~5.E)!!!Q**2:6==bjIIu}rH   
list[dict]c           	       ! |                      ||          \  }}| j                            d | j        |i          }g !g d}t	          |          }t	          |          |dz  k    }|j        d         |j        d         }
}	t          |          D ]R\  }}||                                         }|||z            }|r|||dz  z            nd }|	|z  }|
|z  }t          j	        t          j
        d |d |f         d d d         d                              dd                              t          j                  }t          j        ||z  dd          }|t          k    }|                                s||         }||         }||         }|d d df         |d d df         |z  z
  |z  }|d d df         |d d df         |z  z
  |z  }|d d df         |d d df         |z  z   |z  }|d d df         |d d df         |z  z   |z  }t#          t	          |                    D ]}t%          ||                   t%          ||                   t%          ||                   t%          ||                   gt%          ||                   d d}|8||         |                             d	d          }||         }|||z  z   |z  |d
<   !                    |           T!sg S t          j        d !D             t          j                  }t          j        d !D             t          j                  }|                     ||t,                    } !fd| D             S )N)      rQ   rR   rO   )axisr   r    )bboxscorekps   rs   c                    g | ]
}|d          S )rq    .0items     r   
<listcomp>z'FaceDetector.detect.<locals>.<listcomp>   s    ;;;4$v,;;;rH   rS   c                    g | ]
}|d          S )rr   rv   rw   s     r   rz   z'FaceDetector.detect.<locals>.<listcomp>   s    ===T4====rH   c                     g | ]
}|         S rv   rv   )rx   indexresultss     r   rz   z'FaceDetector.detect.<locals>.<listcomp>   s    1115111rH   )rj   r@   runrC   lenr   	enumerateflattenrZ   stackmgridreshaper_   r\   repeatDET_CONF_THRESHanyrangefloatappendarray_nmsDET_NMS_THRESH)"rE   rI   rK   ri   rb   outputsstrides
num_levelshas_kpstensor_htensor_wistridescoresbboxesrs   fhfwanchor_centersmaskfiltered_scoresfiltered_anchorsfiltered_bboxesx1y1x2y2jdetptsanchorboxeskeepr~   s"                                    @r   detectzFaceDetector.detectg   s   X66,""4$/6)BCC++\\
g,,*q.0#\!_fl1o("7++ !	$ !	$IAvQZ''))FQ^,F18B'!j1n,--dCV#BV#BXbhssCRCx&82&>RHHHPPQSUVWW^^_a_ijjNY~'>JJJN_,D88:: $TlO-d3$TlO"111a4(?111a4+@6+IIURB"111a4(?111a4+@6+IIURB"111a4(?111a4+@6+IIURB"111a4(?111a4+@6+IIURB3//00 
$ 
$"2a5\\5A<<r!uuRPQU||T"?1#566 
 ?d)A,..q!44C-a0F"(3<"75!@CJs####
$  	I;;7;;;2:NNN==W===RZPPPyy771111D1111rH   r   r   
iou_threshr   	list[int]c                T   | d d df         | d d df         | d d df         | d d df         f\  }}}}||z
  ||z
  z  }|                                 d d d         }g }	|j        dk    r>|d         }
|	                    t          |
                     t	          j        ||
         ||dd                             }t	          j        ||
         ||dd                             }t	          j        ||
         ||dd                             }t	          j        ||
         ||dd                             }t	          j        d||z
            t	          j        d||z
            z  }|||
         ||dd                   z   |z
  z  }|dd          ||k             }|j        dk    >|	S )Nr   r    rO   rR   ro   )argsortsizer   rL   rZ   maximumminimum)r   r   r   r   r   r   r   areasorderr   r   inter_x1inter_y1inter_x2inter_y2interious                    r   r   zFaceDetector._nms   s   qqq!teAAAqDk5A;aaadKBBbR"W%  2&j1nnaAKKAz"Q%E!""I77Hz"Q%E!""I77Hz"Q%E!""I77Hz"Q%E!""I77HJq(X"566AxRZGZ9[9[[E58eE!""I&66>?C!""IcZ/0E j1nn rH   Nr   r7   )rI   rJ   rK   rL   r   rM   )rI   rJ   rK   rL   r   rk   )r   rJ   r   rJ   r   r   r   r   )	__name__
__module____qualname__rG   DET_GALLERY_SIZErj   r   staticmethodr   rv   rH   r   r6   r6   P   s        < < < < ;K      7G 22 22 22 22 22h    \  rH   r6   c                  r    e Zd Z ej        ddgddgddgddgd	d
ggej                  ZddZddZddZ	dS )FaceRecognizerghs%C@g7[ I@g 	bR@gq-I@g9L@gSt$Q@g_vOD@gZdW@gmV}Q@gEGrW@rS   r   r7   c                8   t          |          }|                                st          d|           t          |          }t	                      }|                    |ddg          | _        | j                                        d         j        | _	        d S )Nz"face recognition model not found: r9   r:   r;   r   r=   rD   s       r   rG   zFaceRecognizer.__init__   s    *%%
  "" 	W#$U$U$UVVV/
;;	  ++IBY[qAr+ss,1133A6;rH   rI   rJ   rs   r   c                    t          j        || j        t           j                  \  }}t          j        ||t
          d          S )N)methodr   )borderValue)rX   estimateAffinePartial2DARCFACE_REFLMEDS
warpAffineREC_INPUT_SIZE)rE   rI   rs   matrix_s        r   align_and_cropzFaceRecognizer.align_and_crop   s;    /T5EciXXX	~c6>qIIIIrH   face_imgc                N   |                     t          j                  dz
  dz  }|                    ddd          t          j                 }| j                            d | j        |i          d         d         }t          j        	                    |          }|dk    r||z  n|S )NrU   rV   rO   r   r    )
r_   rZ   r\   r]   r^   r@   r   rC   linalgnorm)rE   r   blobr(   r   s        r   get_embeddingzFaceRecognizer.get_embedding   s    
++e3u<~~aA&&rz2!!$$(?@@CAFy~~f%% $qv}}f4rH   Nr   )rI   rJ   rs   rJ   r   rJ   )r   rJ   r   rJ   )
r   r   r   rZ   r   r\   r   rG   r   r   rv   rH   r   r   r      s        "(ggggg	
 j	 	 	K< < < <J J J J5 5 5 5 5 5rH   r   c                     t                      oGt          j                            t                    o#t          j                            t
                    S N)r   ospathisfiler   r   rv   rH   r   face_models_readyr      s5    !##i~(F(Fi27>>ZhKiKiirH   #tuple[FaceDetector, FaceRecognizer]c                     t           5  t          (t          t                    t	          t
                    fat          cd d d            S # 1 swxY w Y   d S r   )_MODELS_LOCKr   r6   r   r   r   rv   rH   r   get_face_modelsr      s    	  ?#N33^N5S5STG                 s   6AAAr   Optional[np.ndarray]c                   | rt           j                            |           sd S t          j        | t          j                  }|s	 t          |                                           }t          j	        |t          j
                  }t          j        |t          j                  }n# t          $ r Y d S w xY w|d S t          |j                  dk    r t          j        |t          j                  }nHt          |j                  dk    r0|j        d         dk    rt          j        |t          j                  }|j        t          j        k    r"|dz                      t          j
                  }|S )NrS   rO   rR         )r   r   r#   rX   imreadIMREAD_UNCHANGEDr   
read_bytesrZ   
frombufferuint8imdecode	Exceptionr   r   cvtColorCOLOR_GRAY2BGRCOLOR_BGRA2BGRrT   uint16r_   )r   rI   rawarrs       r   
load_imager      s@    rw~~d++ t
*T3/
0
0C
{	t**''))C-28444C,sC$899CC 	 	 	44	 {t
39~~l3 233	SY1		1!2!2l3 233
yBISy  **Js   A B' '
B54B5rI   rJ   c                   t          j        dd          }t          j        | t           j                  }|                    |d d d d df                   |d d d d df<   t          j        |t           j                  S )Ng       @)rm   rm   )	clipLimittileGridSizer   )rX   createCLAHEr   COLOR_BGR2LABapplyCOLOR_LAB2BGR)rI   clahelabs      r   enhance_imager      st    Oc???E
,sC-
.
.C;;s111aaa7|,,C111aL<S.///rH   r   r   c                    t          j        | t           j                  }t          t          j        |t           j                                                            S r   )rX   r   COLOR_BGR2GRAYr   	LaplacianCV_64Fvar)r   grays     r   
blur_scorer      s>    <#"455DtSZ004466777rH   rq   list[float]	pad_ratioc                   | j         d d         \  }}d |D             \  }}}}||z
  ||z
  }
}	t          dt          ||	|z  z
                      }t          dt          ||
|z  z
                      }t          |t          ||	|z  z                       }t          |t          ||
|z  z                       }t	          j        | ||||f         t                    S )NrO   c                ,    g | ]}t          |          S rv   )r   )rx   values     r   rz   z"crop_face_bbox.<locals>.<listcomp>  s    555ueEll555rH   r   )r   rW   rL   minrX   rY   r   )rI   rq   r  r`   ra   r   r   r   r   bwbhs              r   crop_face_bboxr	     s    9RaR=DAq55555NBB"Wb2gB	QBi'((	)	)B	QBi'((	)	)B	QBi'((	)	)B	QBi'((	)	)B:c"R%B,'888rH   Tdetector
recognizeruse_enhancerK   rL   conf_threshmin_face_pxlist[tuple[np.ndarray, dict]]c           	        |rt          |           n| }|j        d d         \  }}	|t          k    rt          ||	          dk    rt          n|}
|                    ||
          }|sg S g }|D ]H}|d         \  }}}}||z
  }||z
  }|d         |k     r&||k     s||k     r3|                    |           I|sg S g }t          |          }t          |          D ]\  }}|d         \  }}}}|||d         t          ||z
            t          ||z
            ft          |d         d          |d         d ud d}|d         |
                    ||d                   nt          ||d                   }t          |          }t          |d          |d<   |t          k     rd	nd
|d<   |                    |          }|                    ||f           |S )NrO   i  rq   rr   r   rs   )face_idx
face_countrq   	face_size	det_score
used_alignerrorr   low_qualityokquality)r   r   DET_PROBE_SIZErW   DET_PROBE_SIZE_HQr   r   r   r   roundr   r	  r   r   r   )rI   r
  r  r  rK   r  r  workingr`   ra   effective_max
detections
valid_detsr   r   r   r   r   face_wface_hr~   total_facesidxr0   	face_cropbscoreembs                              r   extract_probe_embeddingsr(  
  sF    %08mC   SG=!DAq)1^)C)CAq		TXHXHX%%^fM-88J 	J  VBBbbw<+%%K6K#7#7# 	Gj//Kj)) $ $SVBB%KR..%R..9s7|Q//e*D0
 
 GJ%jF\J--gs5zBBBbpqxz}  E  {F  cG  cG	I&&"61--\+14D+D+D--$Y&&y11T{####NrH   !tuple[Optional[np.ndarray], dict]c                    t          | |||t          t                    }|sd dddfS dd	}t          ||
          }|d         |d         fS )N)r  rK   r  zno face detectedr   )r  r  ry   tuple[np.ndarray, dict]r   r   c                d    | d         d         }|d         |d         z
  |d         |d         z
  z  S )Nr    rq   rO   r   rR   rv   )ry   rq   s     r   areaz)extract_best_face_embedding.<locals>.areaH  s4    AwvQ$q'!d1gQ&788rH   )keyr    )ry   r+  r   r   )r(  r   r   rW   )rI   r
  r  r  facesr-  bests          r   extract_best_face_embeddingr1  >  s     %S(JKbr  AP  Q  Q  QE D1CCCC9 9 9 9 u$D7DGrH   )r   r   )r   r   r   r   )r   r   )r   r   r   r   )rI   rJ   r   rJ   )r   rJ   r   r   )rI   rJ   rq   r  r  r   r   rJ   )rI   rJ   r
  r6   r  r   r  r   rK   rL   r  r   r  rL   r   r  )T)
rI   rJ   r
  r6   r  r   r  r   r   r)  )0
__future__r   r   	threadingpathlibr   typingr   rX   numpyrZ   shared.config.configr   r   r   r	   r
   setNumThreadsr0   r   r   r%   r   r  r  r   DET_PROBE_CONFr   DET_MIN_FACE_PXr   BBOX_PAD_RATIOLockr   r   __annotations__r   r   r4   r6   r   r   r   r   r   r   r	  r(  r1  rv   rH   r   <module>r>     s   " " " " " " " 				                 



     m m m m m m m m m m m m m m J,---79KLLLL J J JCSIIIIIIIIJ   y~:> > > > >        6[ [ [ [ [ [ [ [|5 5 5 5 5 5 5 5Bj j j j      00 0 0 08 8 8 8
 KY 9 9 9 9 9 "'&1 1 1 1 1p 	      s   !A A; A66A;