
    ڧg3                        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j-        f         dej.        f
dZ/de,de,dedej-        f         dej.        fdZ0dej-        fd Z1 G d! d"ej-                  Z2 G d# d$e*          Z3 G d% d&e*          Z4 G d' d(ej-                  Z5d)eej6        ej7        f         d*e,dedej-        f         fd+Z8 G d, de          Z9 e             ed-e9j:        fd.e"j;        f/          dd0de"j;        ddd1d2e
e9         d3e<d4e
e,         d5e
e"         d6e
e,         de
edej-        f                  d7ede)fd8                        Z=dS )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/html/ai-engine/env/lib/python3.11/site-packages/torchvision/models/detection/ssdlite.py_prediction_blockr/      sQ     =#!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_blockr5   0   s    J(A-=.A*gq	
 	
 	
 	!!(!'	
 	
 	
 	!<Q:hr	
 	
 	
!  r0   convc                 "   |                                  D ]y}t          |t          j                  r]t          j        j                            |j        dd           |j        *t          j        j        	                    |j        d           zd S )Ng        Q?)meanstd)
modules
isinstancer   r-   torchinitnormal_weightbias	constant_)r6   layers     r.   _normal_initrD   I   s}     9 9eRY'' 	9HM!!%,Sd!CCCz%''
C888	9 9r0   c            
            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                     t                                                       t          ||||          | _        t	          |||          | _        d S N)super__init__SSDLiteClassificationHeadclassification_headSSDLiteRegressionHeadregression_head)selfr#   rG   rH   r&   	__class__s        r.   rL   zSSDLiteHead.__init__R   sM     	#<[+Wbdn#o#o 4[+zZZr0   xr'   c                 X    |                      |          |                     |          dS )N)bbox_regression
