
    h42              
          S SK Jr  S SK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rS rSS jrSS jr " S S5      rSS jrS	 r\S
:X  Ga  S SKr\" SS9r\R-                  S5        S/r\ GH  r\R2                  " \5      r\" S5       Hi  r\R                  R;                  5       r\R?                  \S5      u  r r!\R                  R;                  5       r"\#" S\"\-
  RI                  5       S-  5        Mk     \#" \\ RJ                  5        \!b  \#" \!RJ                  5        \" \ RJ                  S    5       H  r&\ \&   r'\'RQ                  \RR                  5      u  r*r+r,r-r.\R^                  " \\*\+4\,\-4SS5        \!c  MH  \!\&   r0\0 H:  r1\1RQ                  \RR                  5      r1\Rd                  " \\3" \15      SSS5        M<     M     \Ri                  S5      S   r5\#" S\55        \Rl                  " S\5-  \5        GM     gg)    )divisionNc                     [        U R                  5      S:X  d   e[        R                  " U SS9nUS S 2[        R                  4   n[        R
                  " X-
  5      n[        R                  " USS9nUS S 2[        R                  4   nX#-  $ )N      axis)lenshapenpmaxnewaxisexpsum)zse_xdivs       U/var/www/fran/franai/venv/lib/python3.13/site-packages/insightface/model_zoo/scrfd.pysoftmaxr      ss    qww<1
qqA	!RZZ-A
&&-C
&&1
C
am
C9    c                 f   U SS2S4   USS2S4   -
  nU SS2S4   USS2S4   -
  nU SS2S4   USS2S4   -   nU SS2S4   USS2S4   -   nUbL  UR                  SUS   S9nUR                  SUS   S9nUR                  SUS   S9nUR                  SUS   S9n[        R                  " X4XV/SS9$ )	  Decode distance prediction to bounding box.

Args:
    points (Tensor): Shape (n, 2), [x, y].
    distance (Tensor): Distance from the given point to 4
        boundaries (left, top, right, bottom).
    max_shape (tuple): Shape of the image.

Returns:
    Tensor: Decoded bboxes.
Nr   r   r      minr   r   )clampr   stack)pointsdistance	max_shapex1y1x2y2s          r   distance2bboxr&      s     
1A	&B	1A	&B	1A	&B	1A	&BXX!1X.XX!1X.XX!1X.XX!1X.88RR$2..r   c                 l   / n[        SUR                  S   S5       H  nU SS2US-  4   USS2U4   -   nU SS2US-  S-   4   USS2US-   4   -   nUb&  UR                  SUS   S9nUR                  SUS   S9nUR                  U5        UR                  U5        M     [        R
                  " USS9$ )r   r   r   r   Nr   r   r   )ranger
   r   appendr   r   )r   r    r!   predsipxpys          r   distance2kpsr.   1   s     E1hnnQ'+AqsF^hq!tn,Aqs1uHAaC 00 aYq\2BaYq\2BRR , 88E##r   c                   @    \ rS rSrS
S jrS rS rS rSS jrS r	S	r
g)SCRFDH   Nc                 T   SS K nXl        X l        SU l        SU l        U R                  cX  U R                  c   e[
        R                  " U R                  5      (       d   eUR                  " U R                  S 5      U l        0 U l        SU l	        SU l
        U R                  5         g )Nr   	detectionFg?      ?)onnxruntime
