a
    PSic!4                     @   sR  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 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Z/ej,ddd Z0G d!d" d"ej,Z1G d#d$ d$e)Z2G d%d& d&e)Z3G d'd( d(ej,Z4eej5ej6f e+edej,f d)d*d+Z7G d,d deZ8ed-e8j9fd.e j:fd/dd0de j:ddd1e
e8 e;e
e+ e
e  e
e+ e
edej,f  ee(d2d3dZ<d
d4lm=Z= e=d5e8j9j>iZ?dS )6    N)OrderedDict)partial)AnyCallableDictListOptionalUnion)nnTensor   )Conv2dNormActivation)ObjectDetection)_log_api_usage_once   )	mobilenet)WeightsEnumWeights)_COCO_CATEGORIES)handle_legacy_interface_ovewrite_value_param)MobileNet_V3_Large_Weightsmobilenet_v3_large   )_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+   `/var/www/html/django/DPS/env/lib/python3.9/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#   strider&   r$   r'   )r
   r)   r(   r   )r!   r"   r$   
activationZintermediate_channelsr+   r+   r,   _extra_block0   s&    


r0   )convc                 C   sP   |   D ]B}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_)r1   layerr+   r+   r,   _normal_initI   s
    
r>   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!   rA   rB   r$   	__class__r+   r,   rE   R   s    
zSSDLiteHead.__init__xr%   c                 C   s   |  || |dS )N)bbox_regression
cls_logits)rI   rG   )rJ   rN   r+   r+   r,   forwardY   s    zSSDLiteHead.forward)__name__
__module____qualname__r   intr   r
   ModulerE   r   r   strrQ   __classcell__r+   r+   rK   r,   r?   Q   s   r?   c                       s:   e Zd Zee ee eedejf d fddZ  Z	S )rF   .r@   c                    sN   t  }t||D ] \}}|t||| d| qt| t || d S )Nr   r
   
ModuleListzipappendr-   r>   rD   rE   )rJ   r!   rA   rB   r$   rP   channelsanchorsrK   r+   r,   rE   a   s
    z"SSDLiteClassificationHead.__init__
rR   rS   rT   r   rU   r   r
   rV   rE   rX   r+   r+   rK   r,   rF   `   s   rF   c                       s8   e Zd Zee ee edejf d fddZ  Z	S )rH   .)r!   rA   r$   c                    sN   t  }t||D ] \}}|t|d| d| qt| t |d d S )N   r   rY   )rJ   r!   rA   r$   bbox_regr]   r^   rK   r+   r,   rE   l   s
    zSSDLiteRegressionHead.__init__r_   r+   r+   rK   r,   rH   k   s   rH   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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 rC   )maxrU   )drh   rg   r+   r,   <lambda>       z;SSDLiteFeatureExtractorMobileNet.__init__.<locals>.<lambda>i         )rD   rE   r   use_res_connect
ValueErrorr
   r(   blockfeaturesrZ   r0   r"   r>   extra)rJ   re   rf   r$   rg   rh   Z	get_depthru   rK   rk   r,   rE   u   s$    

$*z)SSDLiteFeatureExtractorMobileNet.__init__rM   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>   rm   z<SSDLiteFeatureExtractorMobileNet.forward.<locals>.<listcomp>)rt   r\   ru   r   	enumerate)rJ   rN   outputrs   r+   r+   r,   rQ      s    

z(SSDLiteFeatureExtractorMobileNet.forward)rc   rd   )rR   rS   rT   r
   rV   rU   r   floatrE   r   r   rW   rQ   rX   r+   r+   rK   r,   rb   t   s     !rb   )re   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 )_is_cnF)getattr)rv   rw   br+   r+   r,   ry      rm   z(_mobilenet_extractor.<locals>.<listcomp>r   zYtrainable_layers should be in the range [0, {num_stages}], instead got {trainable_layers}F)rt   rz   lenrr   
parametersrequires_grad_rb   )re   r}   r$   stage_indices
num_stagesfreeze_beforer   	parameterr+   r+   r,   _mobilenet_extractor   s    &r   c                
   @   s4   e Zd Zedededddddii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@zSThese weights were produced by following a similar training recipe as on the paper.)
num_params
categoriesmin_sizerecipe_metrics_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   progressrB   r   trainable_backbone_layersr$   )r   r   rB   r   r   r$   kwargsr%   c                 K   s  t | } t|}d|v r&td | durHd}t|t| jd }n|du rTd}t| dupd|du|dd}|du }|du rt	t
jddd	}tf ||||d
|}|du 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g dg dd}i ||}t||
|	|fdt||||i|}| dur|| j|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/ssd.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   [      gMbP?r2   )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   )  rm   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head)r   )r   verifyr   warningswarnr   r   r   r   r   r
   BatchNorm2dr   r>   r   r   range	det_utilsretrieve_out_channelsnum_anchors_per_locationaspect_ratiosrr   r   r?   load_state_dictget_state_dict)r   r   rB   r   r   r$   r   Zreduce_tailre   r   anchor_generatorr"   rA   defaultsmodelr+   r+   r,   r       sp    7



	
)
_ModelURLsZ"ssdlite320_mobilenet_v3_large_coco)@r   collectionsr   	functoolsr   typingr   r   r   r   r   r	   r7   r
   r   Zops.miscr   Ztransforms._presetsr   utilsr    r   _apir   r   _metar   r   r   r   mobilenetv3r   r   r   anchor_utilsr   backbone_utilsr   ssdr   r   __all__rU   rV   r(   r-   r0   r>   r?   rF   rH   rb   MobileNetV2MobileNetV3r   r   r   IMAGENET1K_V1boolr    r   r   
model_urlsr+   r+   r+   r,   <module>   sv     	1y