Ë
    þÍ:j—3  ã                   ó˜  — d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
Z
d dl
mZmZ ddlmZ ddlmZ dd	lmZ d
dlm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  ddlmZ! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddgZ)de*de*de*dedejV                  f   dejX                  f
d„Z-de*de*dedejV                  f   dejX                  fd„Z.dejV                  fd „Z/ G d!„ d"ejV                  «      Z0 G d#„ d$e(«      Z1 G d%„ d&e(«      Z2 G d'„ d(ejV                  «      Z3d)e	ejh                  ejj                  f   d*e*dedejV                  f   fd+„Z6 G d,„ de«      Z7 e«        ed-e7jp                  fd.e jr                  f¬/«      dd0de jr                  ddd1œd2ee7   d3e:d4ee*   d5ee    d6ee*   deedejV                  f      d7ede'fd8„«       «       Z;y)9é    N)ÚOrderedDict)Úpartial)ÚAnyÚCallableÚOptionalÚUnion)ÚnnÚTensoré   )ÚConv2dNormActivation)ÚObjectDetection)Ú_log_api_usage_onceé   )Ú	mobilenet)Úregister_modelÚWeightsÚWeightsEnum)Ú_COCO_CATEGORIES)Ú_ovewrite_value_paramÚhandle_legacy_interface)Úmobilenet_v3_largeÚMobileNet_V3_Large_Weightsé   )Ú_utils)ÚDefaultBoxGenerator)Ú_validate_trainable_layers)ÚSSDÚSSDScoringHeadÚ%SSDLite320_MobileNet_V3_Large_WeightsÚssdlite320_mobilenet_v3_largeÚin_channelsÚout_channelsÚkernel_sizeÚ
norm_layer.Úreturnc           
      ó’   — t        j                  t        | | || |t         j                  ¬«      t        j                  | |d«      «      S )N)r#   Úgroupsr$   Úactivation_layerr   )r	   Ú
Sequentialr   ÚReLU6ÚConv2d)r!   r"   r#   r$   s       úy/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchvision/models/detection/ssdlite.pyÚ_prediction_blockr-      sE   € ô �=‰=äØØØ#ØØ!ÜŸX™Xô	
ô 	�	‰	�+˜|¨QÓ/óð ó    c                 ó²   — t         j                  }|dz  }t        j                  t        | |d||¬«      t        ||dd|||¬«      t        ||d||¬«      «      S )Nr   r   )r#   r$   r(   r   )r#   Ústrider'   r$   r(   )r	   r*   r)   r   )r!   r"   r$   Ú
activationÚintermediate_channelss        r,   Ú_extra_blockr3   0   sq   € Ü—‘€JØ(¨AÑ-ÐÜ�=‰=äØÐ.¸AÈ*Ðgqô	
ô 	Ø!Ø!ØØØ(Ø!Ø'ô	
ô 	Ø! <¸QÈ:Ðhrô	
ó!ð r.   Úconvc                 óR  — | j                  «       D ]”  }t        |t        j                  «      sŒt        j                  j
                  j                  |j                  dd¬«       |j                  €Œat        j                  j
                  j                  |j                  d«       Œ– y )Ng        ç¸…ëQ¸ž?)ÚmeanÚstd)
ÚmodulesÚ
isinstancer	   r+   ÚtorchÚinitÚnormal_ÚweightÚbiasÚ	constant_)r4   Úlayers     r,   Ú_normal_initrB   I   sl   € Ø—‘“ò 9ˆÜ�eœRŸY™YÕ'Ü�H‰H�M‰M×!Ñ! %§,¡,°S¸dÐ!ÔCØ�z‰zÑ%Ü—‘—‘×'Ñ'¨¯
©
°CÕ8ñ	9r.   c            
       óz   ‡ — e Zd Zdee   dee   dededej                  f   fˆ fd„Zdee	   de