model_filesessiontasknamebatchedospexistsInferenceSessioncenter_cache
nms_thresh
det_thresh
_init_vars)selfr6   r7   r5   s       r   __init__SCRFD.__init__I   s    $#<<??...::doo....&77NDLr   c                 d   U R                   R                  5       S   nUR                  n[        US   [        5      (       a  S U l        O[        USS S S S2   5      U l        UR                  nX l        U R                   R                  5       n[        US   R                  5      S:X  a  SU l        / nU H  nUR                  UR                  5        M      X0l        XPl        SU l        SU l        S	U l        S
U l        SU l        [        U5      S:X  a  SU l        / SQU l        SU l        g [        U5      S:X  a  SU l        / SQU l        SU l        SU l        g [        U5      S:X  a  SU l        / SQU l        SU l        g [        U5      S:X  a  SU l        / SQU l        SU l        SU l        g g )Nr   r      r   r   Tg     _@g      `@F      ?r      )          	   
      )rH   rI   rJ   @         )r7   
get_inputsr
   
isinstancestr
input_sizetuplenameinput_shapeget_outputsr	   r9   r)   
input_nameoutput_names
input_mean	input_stduse_kps_anchor_ratio_num_anchorsfmc_feat_stride_fpn)rA   	input_cfgrW   rY   outputsrZ   os          r   r@   SCRFD._init_varsX   s   LL++-a0	ook!nc**"DO#K!$4TrT$:;DO^^
&,,**,wqz A%DLA' $(  w<?DH$/D! !D\1_DH$/D! !DDL\2DH$8D! !D\2DH$8D! !DDL	 r   c                    US:  a  U R                   R                  S/5        UR                  SS 5      nUb  X0l        UR                  SS 5      nUb  X@l        UR                  SS 5      nUb   U R
                  b  [        S5        g XPl        g g )Nr   CPUExecutionProviderr>   r?   rT   z7warning: det_size is already set in scrfd model, ignore)r7   set_providersgetr>   r?   rT   print)rA   ctx_idkwargsr>   r?   rT   s         r   prepareSCRFD.prepare   s    !8LL&&(>'?@ZZd3
!(OZZd3
!(OZZd3
!*OP",	 "r   c                 "   / n/ n/ n[        UR                  SS S S S2   5      n[        R                  R	                  USU R
                  -  X`R                  U R                  U R                  4SS9nU R                  R                  U R                  U R                  U05      nUR                  S   n	UR                  S   n
U R                  n[        U R                  5       GH$  u  pU R                  (       a7  X   S   nXU-      S   nX-  nU R                  (       a  XUS-  -      S   U-  nO-X   nXU-      nX-  nU R                  (       a  XUS-  -      U-  nX-  nX-  nUU-  nUUU4nUU R                   ;   a  U R                   U   nO["        R$                  " ["        R&                  S U2S U24   S S S2   SS9R)                  ["        R*                  5      nUU-  R-                  S	5      nU R.                  S
:  a2  ["        R$                  " U/U R.                  -  S
S9R-                  S	5      n[1        U R                   5      S:  a  UU R                   U'   ["        R2                  " X:  5      S   n[5        UU5      nUU   nUU   nUR7                  U5        UR7                  U5        U R                  (       d  GM  [9        UW5      nUR-                  UR                  S   SS45      nUU   nUR7                  U5        GM'     X4U4$ )Nr   r   r   rF   T)swapRBr   r   )r   r   r   d   )rU   r
   cv2dnnblobFromImager\   r[   r7   runrZ   rY   r`   	enumeratera   r9   r]   r=   r   r   mgridastypefloat32reshaper_   r	   wherer&   r)   r.   )rA   img	thresholdscores_listbboxes_list	kpss_listrT   blobnet_outsinput_heightinput_widthr`   idxstridescores
bbox_preds	kps_predsheightwidthKkeyanchor_centerspos_indsbboxes
pos_scores
pos_bboxeskpsspos_kpsss                               r   forwardSCRFD.forward   s   	399Qq>$B$/0
ww$$S#dnn*<j??\`\k\kmqm|m|J}  GK$  L<<##D$5$5$7OPzz!}jjmhh$T%:%:;KC||!q)%Ci03
'0
<< (sQw 7 :V CI "%Ci0
'0
<< (sQw 7& @I!+F)EA5&)Cd'''!%!2!23!7  "$"((7F7FUF?*CDbD*IPR!S!Z!Z[][e[e!f #16"9!B!BG!M$$Q&%'XX~.>t?P?P.PWX%Y%a%aci%kNt(()#--;D%%c*xx 1215H">:>F)J)Jz*z*|||#NI>||djjmR%;=>  *s <t 22r   c                 ~   Uc  U R                   c   eUc  U R                   OUn[        UR                  S   5      UR                  S   -  n[        US   5      US   -  nXV:  a  US   n[        Xu-  5      nOUS   n[        X-  5      n[        U5      UR                  S   -  n	[        R
                  " XU45      n
[        R                  " US   US   S4[        R                  S9nXS U2S U2S S 24'   U R                  XR                  5      u  pn[        R                  " U5      nUR                  5       nUR                  5       S S S2   n[        R                  " U5      U	-  nU R                  (       a  [        R                  " U5      U	-  n[        R                  " UU45      R!                  [        R"                  SS9nUUS S 24   nU R%                  U5      nUUS S 24   nU R                  (       a  WUS S 2S S 24   nUUS S 2S S 24   nOS nUS:  Ga  UR                  S   U:  Ga
  US S 2S4   US S 2S4   -
  US S 2S4   US S 2S4   -
  -  nUR                  S   S-  UR                  S   S-  4n[        R                  " US S 2S4   US S 2S4   -   S-  US   -
  US S 2S4   US S 2S4   -   S-  US   -
  /5      n[        R&                  " [        R(                  " US	5      S5      nUS
:X  a  UnOUUS	-  -
  n[        R                  " U5      S S S2   nUSU nUUS S 24   nUb	  UUS S 24   nUU4$ )Nr   r   r   )dtyper   F)copyr   g       @r   )rT   floatr
   intrr   resizer   zerosuint8r   r?   vstackravelargsortr]   hstackrx   ry   nmsr   power)rA   r|   rT   max_nummetricim_ratiomodel_ratio
new_height	new_width	det_scaleresized_imgdet_imgr~   r   r   r   scores_ravelorderr   r   pre_detkeepdetarea
img_centeroffsetsoffset_dist_squaredvaluesbindexs                                r   detectSCRFD.detect   sA   %)DDD(2(:T__

1&15JqM*Z]:#AJJ12I"1IY12J*%		!4	jj*&=>((Z]JqM1=RXXO.9ZiZ*+.2ll7OO.T+);'||~$$&tt,;')3<<99Y')3D))VV,-44RZZe4L%(#xx dAg<<a	?DQq>DDQ;399Q<'11IAqD	)c!Q$i471I/> ?D1*CIIaLA,==JiiQTSAY&!+jm;QTSAY&!+jm;! G #%&&'3)?"Cu} 3c 99ZZ"FAg&Ffai.CFAIDyr   c                    U R                   nUS S 2S4   nUS S 2S4   nUS S 2S4   nUS S 2S4   nUS S 2S4   nXS-
  S-   Xd-
  S-   -  nUR                  5       S S S2   n	/ n
U	R                  S:  Ga  U	S   nU
R                  U5        [        R
                  " X;   X9SS     5      n[        R
                  " XK   XISS     5      n[        R                  " X[   XYSS     5      n[        R                  " Xk   XiSS     5      n[        R
                  " SX-
  S-   5      n[        R
                  " SX-
  S-   5      nUU-  nUX   XSS     -   U-
  -  n[        R                  " UU:*  5      S   nU	US-      n	U	R                  S:  a  GM  U
$ )Nr   r   r   r   rE   r   g        )r>   r   sizer)   r   maximumminimumr{   )rA   detsthreshr"   r#   r$   r%   r   areasr   r   r+   xx1yy1xx2yy2whinterovrindss                        r   r   	SCRFD.nms  s   !Q$Z!Q$Z!Q$Z!Q$Zad11- 2&jj1naAKKN**RUBQRyM2C**RUBQRyM2C**RUBQRyM2C**RUBQRyM2C

3	A.A

3	A.AEE58e!"I&66>?C88C6M*1-D$(OE jj1n  r   )r^   ra   r_   r9   r=   r?   r`   r[   rY   rW   rT   r\   r6   r>   rZ   r7   r8   r]   )NN)Nr   default)__name__
__module____qualname____firstlineno__rB   r@   rm   r   r   r   __static_attributes__ r   r   r0   r0   H   s$    + Z- E3N5nr   r0   c                     U(       d1  [         R                  R                  U 5      (       d   e[        U 5      $ SSKJn  U" SU -  US9n[        U5      $ )Nr   )get_model_filezscrfd_%s)root)ospathr;   r0   model_storer   )rV   downloadr   rl   r   _files         r   	get_scrfdr   1  sF    ww~~d####T{/zD0t<U|r   c                      [        SSS0U D6$ )Nr   T)2p5gkps)r   )rl   s    r   scrfd_2p5gkpsr   ;  s    8888r   __main__z
./det.onnx)r6   r   ztests/data/t1.jpgr   r4   z	all cost:i  )   r   r   r   )r   r   r   /zoutput:z./outputs/%s)N)Fz~/.insightface/models)7
__future__r   datetimenumpyr   onnxr5   r   os.pathr   r:   rr   sysr   r&   r.   r0   r   r   r   globdetectorrm   	img_pathsimg_pathimreadr|   r(   _nowtar   r   r   tbrj   total_secondsr
   r+   bboxrx   r   r"   r#   r$   r%   score	rectanglekpskpcirclerU   splitfilenameimwriter   r   r   <module>r      s         	  
 
/.$.g gR9 z-HR$%Ijj"qA""&&(B#??34LFD""&&(B+2446t;<  	h%$**v||A'A!9D $BFF 3Br"RMM#2w2b'IB1gB266*BJJsE"I9qA  ( >>#&r*i"N8+S1/  r   