U
    ­Ê¹jŸ3  ã                   @   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,   úc/var/www/html/bwave/python/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¡ q†qzt| |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_mapgÍÌÌÌÌL5@g-²�ï§â?g¼t“Ö*@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r�t	t
jdd	d
�}tf ||||dœ|—Ž}|dkr¸t|ƒ 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/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<   r{   é[   é   gü©ñÒMbP?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ýþù÷