ee	f   fd	„Zˆ xZS )
ÚSSDLiteHeadr!   Únum_anchorsÚnum_classesr$   .c                 ól   •— t         ‰| �  «        t        ||||«      | _        t	        |||«      | _        y ©N)ÚsuperÚ__init__ÚSSDLiteClassificationHeadÚclassification_headÚSSDLiteRegressionHeadÚregression_head)Úselfr!   rE   rF   r$   Ú	__class__s        €r,   rJ   zSSDLiteHead.__init__R   s6   ø€ ô 	‰ÑÔÜ#<¸[È+ÐWbÐdnÓ#oˆÔ Ü4°[À+ÈzÓZˆÕr.   Úxr%   c                 óH   — | j                  |«      | j                  |«      dœS )N)Úbbox_regressionÚ
cls_logits)rN   rL   )rO   rQ   s     r,   ÚforwardzSSDLiteHead.forwardY   s(   € à#×3Ñ3°AÓ6Ø×2Ñ2°1Ó5ñ
ð 	
r.   )Ú__name__Ú
__module__Ú__qualname__ÚlistÚintr   r	   ÚModulerJ   r
   ÚdictÚstrrU   Ú__classcell__©rP   s   @r,   rD   rD   Q   sg   ø„ ð[Ø ™9ð[Ø37¸±9ð[ØKNð[Ø\dÐehÐjl×jsÑjsÐesÑ\tõ[ð
˜˜f™ð 
¨$¨s°F¨{Ñ*;÷ 
r.   rD   c            
       óZ   ‡ — e Zd Zdee   dee   dededej                  f   fˆ fd„Zˆ xZ	S )rK   r!   rE   rF   r$   .c           	      óÌ   •— t        j                  «       }t        ||«      D ]%  \  }}|j                  t	        |||z  d|«      «       Œ' t        |«       t        ‰| �  ||«       y )Nr   ©r	   Ú
ModuleListÚzipÚappendr-   rB   rI   rJ   )	rO   r!   rE   rF   r$   rT   ÚchannelsÚanchorsrP   s	           €r,   rJ   z"SSDLiteClassificationHead.__init__a   se   ø€ ô —]‘]“_ˆ
Ü!$ [°+Ó!>ò 	aÑˆH�gØ×ÑÔ/°¸+ÈÑ:OÐQRÐT^Ó_Õ`ð	aä�ZÔ Ü‰Ñ˜ [Õ1r.   ©
rV   rW   rX   rY   rZ   r   r	   r[   rJ   r^   r_   s   @r,   rK   rK   `   sG   ø„ ð2Ø ™9ð2Ø37¸±9ð2ØKNð2Ø\dÐehÐjl×jsÑjsÐesÑ\t÷2ñ 2r.   rK   c                   óV   ‡ — e Zd Zdee   dee   dedej                  f   fˆ fd„Zˆ xZ	S )rM   r!   rE   r$   .c           	      óÌ   •— t        j                  «       }t        ||«      D ]%  \  }}|j                  t	        |d|z  d|«      «       Œ' t        |«       t        ‰| �  |d«       y )Né   r   rb   )rO   r!   rE   r$   Úbbox_regrf   rg   rP   s          €r,   rJ   zSSDLiteRegressionHead.__init__l   s^   ø€ Ü—=‘=“?ˆÜ!$ [°+Ó!>ò 	UÑˆH�gØ�O‰OÔ-¨h¸¸G¹ÀQÈ
ÓSÕTð	Uä�XÔÜ‰Ñ˜ 1Õ%r.   rh   r_   s   @r,   rM   rM   k   s=   ø„ ð& D¨¡Ið &¸DÀ¹Ið &ÐS[Ð\_Ðac×ajÑajÐ\jÑSk÷ &ñ &r.   rM   c                   ó†   ‡ — e Zd Z	 	 ddej                  dededej                  f   dedef
ˆ fd„Zde	d	e
ee	f   fd
„Zˆ xZS )Ú SSDLiteFeatureExtractorMobileNetÚbackboneÚc4_posr$   .Ú
width_multÚ	min_depthc                 ór  •‡‡— t         ‰| �  «        t        | «       ||   j                  rt	        d«      ‚t        j                  t        j                  g |d | ¢||   j                  d   ‘­Ž t        j                  ||   j                  dd  g||dz   d  ¢­Ž «      | _        ˆˆfd„}t        j                  t        |d   j                   |d«      |«      t         |d«       |d«      |«      t         |d«       |d«      |«      t         |d«       |d«      |«      g«      }t        |«       || _        y )	Nz0backbone[c4_pos].use_res_connect should be Falser   r   c                 ó4   •— t        ‰t        | ‰z  «      «      S rH   )ÚmaxrZ   )Údrr   rq   s    €€r,   ú<lambda>z;SSDLiteFeatureExtractorMobileNet.__init__.<locals>.<lambda>‰   s   ø€ œc )¬S°°Z±Ó-@ÓA€ r.   éÿÿÿÿi   é   é€   )rI   rJ   r   Úuse_res_connectÚ
ValueErrorr	   r)   ÚblockÚfeaturesrc   r3   r"   rB   Úextra)	rO   ro   rp   r$   rq   rr   Ú	get_depthr   rP   s	       ``  €r,   rJ   z)SSDLiteFeatureExtractorMobileNet.__init__u   s  ú€ ô 	‰ÑÔÜ˜DÔ!à�FÑ×+Ò+ÜÐOÓPÐPäŸ™ä�M‰MÐH˜8 G VÐ,ÐH¨h°vÑ.>×.DÑ.DÀQÑ.GÒHÜ�M‰M˜( 6Ñ*×0Ñ0°°Ð4ÐN°xÀÈÁ
ÀÐ7MÒNó
ˆŒô Bˆ	Ü—‘ä˜X b™\×6Ñ6¹	À#»È
ÓSÜ™Y s›^©Y°s«^¸ZÓHÜ™Y s›^©Y°s«^¸ZÓHÜ™Y s›^©Y°s«^¸ZÓHð	ó
ˆô 	�UÔàˆ�
r.   rQ   r%   c           	      ó  — g }| j                   D ]  } ||«      }|j                  |«       Œ | j                  D ]  } ||«      }|j                  |«       Œ t        t	        |«      D ��cg c]  \  }}t        |«      |f‘Œ c}}«      S c c}}w rH   )r~   re   r   r   Ú	enumerater]   )rO   rQ   Úoutputr}   ÚiÚvs         r,   rU   z(SSDLiteFeatureExtractorMobileNet.forward–   s…   € àˆØ—]‘]ò 	ˆEÙ�a“ˆAØ�M‰M˜!Õð	ð —Z‘Zò 	ˆEÙ�a“ˆAØ�M‰M˜!Õð	ô ´I¸fÓ4E×F©D¨A¨qœS ›V QšKÓFÓGÐGùÓFs   Á*B	
)g      ð?é   )rV   rW   rX   r	   r[   rZ   r   ÚfloatrJ   r
   r\   r]   rU   r^   r_   s   @r,   rn   rn   t   sq   ø„ ð  Øñà—)‘)ðð ðð ˜S "§)¡)˜^Ñ,ð	ð
 ðð õðBH˜ð H D¨¨f¨Ñ$5÷ Hr.   rn   ro   Útrainable_layersc           
      ó°  — | j                   } dgt        | «      D ��cg c]  \  }}t        |dd«      sŒ|‘Œ c}}z   t        | «      dz
  gz   }t        |«      }d|cxk  r|k  st	        d«      ‚ t	        d«      ‚|dk(  rt        | «      n|||z
     }| d | D ](  }|j                  «       D ]  }|j                  d«       Œ Œ* t        | |d   |«      S c c}}w )Nr   Ú_is_cnFr   zYtrainable_layers should be in the range [0, {num_stages}], instead got {trainable_layers}éþÿÿÿ)r~   r‚   ÚgetattrÚlenr|   Ú
