o
    V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+de,de,de,dedej-f dej.f
ddZ/de,de,dedej-f dej.fdd Z0d!ej-fd"d#Z1G d$d% d%ej-Z2G d&d' d'e*Z3G d(d) d)e*Z4G d*d+ d+ej-Z5d,eej6ej7f d-e,dedej-f fd.d/Z8G d0d deZ9e ed1e9j:fd2e"j;fd3dd4de"j;ddd5d6e
e9 d7e<d8e
e, d9e
e" d:e
e, de
edej-f  d;ede)fd<dZ=dS )=    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,   X/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/models/detection/ssdlite.py_prediction_block   s   	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$   strider'   r%   r(   )r
   r*   r)   r   )r"   r#   r%   
activationintermediate_channelsr,   r,   r-   _extra_block0   s&   


r2   convc                 C   sP   |   D ]!}t|tjr%tjjj|jddd |jd ur%tjj	|jd qd S )Ng        Q?)meanstd)
modules
isinstancer
   r+   torchinitnormal_weightbias	constant_)r3   layerr,   r,   r-   _normal_initI   s   
r@   c                
       s^   e Zd Zdee dee dededejf f fddZdee	 d	e
ee	f fd
dZ  ZS )SSDLiteHeadr"   num_anchorsnum_classesr%   .c                    s,   t    t||||| _t|||| _d S N)super__init__SSDLiteClassificationHeadclassification_headSSDLiteRegressionHeadregression_head)selfr"   rB   rC   r%   	__class__r,   r-   rF   R   s   
zSSDLiteHead.__init__xr&   c                 C   s   |  || |dS )N)bbox_regression
cls_logits)rJ   rH   )rK   rN   r,   r,   r-   forwardY   s   zSSDLiteHead.forward)__name__
__module____qualname__r   intr   r
   ModulerF   r   r   strrQ   __classcell__r,   r,   rL   r-   rA   Q   s    &rA   c                
       s@   e Zd Zdee dee dededejf f fddZ  Z	S )rG   r"   rB   rC   r%   .c                    sN   t  }t||D ]\}}|t||| d| q	t| t || d S )Nr   r
   
ModuleListzipappendr.   r@   rE   rF   )rK   r"   rB   rC   r%   rP   channelsanchorsrL   r,   r-   rF   a   s
   z"SSDLiteClassificationHead.__init__
rR   rS   rT   r   rU   r   r
   rV   rF   rX   r,   r,   rL   r-   rG   `   s    rG   c                       s<   e Zd Zdee dee dedejf f fddZ  Z	S )rI   r"   rB   r%   .c                    sN   t  }t||D ]\}}|t|d| d| q	t| t |d d S )N   r   rY   )rK   r"   rB   r%   bbox_regr]   r^   rL   r,   r-   rF   l   s
   zSSDLiteRegressionHead.__init__r_   r,   r,   rL   r-   rI   k   s    4rI   c                       s^   e Zd Z		ddejdededejf dedef
 fd	d
Zde	de
ee	f fddZ  ZS ) SSDLiteFeatureExtractorMobileNet      ?   backbonec4_posr%   .
width_mult	min_depthc              	      s   t    t|  || jrtdttjg |d | || jd R  tj|| jdd  g||d d  R  | _ 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 rD   )maxrU   )drh   rg   r,   r-   <lambda>   s    z;SSDLiteFeatureExtractorMobileNet.__init__.<locals>.<lambda>i         )rE   rF   r   use_res_connect
ValueErrorr
   r)   blockfeaturesrZ   r2   r#   r@   extra)rK   re   rf   r%   rg   rh   	get_depthrt   rL   rk   r-   rF   u   s$   

$*
z)SSDLiteFeatureExtractorMobileNet.__init__rN   r&   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,   )rW   ).0ivr,   r,   r-   
<listcomp>   s    z<SSDLiteFeatureExtractorMobileNet.forward.<locals>.<listcomp>)rs   r\   rt   r   	enumerate)rK   rN   outputrr   r,   r,   r-   rQ      s   

z(SSDLiteFeatureExtractorMobileNet.forward)rc   rd   )rR   rS   rT   r
   rV   rU   r   floatrF   r   r   rW   rQ   rX   r,   r,   rL   r-   rb   t   s    "!rb   re   trainable_layersc                 C   s   | j } dgdd t| D  t| d g }t|}d|  kr'|ks,td td|dkr4t| n|||  }| d | D ]}| D ]}|d qFq@t| |d |S )Nr   c                 S   s    g | ]\}}t |d dr|qS )_is_cnF)getattr)rv   rw   br,   r,   r-   ry      s     z(_mobilenet_extractor.<locals>.<listcomp>r   zYtrainable_layers should be in the range [0, {num_stages}], instead got {trainable_layers}F)rs   rz   lenrq   
parametersrequires_grad_rb   )re   r}   r%   stage_indices
num_stagesfreeze_beforer   	parameterr,   r,   r-   _mobilenet_extractor   s   &r   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-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)rR   rS   rT   r   r   r   COCO_V1DEFAULTr,   r,   r,   r-   r       s$    
pretrainedpretrained_backbone)weightsweights_backboneT)r   progressrC   r   trainable_backbone_layersr%   r   r   rC   r   r   kwargsc                 K   s  t | } t|}d|v rtd | dur%d}td|t| jd }n|du r+d}t| dup3|du|dd}|du }|du rHt	t
jdd	d
}td||||d|}|du r\t| t|||}d}	tdd tdD ddd}
t||	}|
 }t|t|
jkrtdt| dt|
j ddddg dg dd}i ||}t||
|	|fdt||||i|}| du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.NrC   r   [      gMbP?r4   )epsmomentum)r   r   r%   reduced_tail)@  r   c                 S   s   g | ]}d dgqS )r   r   r,   )rv   _r,   r,   r-   ry   ,  s    z1ssdlite320_mobilenet_v3_large.<locals>.<listcomp>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   r@   r   r   range	det_utilsretrieve_out_channelsnum_anchors_per_locationaspect_ratiosrq   r   rA   load_state_dictget_state_dict)r   r   rC   r   r   r%   r   reduce_tailre   r   anchor_generatorr#   rB   defaultsmodelr,   r,   r-   r!      sp   
8


	)>r   collectionsr   	functoolsr   typingr   r   r   r   r   r	   r9   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__rU   rV   r)   r.   r2   r@   rA   rG   rI   rb   MobileNetV2MobileNetV3r   r    r   IMAGENET1K_V1boolr!   r,   r,   r,   r-   <module>   s     
&	0
	