U
    h3                     @   s@  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+e,e,e,edej-f ej.dddZ/e,e,edej-f ej.dddZ0ej-ddd Z1G d!d" d"ej-Z2G d#d$ d$e*Z3G d%d& d&e*Z4G d'd( d(ej-Z5eej6ej7f e,edej-f d)d*d+Z8G d,d deZ9e ed-e9j:fd.e"j;fd/dd0de"j;ddd1e
e9 e<e
e, e
e" e
e, e
edej-f  ee)d2d3dZ=dS )4    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              
   C   s(   t t| | || |t jdt | |dS )N)r$   groupsr%   activation_layerr   )r
   
Sequentialr   ReLU6Conv2d)r"   r#   r$   r%    r,   V/var/www/html/venv/lib/python3.8/site-packages/torchvision/models/detection/ssdlite.py_prediction_block   s    	r.   )r"   r#   r%   r&   c                 C   sJ   t j}|d }t t| |d||dt||dd|||dt||d||dS )Nr   r   )r$   r%   r(   r   )r$   Zstrider'   r%   r(   )r
   r*   r)   r   )r"   r#   r%   Z
activationZintermediate_channelsr,   r,   r-   _extra_block0   s6        
    r/   )convc                 C   sP   |   D ]B}t|tjrtjjj|jddd |jd k	rtjj	|jd qd S )Ng        Q?)ZmeanZstd)
modules
isinstancer
   r+   torchinitZnormal_weightZbiasZ	constant_)r0   layerr,   r,   r-   _normal_initI   s
    
r8   c                       sV   e Zd Zee ee eedejf d fddZee	 e
ee	f dddZ  ZS )SSDLiteHead.r"   num_anchorsnum_classesr%   c                    s,   t    t||||| _t|||| _d S N)super__init__SSDLiteClassificationHeadclassification_headSSDLiteRegressionHeadregression_head)selfr"   r;   r<   r%   	__class__r,   r-   r?   R   s    
zSSDLiteHead.__init__xr&   c                 C   s   |  || |dS )N)Zbbox_regression
cls_logits)rC   rA   )rD   rH   r,   r,   r-   forwardY   s    zSSDLiteHead.forward)__name__
__module____qualname__r   intr   r
   Moduler?   r   r   strrJ   __classcell__r,   r,   rE   r-   r9   Q   s      r9   c                       s:   e Zd Zee ee eedejf d fddZ  Z	S )r@   .r:   c                    sN   t  }t||D ] \}}|t||| d| qt| t || d S )Nr   r
   
ModuleListzipappendr.   r8   r>   r?   )rD   r"   r;   r<   r%   rI   channelsanchorsrE   r,   r-   r?   a   s
    z"SSDLiteClassificationHead.__init__
rK   rL   rM   r   rN   r   r
   rO   r?   rQ   r,   r,   rE   r-   r@   `   s
      r@   c                       s8   e Zd Zee ee edejf d fddZ  Z	S )rB   .)r"   r;   r%   c                    sN   t  }t||D ] \}}|t|d| d| qt| t |d d S )N   r   rR   )rD   r"   r;   r%   Zbbox_regrV   rW   rE   r,   r-   r?   l   s
    zSSDLiteRegressionHead.__init__rX   r,   r,   rE   r-   rB   k   s   rB   c                       sP   e Zd Zd
ejeedejf eed fddZe	e
ee	f ddd	Z  ZS ) SSDLiteFeatureExtractorMobileNet      ?   .)backbonec4_posr%   
width_mult	min_depthc              	      s   t    t|  || jr$tdttj|d | || jd f tj|| jdd  f||d d   | _ fdd}t	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                    s   t  t|  S r=   )maxrN   )dr`   r_   r,   r-   <lambda>       z;SSDLiteFeatureExtractorMobileNet.__init__.<locals>.<lambda>i         )r>   r?   r   Zuse_res_connect
ValueErrorr
   r)   blockfeaturesrS   r/   r#   r8   extra)rD   r]   r^   r%   r_   r`   Z	get_depthrl   rE   rc   r-   r?   u   s$    

 (z)SSDLiteFeatureExtractorMobileNet.__init__rG   c                 C   sV   g }| j D ]}||}|| q