cls_logits)rP   rN   )rQ   rS   s     r.   forwardzSSDLiteHead.forwardY   s3    #33A6622155
 
 	
r0   )__name__
__module____qualname__r   intr   r   ModulerL   r   r   strrW   __classcell__rR   s   @r.   rF   rF   Q   s        [9[379[KN[\dehjljses\t[ [ [ [ [ [
f 
$sF{*; 
 
 
 
 
 
 
 
r0   rF   c            
       b     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 ]-\  }}|                    t	          |||z  d|                     .t          |           t                                          ||           d S )Nr   r   
ModuleListzipappendr/   rD   rK   rL   )	rQ   r#   rG   rH   r&   rV   channelsanchorsrR   s	           r.   rL   z"SSDLiteClassificationHead.__init__a   s     ]__
!$[+!>!> 	a 	aHg/+:OQRT^__````Z   [11111r0   
rX   rY   rZ   r   r[   r   r   r\   rL   r^   r_   s   @r.   rM   rM   `   st        2923792KN2\dehjljses\t2 2 2 2 2 2 2 2 2 2r0   rM   c                   ^     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 ]-\  }}|                    t	          |d|z  d|                     .t          |           t                                          |d           d S )N   r   rb   )rQ   r#   rG   r&   bbox_regrf   rg   rR   s          r.   rL   zSSDLiteRegressionHead.__init__l   s    =??!$[+!>!> 	U 	UHgOO-hGQ
SSTTTTX1%%%%%r0   rh   r_   s   @r.   rO   rO   k   sj        &DI &DI &S[\_acaj\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                    t                                                       t          |            ||         j        rt	          d          t          j        t          j        g |d |         ||         j        d         R  t          j        ||         j        dd          g||dz   d          R            | _        fd}t          j	        t          |d         j         |d          |          t           |d           |d          |          t           |d           |d          |          t           |d           |d          |          g          }t          |           || _        d S )	Nz0backbone[c4_pos].use_res_connect should be Falser   r   c                 D    t          t          | z                      S rJ   )maxr[   )drt   rs   s    r.   <lambda>z;SSDLiteFeatureExtractorMobileNet.__init__.<locals>.<lambda>   s    c)SZ-@-@AA r0   i         )rK   rL   r   use_res_connect
ValueErrorr   r+   blockfeaturesrc   r5   r$   rD   extra)	rQ   rq   rr   r&   rs   rt   	get_depthr   rR   s	       ``  r.   rL   z)SSDLiteFeatureExtractorMobileNet.__init__u   s    	D!!!F+ 	QOPPPMH8GVG,Hhv.>.DQ.GHHHM(6*04Nx
7MNNN
 
 BAAAA	Xb\6		#
SSYYs^^YYs^^ZHHYYs^^YYs^^ZHHYYs^^YYs^^ZHH	
 
 	U


r0   rS   r'   c                     g }| j         D ]"} ||          }|                    |           #| j        D ]"} ||          }|                    |           #t          d t	          |          D                       S )Nc                 6    g | ]\  }}t          |          |fS  )r]   ).0ivs      r.   
<listcomp>z<SSDLiteFeatureExtractorMobileNet.forward.<locals>.<listcomp>   s&    FFFDAqSVVQKFFFr0   )r   re   r   r   	enumerate)rQ   rS   outputr   s       r.   rW   z(SSDLiteFeatureExtractorMobileNet.forward   s    ] 	 	EaAMM!Z 	 	EaAMM!FFIf4E4EFFFGGGr0   )ro   rp   )rX   rY   rZ   r   r\   r[   r   floatrL   r   r   r]   rW   r^   r_   s   @r.   rn   rn   t   s           )  S")^,	
       BH HDf$5 H H H H H H H Hr0   rn   rq   trainable_layersc                    | j         } dgd t          |           D             z   t          |           dz
  gz   }t          |          }d|cxk    r|k    sn t          d          |dk    rt          |           n
|||z
           }| d |         D ].}|                                D ]}|                    d           /t          | |d         |          S )Nr   c                 :    g | ]\  }}t          |d d          |S )_is_cnF)getattr)r   r   bs      r.   r   z(_mobilenet_extractor.<locals>.<listcomp>   s.    \\\A8UZ@[@[\1\\\r0   r   zYtrainable_layers should be in the range [0, {num_stages}], instead got {trainable_layers}F)r   r   lenr~   
parametersrequires_grad_rn   )rq   r   r&   stage_indices
num_stagesfreeze_beforer   	parameters           r.   _mobilenet_extractorr      s   
  H C\\8)<)<\\\\`cdl`m`mpq`q_rrM]##J  ....J....tuuu%5%:%:CMMMj[kNk@lMn}n% , , 	, 	,I$$U++++	, ,HmB6GTTTr0   c                   H    e Zd Z edededddddiidd	d
d          ZeZdS )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DEFAULTr   r0   r.   r!   r!      sd        ga"!*ut!
  n
 
  G$ GGGr0   
pretrainedpretrained_backbone)weightsweights_backboneT)r   progressrH   r   trainable_backbone_layersr&   r   r   rH   r   r   kwargsc           
         t                               |           } t          j        |          }d|v rt          j        d           | ,d}t          d|t          | j        d                             }n|d}t          | dup|du|dd          }|du }|t          t          j        dd	
          }t          d||||d|}|t          |           t          |||          }d}	t          d t!          d          D             dd          }
t#          j        ||	          }|
                                }t          |          t          |
j                  k    r4t+          dt          |           dt          |
j                             ddddg dg dd}i ||}t-          ||
|	|fdt/          ||||          i|}| *|                    |                     |d                     |S )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   c                     g | ]}d dgS )r   r   r   )r   _s     r.   r   z1ssdlite320_mobilenet_v3_large.<locals>.<listcomp>,  s    +E+E+EqQF+E+E+Er0   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_tailrq   r   anchor_generatorr$   rG   defaultsmodels                  r.   r"   r"      s   p 4::7CCG189IJJWXXX+M;GLYeLfHgHghh		 :t;/t;=VXY[\! !
 #d*KR^FFF
!  8
Yd hn H X#! H D*+E+EE!HH+E+E+EQT`deee28TBBL";;==K
<C 0 >???? {3|CTCT  {  {  VY  Zj  Zx  Vy  Vy  {  {
 
 	

 ! &oo$__	 	H )X((F	 
 {KLL  E g44hSW4XXYYYLr0   )>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      sq    # # # # # #       = = = = = = = = = = = = = = = =          , , , , , , 2 2 2 2 2 2 ( ( ( ( ( (       7 7 7 7 7 7 7 7 7 7 $ $ $ $ $ $ C C C C C C C C H H H H H H H H ! ! ! ! ! ! - - - - - - 6 6 6 6 6 6 $ $ $ $ $ $ $ $ ,#$'69GOPSUWU^P^G_]   $c  (3PRPY>BZ _a_l    29ry 9 9 9 9
 
 
 
 
") 
 
 
2 2 2 2 2 2 2 2& & & & &N & & &-H -H -H -H -Hry -H -H -H`UI)9+@@AUU bi(U U U U.    K   , @HI+-G-UV   @D!%=W=e/359u u u;<u u #	u
 9:u  (}u #ry.12u u 	u u u	  
u u ur0   