
    kh3                        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	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jZ                  f   dej\                  f
dZ/de,de,dedejZ                  f   dej\                  fdZ0dejZ                  fd Z1 G d! d"ejZ                        Z2 G d# d$e*      Z3 G d% d&e*      Z4 G d' d(ejZ                        Z5d)eejl                  ejn                  f   d*e,dedejZ                  f   fd+Z8 G d, de      Z9 e        ed-e9jt                  fd.e"jv                  f/      dd0de"jv                  ddd1d2e
e9   d3e<d4e
e,   d5e
e"   d6e
e,   de
edejZ                  f      d7ede)fd8              Z=y)9    N)OrderedDict)partial)AnyCallableDictList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       `/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/models/detection/ssdlite.py_prediction_blockr/      sE     ==#!XX	
 			+|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_blockr5   0   sq    J(A-==.A*gq	
 	!!(!'	
 	!<Q:hr	
! r0   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_)r6   layers     r.   _normal_initrD   I   sl     9eRYY'HHMM!!%,,Sd!Czz%''

C8	9r0   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#   rG   rH   r&   	__class__s        r.   rL   zSSDLiteHead.__init__R   s6     	#<[+Wbdn#o 4[+zZr0   xr'   c                 H    | j                  |      | j                  |      dS )N)bbox_regression
cls_logits)rP   rN   )rQ   rS   s     r.   forwardzSSDLiteHead.forwardY   s(    #33A62215
 	
r0   )__name__
__module____qualname__r   intr   r   ModulerL   r   r   strrW   __classcell__rR   s   @r.   rF   rF   Q   sg    [9[379[KN[\dehjljsjses\t[
f 
$sF{*; 
r0   rF   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 )rM   r#   rG   rH   r&   .c           	          t        j                         }t        ||      D ]%  \  }}|j                  t	        |||z  d|             ' t        |       t        |   ||       y )Nr   r   
ModuleListzipappendr/   rD   rK   rL   )	rQ   r#   rG   rH   r&   rV   channelsanchorsrR   s	           r.   rL   z"SSDLiteClassificationHead.__init__a   se     ]]_
!$[+!> 	aHg/+:OQRT^_`	aZ [1r0   
rX   rY   rZ   r   r[   r   r   r\   rL   r^   r_   s   @r.   rM   rM   `   sG    2923792KN2\dehjljsjses\t2 2r0   rM   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 )rO   r#   rG   r&   .c           	          t        j                         }t        ||      D ]%  \  }}|j                  t	        |d|z  d|             ' t        |       t        |   |d       y )N   r   rb   )rQ   r#   rG   r&   bbox_regrf   rg   rR   s          r.   rL   zSSDLiteRegressionHead.__init__l   s^    ==?!$[+!> 	UHgOO-hGQ
ST	UX1%r0   rh   r_   s   @r.   rO   rO   k   s=    &DI &DI &S[\_acajaj\jSk & &r0   rO   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 rJ   )maxr[   )drr   rq   s    r.   <lambda>z;SSDLiteFeatureExtractorMobileNet.__init__.<locals>.<lambda>   s    c)SZ-@A r0   i         )rK   rL   r   use_res_connect
ValueErrorr   r+   blockfeaturesrc   r5   r$   rD   extra)	rQ   ro   rp   r&   rq   rr   	get_depthr   rR   s	       ``  r.   rL   z)SSDLiteFeatureExtractorMobileNet.__init__u   s    	D!F++OPPMMH8GV,Hhv.>.D.DQ.GHMM(6*004Nx
7MN
 B	Xb\66	#
SYs^Ys^ZHYs^Ys^ZHYs^Ys^ZH	
 	U
r0   rS   r'   c           	         g }| j                   D ]  } ||      }|j                  |        | j                  D ]  } ||      }|j                  |        t        t	        |      D cg c]  \  }}t        |      |f c}}      S c c}}w rJ   )r~   re   r   r   	enumerater]   )rQ   rS   outputr}   ivs         r.   rW   z(SSDLiteFeatureExtractorMobileNet.forward   s    ]] 	EaAMM!	 ZZ 	EaAMM!	 If4EFDAqSVQKFGGFs   *B	
)g      ?   )rX   rY   rZ   r   r\   r[   r   floatrL   r   r   r]   rW   r^   r_   s   @r.   rn   rn   t   sq      ))  S"))^,	
  BH HDf$5 Hr0   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8UZ@[1\\`cdl`mpq`q_rrM]#J  .J.tuu /tuu%5%:CMj[kNk@lMn}% , 	,I$$U+	,, ,HmB6G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_mapgL5@g-?gt*@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)rX   rY   rZ   r   r   r   COCO_V1DEFAULT r0   r.   r!   r!      sG    a"!*ut!
  n
G$ Gr0   
pretrainedpretrained_backbone)weightsweights_backboneT)r   progressrH   r   trainable_backbone_layersr&   r   r   rH   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.NrH   r   [      gMbP?r8   )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   rD   r   r   range	det_utilsretrieve_out_channelsnum_anchors_per_locationaspect_ratiosr|   r   rF   load_state_dictget_state_dict)r   r   rH   r   r   r&   r   reduce_tailro   r   _anchor_generatorr$   rG   defaultsmodels                   r.   r"   r"      sI   p 4::7CG1889IJWX+M;GLLYeLfHgh		 :t;/t;=VXY[\!
 #d*KR^^F
!  8
YdhnH X#!H D*E!H+EqQF+EQT`de228TBL";;=K
<C 0 > >??B3|CTBU  VU  VY  Zj  Zx  Zx  Vy  Uz  {
 	

 ! &$	H )X((F	
 {KL E g44hSW4XYL? ,Fs   &G)>r   collectionsr   	functoolsr   typingr   r   r   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__r[   r\   r+   r/   r5   rD   rF   rM   rO   rn   MobileNetV2MobileNetV3r   r!   r   IMAGENET1K_V1boolr"   r   r0   r.   <module>r      sD    #  = =   , 2 (  7 7 $ C H ! - 6 $ ,#$'69GOPSUWU^U^P^G_]]$c  (3PRPYPY>BZ _a_l_l 29ryy 9
")) 
2 2&N &-Hryy -H`UI))9+@+@@AUU bii(U.K , @HHI+-G-U-UV @D!%=W=e=e/359u;<u u #	u
 9:u  (}u #ryy.12u u 	u	 
ur0   