| jD ]}||}|| q(tdd t|D S )Nc                 S   s   g | ]\}}t ||fqS r,   )rP   ).0ivr,   r,   r-   
<listcomp>   s     z<SSDLiteFeatureExtractorMobileNet.forward.<locals>.<listcomp>)rk   rU   rl   r   	enumerate)rD   rH   outputrj   r,   r,   r-   rJ      s    

z(SSDLiteFeatureExtractorMobileNet.forward)r[   r\   )rK   rL   rM   r
   rO   rN   r   floatr?   r   r   rP   rJ   rQ   r,   r,   rE   r-   rZ   t   s     !rZ   )r]   trainable_layersr%   c                 C   s   | j } dgdd t| D  t| d g }t|}d|  krH|ksRn td|dkrbt| n
|||  }| d | D ]}| D ]}|d qqzt| |d |S )Nr   c                 S   s    g | ]\}}t |d dr|qS )Z_is_cnF)getattr)rm   rn   br,   r,   r-   rp      s      z(_mobilenet_extractor.<locals>.<listcomp>r   zYtrainable_layers should be in the range [0, {num_stages}], instead got {trainable_layers}F)rk   rq   lenri   
parametersZrequires_grad_rZ   )r]   rt   r%   Zstage_indicesZ
num_stagesZfreeze_beforerv   Z	parameterr,   r,   r-   _mobilenet_extractor   s    &rz   c                   @   s8   e Zd Zedededddddiid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-val2017Zbox_mapgL5@g-?gt*@zSThese weights were produced by following a similar training recipe as on the paper.)Z
num_params
categoriesZmin_sizeZrecipeZ_metricsZ_ops
_file_sizeZ_docs)urlZ
transformsmetaN)rK   rL   rM   r   r   r   COCO_V1DEFAULTr,   r,   r,   r-   r       s$    Z
pretrainedZpretrained_backbone)weightsweights_backboneT)r   progressr<   r   trainable_backbone_layersr%   )r   r   r<   r   r   r%   kwargsr&   c                 K   s  t | } t|}d|kr&td | dk	rJd}td|t| jd }n|dkrVd}t| dk	pf|dk	|dd}|dk}|dkrt	t
jdd	d
}tf ||||d|}|dkrt| t|||}d}	tdd tdD ddd}
t||	}|
 }t|t|
jkr*tdt| dt|
j dddddddgdddgd}||}t||
|	|fdt||||i|}| dk	r|| j|d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.Nr<   r{   [      gMbP?r1   )epsZmomentum)r   r   r%   Zreduced_tail)@  r   c                 S   s   g | ]}d dgqS )r   r   r,   )rm   _r,   r,   r-   rp   ,  s     z1ssdlite320_mobilenet_v3_large.<locals>.<listcomp>g?gffffff?)Z	min_ratioZ	max_ratioz4The length of the output channels from the backbone z? do not match the length of the anchor generator aspect ratios g?i,  g      ?)Zscore_threshZ
nms_threshZdetections_per_imgZtopk_candidatesZ
image_meanZ	image_stdheadT)r   Z
check_hash)r    verifyr   warningswarnr   rx   r~   r   r   r
   ZBatchNorm2dr   r8   rz   r   range	det_utilsZretrieve_out_channelsZnum_anchors_per_locationZaspect_ratiosri   r   r9   Zload_state_dictZget_state_dict)r   r   r<   r   r   r%   r   Zreduce_tailr]   r   Zanchor_generatorr#   r;   defaultsmodelr,   r,   r-   r!      s|    8


      
	
)>r   collectionsr   	functoolsr   typingr   r   r   r   r   r	   r4   r
   r   Zops.miscr   Ztransforms._presetsr   utilsr    r   Z_apir   r   r   _metar   r   r   r   Zmobilenetv3r   r   r   Zanchor_utilsr   Zbackbone_utilsr   Zssdr   r   __all__rN   rO   r)   r.   r/   r8   r9   r@   rB   rZ   ZMobileNetV2ZMobileNetV3rz   r    r   ZIMAGENET1K_V1boolr!   r,   r,   r,   r-   <module>   st        	1