ó
    EñiM.  ã                   ó�   • S SK r S SKJr  S SKrS SKJrJr  SSKJr   " S S\R                  5      r	 " S S	\R                  5      r
g)
é    N)ÚOptional)ÚnnÚTensoré   )Ú	ImageListc                   óˆ  ^ • \ rS rSrSrS\\R                     0r  SU 4S jjr	\R                  \R                  " S5      4S\\   S\\   S\R                  S	\R                  S
\4
S jjrS\R                  S	\R                  4S jrS
\\   4S jrS\\\      S\\\      S
\\   4S jrS\S\\   S
\\   4S jrSrU =r$ )ÚAnchorGeneratoré
   ao  
Module that generates anchors for a set of feature maps and
image sizes.

The module support computing anchors at multiple sizes and aspect ratios
per feature map. This module assumes aspect ratio = height / width for
each anchor.

sizes and aspect_ratios should have the same number of elements, and it should
correspond to the number of feature maps.

sizes[i] and aspect_ratios[i] can have an arbitrary number of elements,
and AnchorGenerator will output a set of sizes[i] * aspect_ratios[i] anchors
per spatial location for feature map i.

Args:
    sizes (Tuple[Tuple[int]]):
    aspect_ratios (Tuple[Tuple[float]]):
Úcell_anchorsc                 óh  >• [         TU ]  5         [        US   [        [        45      (       d  [	        S U 5       5      n[        US   [        [        45      (       d  U4[        U5      -  nXl        X l        [        X5       VVs/ s H  u  p4U R                  X45      PM     snnU l
        g s  snnf )Nr   c              3   ó&   #   • U  H  o4v •  M	     g 7f©N© )Ú.0Úss     Úf/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torchvision/models/detection/anchor_utils.pyÚ	<genexpr>Ú+AnchorGenerator.__init__.<locals>.<genexpr>,   s   é € Ð.ª 1�$ªùs   ‚)ÚsuperÚ__init__Ú
isinstanceÚlistÚtupleÚlenÚsizesÚaspect_ratiosÚzipÚgenerate_anchorsr   )Úselfr   r   ÚsizeÚaspect_ratioÚ	__class__s        €r   r   ÚAnchorGenerator.__init__#   s�   ø€ ô
 	‰ÑÔä˜% ™(¤T¬5 M×2Ñ2äÑ.©Ó.Ó.ˆEÜ˜-¨Ñ*¬T´5¨M×:Ñ:Ø*Ð,¬s°5«zÑ9ˆMàŒ
Ø*ÔäPSÐTYÔPiô
ÚPiÑ:L¸$ˆD×!Ñ! $Ö5ÑPiò
ˆÕùó 
s   ÂB.ÚcpuÚscalesr   ÚdtypeÚdeviceÚreturnc                 ón  • [         R                  " XUS9n[         R                  " X#US9n[         R                  " U5      nSU-  nUS S 2S 4   US S S 24   -  R                  S5      nUS S 2S 4   US S S 24   -  R                  S5      n[         R                  " U* U* Xx/SS9S-  n	U	R                  5       $ )N©r&   r'   r   éÿÿÿÿ©Údimé   )ÚtorchÚ	as_tensorÚsqrtÚviewÚstackÚround)
r   r%   r   r&   r'   Úh_ratiosÚw_ratiosÚwsÚhsÚbase_anchorss
             r   r   Ú AnchorGenerator.generate_anchors:   s¶   € ô —’ ¸VÑDˆÜŸš¨È6ÑRˆÜ—:’:˜mÓ,ˆØ�x‘<ˆà’q˜$�wÑ &¨ªq¨¡/Ñ1×7Ñ7¸Ó;ˆØ’q˜$�wÑ &¨ªq¨¡/Ñ1×7Ñ7¸Ó;ˆä—{’{ R C¨"¨¨bÐ#5¸1Ñ=ÀÑAˆØ×!Ñ!Ó#Ð#ó    c                 ój   • U R                    Vs/ s H  o3R                  XS9PM     snU l         g s  snf )Nr*   )r   Úto)r   r&   r'   Úcell_anchors       r   Úset_cell_anchorsÚ AnchorGenerator.set_cell_anchorsL   s-   € Ø[_×[lÒ[lÓmÒ[lÈKŸ^™^°%˜^ÓGÑ[lÑmˆÕùÒms   �0c                 ó¢   • [        U R                  U R                  5       VVs/ s H  u  p[        U5      [        U5      -  PM     snn$ s  snnf r   )r   r   r   r   )r   r   Úas      r   Únum_anchors_per_locationÚ(AnchorGenerator.num_anchors_per_locationO   s;   € Ü,/°·
±
¸D×<NÑ<NÔ,OÔPÒ,O¡D A”�A“œ˜Q›”Ñ,OÒPÐPùÓPs   ¤#AÚ
grid_sizesÚstridesc           	      ó  • / nU R                   n[        R                  " US LS5        [        R                  " [        U5      [        U5      s=:H  =(       a    [        U5      :H  Os  S5        [	        XU5       GH  u  pVnUu  p‰Uu  p«UR
                  n[        R                  " SU	[        R                  US9U-  n[        R                  " SU[        R                  US9U
-  n[        R                  " XíSS9u  nnUR                  S5      nUR                  S5      n[        R                  " UUUU4SS	9nUR                  UR                  SSS
5      UR                  SSS
5      -   R                  SS
5      5        GM     U$ )Nzcell_anchors should not be NonezíAnchors should be Tuple[Tuple[int]] because each feature map could potentially have different sizes and aspect ratios. There needs to be a match between the number of feature maps passed and the number of sizes / aspect ratios specified.r   r*   Úij©Úindexingr+   r   r,   é   )r   r/   Ú_assertr   r   r'   ÚarangeÚint32ÚmeshgridÚreshaper3   Úappendr2   )r   rE   rF   Úanchorsr   r    Ústrider9   Úgrid_heightÚ
grid_widthÚstride_heightÚstride_widthr'   Úshifts_xÚshifts_yÚshift_yÚshift_xÚshiftss                     r   Úgrid_anchorsÚAnchorGenerator.grid_anchorsT   sV  € ØˆØ×(Ñ(ˆÜ�Š�l¨$Ð.Ð0QÔRÜ�ŠÜ�
‹Oœs 7›|×@Ó@¬s°<Ó/@Ô@ðUô	
ô +.¨jÀ<×*PÑ&ˆD˜,Ø&*Ñ#ˆKØ*0Ñ'ˆMØ!×(Ñ(ˆFô —|’| A z¼¿¹ÈVÑTÐWcÑcˆHÜ—|’| A {¼%¿+¹+ÈfÑUÐXeÑeˆHÜ$Ÿ~š~¨hÈ4ÑPÑˆG�WØ—o‘o bÓ)ˆGØ—o‘o bÓ)ˆGÜ—[’[ '¨7°G¸WÐ!EÈ1ÑMˆFð �N‰N˜FŸK™K¨¨A¨qÓ1°L×4EÑ4EÀaÈÈQÓ4OÑO×XÑXÐY[Ð]^Ó_×`ñ +Qð" ˆr;   Ú
image_listÚfeature_mapsc           
      ó  • U Vs/ s H  o3R                   SS  PM     nnUR                  R                   SS  nUS   R                  US   R                  pvU Vs/ s H{  n[        R
                  " S[        R                  US9R                  US   US   -  5      [        R
                  " S[        R                  US9R                  US   US   -  5      /PM}     n	nU R                  Xg5        U R                  XI5      n
/ n[        [        UR                  5      5       H%  nU
 Vs/ s H  oÝPM     nnUR                  U5        M'     U Vs/ s H  n[        R                  " U5      PM     nnU$ s  snf s  snf s  snf s  snf )Néþÿÿÿr   r   r*   r   )ÚshapeÚtensorsr&   r'   r/   ÚemptyÚint64Úfill_r?   r]   Úranger   Úimage_sizesrQ   Úcat)r   r_   r`   Úfeature_maprE   Ú
image_sizer&   r'   ÚgrF   Úanchors_over_all_feature_mapsrR   Ú_Úanchors_per_feature_mapÚanchors_in_imageÚanchors_per_images                   r   ÚforwardÚAnchorGenerator.forwards   s~  € Ù@LÓMÂ°×'Ñ'¨¨Ó,Áˆ
ÐMØ×'Ñ'×-Ñ-¨b¨cÐ2ˆ
Ø$ Q™×-Ñ-¨|¸A©×/EÑ/Eˆvñ  ó
ò
  �ô —’˜B¤e§k¡k¸&ÑA×GÑGÈ
ÐSTÉÐYZÐ[\ÑY]ÑH]Ó^Ü—’˜B¤e§k¡k¸&ÑA×GÑGÈ
ÐSTÉÐYZÐ[\ÑY]ÑH]Ó^óñ  ð 	ð 
ð 	×Ñ˜eÔ,Ø(,×(9Ñ(9¸*Ó(NÐ%Ø,.ˆÜ”s˜:×1Ñ1Ó2Ö3ˆAÙWtÓuÒWtÐ<SÒ 7ÑWtÐÐuØ�N‰NÐ+Ö,ñ 4ñ JQÓQÊÐ4E”5—9’9Ð.Ö/ÉˆÐQØˆùò# Nùò
ùò  vùâQs   …E0ÁBE5Ä&E:Å E?)r   r   r   )))é€   é   i   ))ç      à?ç      ð?g       @)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r/   r   Ú__annotations__r   Úfloat32r'   ÚintÚfloatr&   r   r?   rC   r]   r   rs   Ú__static_attributes__Ú__classcell__©r"   s   @r   r	   r	   
   s  ø† ñð* 	˜˜UŸ\™\Ñ*ð€Oð !Ø(÷
ð6 #Ÿ]™]Ø$Ÿ|š|¨EÓ2ñ$à�S‘	ð$ð ˜E‘{ð$ð �{‰{ð	$ð
 —‘ð$ð 
õ$ð$n e§k¡kð n¸5¿<¹<ô nðQ¨$¨s©)ô Qð
 t¨D°©I¡ð ÀÀdÈ6ÁlÑASð ÐX\Ð]cÑXdô ð> )ð ¸4À¹<ð ÈDÐQWÉL÷ ò r;   r	   c                   óœ  ^ • \ rS rSrSr     SS\\\      S\S\S\\\      S\\\      S\	4U 4S	 jjjr
\R                  \R                  " S
5      4S\S\R                  S\R                  S\\   4S jjrS\\   4S jr\R                  4S\\\      S\\   S\R                  S\4S jjrS\4S jrS\S\\   S\\   4S jrSrU =r$ )ÚDefaultBoxGeneratoréˆ   a‘  
This module generates the default boxes of SSD for a set of feature maps and image sizes.

Args:
    aspect_ratios (List[List[int]]): A list with all the aspect ratios used in each feature map.
    min_ratio (float): The minimum scale :math:`    ext{s}_{        ext{min}}` of the default boxes used in the estimation
        of the scales of each feature map. It is used only if the ``scales`` parameter is not provided.
    max_ratio (float): The maximum scale :math:`    ext{s}_{        ext{max}}`  of the default boxes used in the estimation
        of the scales of each feature map. It is used only if the ``scales`` parameter is not provided.
    scales (List[float]], optional): The scales of the default boxes. If not provided it will be estimated using
        the ``min_ratio`` and ``max_ratio`` parameters.
    steps (List[int]], optional): It's a hyper-parameter that affects the tiling of default boxes. If not provided
        it will be estimated from the data.
    clip (bool): Whether the standardized values of default boxes should be clipped between 0 and 1. The clipping
        is applied while the boxes are encoded in format ``(cx, cy, w, h)``.
r   Ú	min_ratioÚ	max_ratior%   ÚstepsÚclipc                 ó¤  >• [         T
U ]  5         Ub#  [        U5      [        U5      :w  a  [        S5      eXl        XPl        X`l        [        U5      nUcZ  US:”  aK  X2-
  n[        U5       V	s/ s H  o’X‰-  US-
  -  -   PM     sn	U l        U R                  R                  S5        OX#/U l        OX@l        U R                  U5      U l        g s  sn	f )Nz3aspect_ratios and steps should have the same lengthr   rx   )r   r   r   Ú
ValueErrorr   rŠ   r‹   rh   r%   rQ   Ú_generate_wh_pairsÚ	_wh_pairs)r   r   rˆ   r‰   r%   rŠ   r‹   Únum_outputsÚrange_ratioÚkr"   s             €r   r   ÚDefaultBoxGenerator.__init__š   sÉ   ø€ ô 	‰ÑÔØÑ¤ ]Ó!3´s¸5³zÓ!AÜÐRÓSÐSØ*ÔØŒ
ØŒ	Ü˜-Ó(ˆð ‰>Ø˜Q‹Ø'Ñ3�ÜZ_Ð`kÔZlÓmÒZlÐUV¨;©?¸kÈCÑ>OÑ+PÔPÑZlÑm�”Ø—‘×"Ñ" 3Õ'à(Ð4�•à ŒKà×0Ñ0°Ó=ˆ�ùò ns   Á-Cr$   r�   r&   r'   r(   c           	      óÖ  • / n[        U5       H×  nU R                  U   n[        R                  " U R                  U   U R                  US-      -  5      nXf/Xw//nU R                  U    HR  n	[        R                  " U	5      n
U R                  U   U
-  nU R                  U   U
-  nUR                  X¼/XË//5        MT     UR                  [        R                  " X‚US95        MÙ     U$ )Nr   r*   )	rh   r%   Úmathr1   r   ÚextendrQ   r/   r0   )r   r�   r&   r'   r�   r’   Ús_kÚ	s_prime_kÚwh_pairsÚarÚsq_arÚwÚhs                r   rŽ   Ú&DefaultBoxGenerator._generate_wh_pairs¸   sÜ   € ð #%ˆ	Ü�{Ö#ˆAà—+‘+˜a‘.ˆCÜŸ	š	 $§+¡+¨a¡.°4·;±;¸qÀ1¹uÑ3EÑ"EÓFˆIØ˜
 YÐ$:Ð;ˆHð ×(Ñ(¨Ô+�ÜŸ	š	 "›�Ø—K‘K ‘N UÑ*�Ø—K‘K ‘N UÑ*�Ø—‘ ! ¨!¨Ð 0Ö1ñ	 ,ð ×ÑœUŸ_š_¨XÈ6ÑRÖSñ $ð Ðr;   c                 ód   • U R                    Vs/ s H  nSS[        U5      -  -   PM     sn$ s  snf )Nr.   )r   r   )r   Úrs     r   rC   Ú,DefaultBoxGenerator.num_anchors_per_locationÌ   s.   € à(,×(:Ò(:Ó;Ò(: 1��Aœ˜A›‘J”Ñ(:Ñ;Ð;ùÒ;s   �-rE   rl   c                 óv  • / n[        U5       GH“  u  pVU R                  b+  US   U R                  U   -  nUS   U R                  U   -  nOUu  p‡[        R                  " SUS   5      S-   U-  R	                  US9n	[        R                  " SUS   5      S-   U-  R	                  US9n
[        R
                  " X©SS9u  p¼UR                  S5      nUR                  S5      n[        R                  " XË4[        U R                  U   5      -  SS9R                  SS	5      nU R                  (       a  U R                  U   R                  SSS
9OU R                  U   nUR                  US   US   -  S5      n[        R                  " Xß4SS9nUR                  U5        GM–     [        R                  " USS9$ )Nr   r   rw   ©r&   rH   rI   r+   r,   r.   )ÚminÚmax)Ú	enumeraterŠ   r/   rM   r=   rO   rP   r3   r   r�   r‹   ÚclampÚrepeatrj   rQ   )r   rE   rl   r&   Údefault_boxesr’   Úf_kÚx_f_kÚy_f_krX   rY   rZ   r[   r\   Ú_wh_pairr™   Údefault_boxs                    r   Ú_grid_default_boxesÚ'DefaultBoxGenerator._grid_default_boxesÑ   s”  € ð ˆÜ 
×+‰FˆAà�z‰zÑ%Ø" 1™¨¯
©
°1©Ñ5�Ø" 1™¨¯
©
°1©Ñ5‘à"‘�äŸš a¨¨Q©Ó0°3Ñ6¸%Ñ?×CÑCÈ%ÐCÐPˆHÜŸš a¨¨Q©Ó0°3Ñ6¸%Ñ?×CÑCÈ%ÐCÐPˆHÜ$Ÿ~š~¨hÈ4ÑPÑˆGØ—o‘o bÓ)ˆGØ—o‘o bÓ)ˆGä—[’[ 'Ð!3´c¸$¿.¹.ÈÑ:KÓ6LÑ!LÐRTÑU×]Ñ]Ð^`ÐbcÓdˆFà@DÇ	Ç	�t—~‘~ aÑ(×.Ñ.°1¸!Ð.Ñ<ÈtÏ~É~Ð^_ÑO`ˆHØ—‘¨¨A©°°Q±©¸!Ó<ˆHäŸ)š) VÐ$6¸AÑ>ˆKà× Ñ  ×-ñ+ ,ô. �yŠy˜¨AÑ.Ð.r;   c           
      ó    • U R                   R                   SU R                   SU R                   SU R                   SU R
                   S3
nU$ )Nz(aspect_ratios=z, clip=z	, scales=z, steps=Ú))r"   ry   r   r‹   r%   rŠ   )r   r   s     r   Ú__repr__ÚDefaultBoxGenerator.__repr__î   sX   € à�~‰~×&Ñ&Ð'ð (Ø!×/Ñ/Ð0Ø�d—i‘i�[Ø˜Ÿ™�}Ø�t—z‘z�lØðð 	
ð ˆr;   r_   r`   c           
      ó6  • U Vs/ s H  o3R                   SS  PM     nnUR                  R                   SS  nUS   R                  US   R                  pvU R	                  XEUS9nUR                  U5      n/ n	[        R                  " US   US   /UR                  S9n
UR                   He  nUn[        R                  " US S 2S S24   SUS S 2SS 24   -  -
  U
-  US S 2S S24   SUS S 2SS 24   -  -   U
-  /S5      nU	R                  U5        Mg     U	$ s  snf )	Nrb   r   r£   r   )r'   r.   rw   r+   )rc   rd   r&   r'   r¯   r=   r/   Útensorri   rj   rQ   )r   r_   r`   rk   rE   rl   r&   r'   r©   ÚdboxesÚx_y_sizero   Údboxes_in_images                r   rs   ÚDefaultBoxGenerator.forwardù   s=  € Ù@LÓMÂ°×'Ñ'¨¨Ó,Áˆ
ÐMØ×'Ñ'×-Ñ-¨b¨cÐ2ˆ
Ø$ Q™×-Ñ-¨|¸A©×/EÑ/EˆvØ×0Ñ0°ÈuÐ0ÐUˆØ%×(Ñ(¨Ó0ˆàˆÜ—<’< ¨A¡°
¸1±Ð >À}×G[ÑG[Ñ\ˆØ×'Ô'ˆAØ+ˆOÜ#Ÿišià$¢Q¨¨¨ UÑ+¨c°OÂAÀqÁrÀEÑ4JÑ.JÑJÈhÑVØ$¢Q¨¨¨ UÑ+¨c°OÂAÀqÁrÀEÑ4JÑ.JÑJÈhÑVðð óˆOð �M‰M˜/Ö*ñ (ð ˆùò% Ns   …D)r�   r   r‹   r%   rŠ   )g333333Ã?gÍÌÌÌÌÌì?NNT)ry   rz   r{   r|   r}   r   r€   r�   r   Úboolr   r/   r   r'   r&   r   rŽ   rC   r¯   Ústrr³   r   rs   r‚   rƒ   r„   s   @r   r†   r†   ˆ   sF  ø† ñð(  ØØ(,Ø%)Øñ>à˜D ™I‘ð>ð ð>ð ð	>ð
 ˜˜e™Ñ%ð>ð ˜˜S™	Ñ"ð>ð ÷>ð >ð> 6;·]±]Ð[`×[gÒ[gÐhmÓ[nñØðØ',§{¡{ðØLQÏLÉLðà	ˆf‰õð(<¨$¨s©)ô <ð X]×WdÑWdñ/Ø˜t C™y™/ð/Ø7;¸C±yð/ØINÏÉð/à	õ/ð:	˜#ô 	ð )ð ¸4À¹<ð ÈDÐQWÉL÷ ò r;   r†   )r•   Útypingr   r/   r   r   r_   r   ÚModuler	   r†   r   r;   r   Ú<module>r¿      s9   ðÛ Ý ã ß å !ô{�b—i‘iô {ô|D˜"Ÿ)™)õ Dr;   