U
    ­Ê¹jÞ;  ã                	   @   sT  d dl mZ d dl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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dddddddg	Z G dd„ de	j!ƒZ"G dd„ de	j#ƒZ$G dd„ dƒZ%G dd„ de	j#ƒZ&ee% e'ee e(ee&dœd d!„Z)d"ed#d$d%œZ*G d&d„ deƒZ+G d'd„ deƒZ,G d(d„ deƒZ-G d)d„ deƒZ.eƒ ed*e+j/fd+�dd,d-œee+ e(ee&d.œd/d„ƒƒZ0eƒ ed*e,j/fd+�dd,d-œee, e(ee&d.œd0d„ƒƒZ1eƒ ed*e-j/fd+�dd,d-œee- e(ee&d.œd1d„ƒƒZ2eƒ ed*e.j/fd+�dd,d-œee. e(ee&d.œd2d„ƒƒZ3dS )3é    )Úpartial)ÚAnyÚCallableÚListÚOptionalÚSequenceN)ÚnnÚTensor)Ú
functionalé   )ÚConv2dNormActivationÚPermute)ÚStochasticDepth)ÚImageClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interfaceÚConvNeXtÚConvNeXt_Tiny_WeightsÚConvNeXt_Small_WeightsÚConvNeXt_Base_WeightsÚConvNeXt_Large_WeightsÚconvnext_tinyÚconvnext_smallÚconvnext_baseÚconvnext_largec                   @   s   e Zd Zeedœdd„ZdS )ÚLayerNorm2d©ÚxÚreturnc                 C   s>   |  dddd¡}t || j| j| j| j¡}|  dddd¡}|S )Nr   r   é   r   )ZpermuteÚFZ
layer_normZnormalized_shapeÚweightÚbiasÚeps©Úselfr#   © r,   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/models/convnext.pyÚforward   s    zLayerNorm2d.forwardN)Ú__name__Ú
__module__Ú__qualname__r	   r.   r,   r,   r,   r-   r!      s   r!   c                       sH   e Zd Zd	eeeedejf  ddœ‡ fdd„Ze	e	dœdd„Z
‡  ZS )
ÚCNBlockN.)Úlayer_scaleÚstochastic_depth_probÚ
norm_layerr$   c                    s´   t ƒ  ¡  |d kr ttjdd�}t tj||dd|dd�tdddd	gƒ||ƒtj|d
| dd�t 	¡ tjd
| |dd�tddd	dgƒ¡| _
t t |d	d	¡| ¡| _t|dƒ| _d S )Nç�íµ ÷Æ°>©r)   é   r%   T)Úkernel_sizeÚpaddingÚgroupsr(   r   r   r   é   )Zin_featuresZout_featuresr(   Úrow)ÚsuperÚ__init__r   r   Ú	LayerNormÚ
SequentialÚConv2dr   ÚLinearZGELUÚblockÚ	ParameterÚtorchZonesr3   r   Ústochastic_depth)r+   Údimr3   r4   r5   ©Ú	__class__r,   r-   r?   '   s    
ù	zCNBlock.__init__)Úinputr$   c                 C   s&   | j |  |¡ }|  |¡}||7 }|S ©N)r3   rD   rG   )r+   rK   Úresultr,   r,   r-   r.   >   s    
zCNBlock.forward)N)r/   r0   r1   Úfloatr   r   r   ÚModuler?   r	   r.   Ú__classcell__r,   r,   rI   r-   r2   &   s    ûúr2   c                   @   s2   e Zd Zeee eddœdd„Zedœdd„ZdS )ÚCNBlockConfigN)Úinput_channelsÚout_channelsÚ
num_layersr$   c                 C   s   || _ || _|| _d S rL   )rR   rS   rT   )r+   rR   rS   rT   r,   r,   r-   r?   G   s    zCNBlockConfig.__init__)r$   c                 C   s:   | j jd }|d7 }|d7 }|d7 }|d7 }|jf | jŽS )Nú(zinput_channels={input_channels}z, out_channels={out_channels}z, num_layers={num_layers}ú))rJ   r/   ÚformatÚ__dict__)r+   Úsr,   r,   r-   Ú__repr__Q   s    zCNBlockConfig.__repr__)r/   r0   r1   Úintr   r?   ÚstrrZ   r,   r,   r,   r-   rQ   E   s   û
rQ   c                
       sr   e Zd Zdee eeeeede	j