parametersÚrequires_grad_rn   )	ro   rˆ   r$   r„   ÚbÚstage_indicesÚ
num_stagesÚfreeze_beforeÚ	parameters	            r,   Ú_mobilenet_extractorr•   ¤   sû   € ð
 × Ñ €Hð �C¬°8Ó)<×\¡  AÄÈÈ8ÐUZÕ@[š1Ó\Ñ\Ô`cÐdlÓ`mÐpqÑ`qÐ_rÑr€MÜ�]Ó#€Jð Ð Ô. JÒ.ÜÐtÓuÐuð /ÜÐtÓuÐuØ%5¸Ò%:”C˜”MÀÈjÐ[kÑNkÑ@l€Mà�n�}Ð%ò ,ˆØŸ™›ò 	,ˆIØ×$Ñ$ UÕ+ñ	,ð,ô ,¨H°mÀBÑ6GÈÓTÐTùó ]s
   �C³Cc                   ó@   — e Zd Z edededddddiidd	d
dœ¬«      ZeZy)r   zShttps://download.pytorch.org/models/ssdlite320_mobilenet_v3_large_coco-a79551df.pthi¼}4 )r   r   z]https://github.com/pytorch/vision/tree/main/references/detection#ssdlite320-mobilenetv3-largezCOCO-val2017Úbox_mapgÍÌÌÌÌL5@g-²�ï§â?g¼t“Ö*@zSThese weights were produced by following a similar training recipe as on the paper.)Ú
num_paramsÚ
categoriesÚmin_sizeÚrecipeÚ_metricsÚ_opsÚ
_file_sizeÚ_docs)ÚurlÚ
transformsÚmetaN)rV   rW   rX   r   r   r   ÚCOCO_V1ÚDEFAULT© r.   r,   r   r   »   sG   „ ÙØaØ"à!Ø*ØØuàØ˜tð!ðð
 Ø Ønñ
ô€Gð$ �Gr.   Ú
pretrainedÚpretrained_backbone)ÚweightsÚweights_backboneT)r¨   ÚprogressrF   r©   Útrainable_backbone_layersr$   r¨   rª   rF   r©   r«   Úkwargsc           
      ó”  — t         j                  | «      } t        j                  |«      }d|v rt        j                  d«       | �&d}t        d|t        | j                  d   «      «      }n|€d}t        | duxs |du|dd«      }|du }|€t        t        j                  dd	¬
«      }t        d||||dœ|¤Ž}|€t        |«       t        |||«      }d}	t        t!        d«      D �
cg c]  }
ddg‘Œ c}
dd¬«      }t#        j$                  ||	«      }|j'                  «       }t        |«      t        |j(                  «      k7  r-t+        dt        |«      › dt        |j(                  «      › �«      ‚ddddg d¢g d¢dœ}i |¥|¥}t-        |||	|fdt/        ||||«      i|¤Ž}| �"|j1                  | j3                  |d¬«      «       |S c c}
w )aœ  SSDlite model architecture with input size 320x320 and a MobileNetV3 Large backbone, as
    described at `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`__ and
    `MobileNetV2: Inverted Residuals and Linear Bottlenecks <https://arxiv.org/abs/1801.04381>`__.

    .. betastatus:: detection module

    See :func:`~torchvision.models.detection.ssd300_vgg16` for more details.

    Example:

        >>> model = torchvision.models.detection.ssdlite320_mobilenet_v3_large(weights=SSDLite320_MobileNet_V3_Large_Weights.DEFAULT)
        >>> model.eval()
        >>> x = [torch.rand(3, 320, 320), torch.rand(3, 500, 400)]
        >>> predictions = model(x)

    Args:
        weights (:class:`~torchvision.models.detection.SSDLite320_MobileNet_V3_Large_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.detection.SSDLite320_MobileNet_V3_Large_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        num_classes (int, optional): number of output classes of the model
            (including the background).
        weights_backbone (:class:`~torchvision.models.MobileNet_V3_Large_Weights`, optional): The pretrained
            weights for the backbone.
        trainable_backbone_layers (int, optional): number of trainable (not frozen) layers
            starting from final block. Valid values are between 0 and 6, with 6 meaning all
            backbone layers are trainable. If ``None`` is passed (the default) this value is
            set to 6.
        norm_layer (callable, optional): Module specifying the normalization layer to use.
        **kwargs: parameters passed to the ``torchvision.models.detection.ssd.SSD``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/detection/ssdlite.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.detection.SSDLite320_MobileNet_V3_Large_Weights
        :members:
    Úsizez?The size of the model is already fixed; ignoring the parameter.NrF   r™   é[   é   gü©ñÒMbP?r6   )ÚepsÚmomentum)r¨   rª   r$   Úreduced_tail)é@  r´   r   r   gš™™™™™É?gffffffî?)Ú	min_ratioÚ	max_ratioz4The length of the output channels from the backbone z? do not match the length of the anchor generator aspect ratios gš™™™™™á?i,  )ç      à?r·   r·   )Úscore_threshÚ
nms_threshÚdetections_per_imgÚtopk_candidatesÚ
image_meanÚ	image_stdÚheadT)rª   Ú
check_hashr¥   )r   Úverifyr   ÚwarningsÚwarnr   r�   r¢   r   r   r	   ÚBatchNorm2dr   rB   r•   r   ÚrangeÚ	det_utilsÚretrieve_out_channelsÚnum_anchors_per_locationÚaspect_ratiosr|   r   rD   Úload_state_dictÚget_state_dict)r¨   rª   rF   r©   r«   r$   r¬   Úreduce_tailro   r®   Ú_Úanchor_generatorr"   rE   ÚdefaultsÚmodels                   r,   r    r    Ñ   sI  € ôp 4×:Ñ:¸7ÓC€GÜ1×8Ñ8Ð9IÓJÐà�ÑÜ�‰ÐWÔXàÐØÐÜ+¨M¸;ÌÈGÏLÉLÐYeÑLfÓHgÓh‰Ø	Ð	Øˆä :Ø�tÐÒ;Ð/°tÐ;Ð=VÐXYÐ[\ó!Ðð
 # dÐ*€KàÐÜœRŸ^™^°ÀÔFˆ
ä!ð Ø ¨8À
ÐYdñØhnñ€Hð Ðä�XÔÜ#ØØ!Øó€Hð €DÜ*¼EÀ!»HÖ+E°q¨Q°ªFÒ+EÐQTÐ`dÔeÐÜ×2Ñ2°8¸TÓB€LØ"×;Ñ;Ó=€KÜ
ˆ<ÓœCÐ 0× >Ñ >Ó?Ò?ÜØBÄ3À|ÓCTÐBUð  VUô  VYð  Zj÷  Zxñ  Zxó  Vyð  Uzð  {ó
ð 	
ð
 ØØ!Øò &Ú$ñ	€Hð )�XÐ( Ð(€FÜØØØØñ	ô
 ˜ {°KÀÓLðð ñ€Eð ÐØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÓXÔYà€Lùò? ,Fs   Ã&G)<rÁ   Úcollectionsr   Ú	functoolsr   Útypingr   r   r   r   r;   r	   r
   Úops.miscr   Útransforms._presetsr   Úutilsr   Ú r   Ú_apir   r   r   Ú_metar   r   r   r   Úmobilenetv3r   r   rÅ   Úanchor_utilsr   Úbackbone_utilsr   Ússdr   r   Ú__all__rZ   r[   r)   r-   r3   rB   rD   rK   rM   rn   ÚMobileNetV2ÚMobileNetV3r•   r   r£   ÚIMAGENET1K_V1Úboolr    r¥   r.   r,   ú<module>râ      sD  ðÛ Ý #Ý ß 1Ó 1ã ß å ,Ý 2Ý (Ý ß 7Ñ 7Ý $ß Cß HÝ !Ý -Ý 6ß $ð ,Ø#ð€ðØðØ$'ðØ69ðØGOÐPSÐUW×U^ÑU^ÐP^ÑG_ðà‡]�]óð$˜cð °ð À(È3ÐPR×PYÑPYÈ>ÑBZð Ð_a×_lÑ_ló ð29�r—y‘yó 9ô
�"—)‘)ô 
ô2 ô 2ô&˜Nô &ô-H r§y¡yô -Hð`UØ�I×)Ñ)¨9×+@Ñ+@Ð@ÑAðUàðUð ˜˜bŸi™i˜Ñ(óUô.¨Kô ñ, ÓÙØÐ@×HÑHÐIØ+Ð-G×-UÑ-UÐVôð @DØØ!%Ø=W×=eÑ=eØ/3Ø59òuàÐ;Ñ<ðuð ðuð ˜#‘ð	uð
 Ð9Ñ:ðuð  (¨™}ðuð ˜ # r§y¡y .Ñ1Ñ2ðuð ðuð 	òuó	ó ñ
ur.   