f  eede	j
f  eddœ‡ fdd„Zeed	œd
d„Zeed	œdd„Z‡  ZS )r   ç        r6   éè  N.)Úblock_settingr4   r3   Únum_classesrD   r5   Úkwargsr$   c                    sâ  t ƒ  ¡  t| ƒ |s tdƒ‚n$t|tƒr<tdd„ |D ƒƒsDtdƒ‚|d krPt}|d krdt	t
dd�}g }|d j}	| td|	d	d	d|d d
d�¡ tdd„ |D ƒƒ}
d}|D ]ˆ}g }t|jƒD ]0}|| |
d  }| ||j||ƒ¡ |d7 }q¼| tj|Ž ¡ |jd k	rª| t ||jƒtj|j|jddd�¡¡ qªtj|Ž | _t d¡| _|d }|jd k	�rf|jn|j}t ||ƒt d¡t ||¡¡| _|  ¡ D ]F}t|tjtjfƒ�r–tjj|jdd� |jd k	�r–tj  |j¡ �q–d S )Nz%The block_setting should not be emptyc                 S   s   g | ]}t |tƒ‘qS r,   )Ú
isinstancerQ   )Ú.0rY   r,   r,   r-   Ú
<listcomp>j   s     z%ConvNeXt.__init__.<locals>.<listcomp>z/The block_setting should be List[CNBlockConfig]r6   r7   r   r%   r<   T)r9   Ústrider:   r5   Zactivation_layerr(   c                 s   s   | ]}|j V  qd S rL   )rT   )rc   Úcnfr,   r,   r-   Ú	<genexpr>„   s     z$ConvNeXt.__init__.<locals>.<genexpr>g      ð?r   r   )r9   re   éÿÿÿÿg{®Gáz”?)Zstd)!r>   r?   r   Ú
ValueErrorrb   r   ÚallÚ	TypeErrorr2   r   r!   rR   Úappendr   ÚsumÚrangerT   r   rA   rS   rB   ÚfeaturesZAdaptiveAvgPool2dÚavgpoolZFlattenrC   Ú
classifierÚmodulesÚinitZtrunc_normal_r'   r(   Zzeros_)r+   r_   r4   r3   r`   rD   r5   ra   ZlayersZfirstconv_output_channelsZtotal_stage_blocksZstage_block_idrf   ZstageÚ_Zsd_probZ	lastblockZlastconv_output_channelsÚmrI   r,   r-   r?   [   sn    



øÿ

þÿÿ  
ÿzConvNeXt.__init__r"   c                 C   s"   |   |¡}|  |¡}|  |¡}|S rL   )ro   rp   rq   r*   r,   r,   r-   Ú_forward_impl©   s    


zConvNeXt._forward_implc                 C   s
   |   |¡S rL   )rv   r*   r,   r,   r-   r.   ¯   s    zConvNeXt.forward)r]   r6   r^   NN)r/   r0   r1   r   rQ   rN   r[   r   r   r   rO   r   r?   r	   rv   r.   rP   r,   r,   rI   r-   r   Z   s"        ù÷N)r_   r4   ÚweightsÚprogressra   r$   c                 K   sR   |d k	rt |dt|jd ƒƒ t| fd|i|—Ž}|d k	rN| |j|dd�¡ |S )Nr`   Ú
categoriesr4   T)rx   Z
check_hash)r   ÚlenÚmetar   Zload_state_dictZget_state_dict)r_   r4   rw   rx   ra   Úmodelr,   r,   r-   Ú	_convnext³   s    r}   )é    r~   zNhttps://github.com/pytorch/vision/tree/main/references/classification#convnexta  
        These weights improve upon the results of the original paper by using a modified version of TorchVision's
        `new training recipe
        <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
    )Zmin_sizery   ZrecipeZ_docsc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z>https://download.pytorch.org/models/convnext_tiny-983f1562.pthéà   éì   ©Z	crop_sizeZresize_sizeiH<´úImageNet-1Kgáz®G¡T@gÓMbX	X@©zacc@1zacc@5gmçû©ñÒ@gV-²�G[@©Z
num_paramsZ_metricsZ_opsÚ
_file_size©ÚurlZ
transformsr{   N©	r/   r0   r1   r   r   r   Ú_COMMON_METAÚIMAGENET1K_V1ÚDEFAULTr,   r,   r,   r-   r   Ñ   s   þÿöýc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z?https://download.pytorch.org/models/convnext_small-0c510722.pthr   éæ   r�   iHZþr‚   g�•C‹lçT@gš™™™™)X@rƒ   g‘í|?5^!@gÑ"Ûù~ög@r„   r†   Nrˆ   r,   r,   r,   r-   r   å   s   þÿöýc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z>https://download.pytorch.org/models/convnext_base-6075fbad.pthr   éè   r�   ihÌGr‚   g‡ÙÎ÷U@gHáz®7X@rƒ   gö(\�Âµ.@g/Ý$!u@r„   r†   Nrˆ   r,   r,   r,   r-   r   ù   s   þÿöýc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z?https://download.pytorch.org/models/convnext_large-ea097f82.pthr   r�   r�   i¨°Ér‚   gÑ"Ûù~U@gX9´Èv>X@rƒ   g‘í|?5.A@gžï§ÆK”‡@r„   r†   Nrˆ   r,   r,   r,   r-   r     s   þÿöýZ
pretrained)rw   T)rw   rx   )rw   rx   ra   r$   c                 K   sT   t  | ¡} tdddƒtdddƒtdddƒtdddƒg}| dd	¡}t||| |f|ŽS )
a�  ConvNeXt Tiny model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Tiny_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Tiny_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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Tiny_Weights
        :members:
    é`   éÀ   r%   é€  é   é	   Nr4   gš™™™™™¹?)r   ÚverifyrQ   Úpopr}   ©rw   rx   ra   r_   r4   r,   r,   r-   r   !  s    




üc                 K   sT   t  | ¡} tdddƒtdddƒtdddƒtdddƒg}| dd	¡}t||| |f|ŽS )
a…  ConvNeXt Small model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Small_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Small_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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Small_Weights
        :members:
    rŽ   r�   r%   r�   r‘   é   Nr4   gš™™™™™Ù?)r   r“   rQ   r”   r}   r•   r,   r,   r-   r   @  s    




üc                 K   sT   t  | ¡} tdddƒtdddƒtdddƒtdddƒg}| dd	¡}t||| |f|ŽS )
a�  ConvNeXt Base model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Base_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Base_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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Base_Weights
        :members:
    é€   é   r%   i   i   r–   Nr4   ç      à?)r   r“   rQ   r”   r}   r•   r,   r,   r-   r   a  s    




üc                 K   sT   t  | ¡} tdddƒtdddƒtdddƒtdddƒg}| dd	¡}t||| |f|ŽS )
a…  ConvNeXt Large model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Large_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Large_Weights
        :members:
    r�   r�   r%   r‘   i   r–   Nr4   r™   )r   r“   rQ   r”   r}   r•   r,   r,   r-   r    €  s    




ü)4Ú	functoolsr   Útypingr   r   r   r   r   rF   r   r	   Ztorch.nnr
   r&   Zops.miscr   r   Zops.stochastic_depthr   Ztransforms._presetsr   Úutilsr   Z_apir   r   r   Ú_metar   Z_utilsr   r   Ú__all__r@   r!   rO   r2   rQ   r   rN   Úboolr}   r‰   r   r   r   r   rŠ   r   r   r   r    r,   r,   r,   r-   Ú<module>   s†   ÷Zúü$ ÿ  þ$ ÿ  þ