U
    ¯Ê¹jõF  ã                   @   s  d Z ddlZddlmZ ddlZddlmZ ddlm  mZ	 ddl
mZmZ ddlmZ ddlmZ ddlmZmZ d	gZd
d„ ZG dd„ dejƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dejƒZG dd	„ d	ejƒZd?dd„Zd@dd„Zeedd �ed!d"d#�ed$d �ed%d �ed&d �ed'd �ed(d"d#�ed)d �ed*d �d+œ	ƒZ edAed,œd-d.„ƒZ!edBed,œd/d0„ƒZ"edCed,œd1d2„ƒZ#edDed,œd3d4„ƒZ$edEed,œd5d6„ƒZ%edFed,œd7d8„ƒZ&edGed,œd9d:„ƒZ'edHed,œd;d<„ƒZ(edIed,œd=d>„ƒZ)dS )Ja:  
SEResNet implementation from Cadene's pretrained models
https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/senet.py
Additional credit to https://github.com/creafz

Original model: https://github.com/hujie-frank/SENet

ResNet code gently borrowed from
https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py

FIXME I'm deprecating this model and moving them to ResNet as I don't want to maintain duplicate
support for extras like dilation, switchable BN/activations, feature extraction, etc that don't exist here.
é    N)ÚOrderedDict©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Úcreate_classifieré   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚSENetc                 C   sR   t | tjƒr"tjj| jddd� n,t | tjƒrNtj | jd¡ tj | jd¡ d S )NZfan_outÚrelu)ÚmodeZnonlinearityg      ð?ç        )	Ú
isinstanceÚnnÚConv2dÚinitZkaiming_normal_ÚweightÚBatchNorm2dZ	constant_Úbias)Úm© r   úP/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/senet.pyÚ_weight_init   s
    r   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚSEModulec                    sV   t t| ƒ ¡  tj||| dd�| _tjdd�| _tj|| |dd�| _t 	¡ | _
d S )Nr   )Úkernel_sizeT©Zinplace)Úsuperr   Ú__init__r   r   Úfc1ÚReLUr   Úfc2ZSigmoidÚsigmoid)ÚselfZchannelsÚ	reduction©Ú	__class__r   r   r   '   s
    zSEModule.__init__c                 C   sB   |}|j ddd�}|  |¡}|  |¡}|  |¡}|  |¡}|| S )N)é   é   T)Zkeepdim)Úmeanr   r   r!   r"   )r#   ÚxZmodule_inputr   r   r   Úforward.   s    



zSEModule.forward)Ú__name__Ú
__module__Ú__qualname__r   r+   Ú__classcell__r   r   r%   r   r   %   s   r   c                   @   s   e Zd ZdZdd„ ZdS )Ú
BottleneckzH
    Base class for bottlenecks that implements `forward()` method.
    c                 C   s„   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rh|  |¡}|  |¡| }|  |¡}|S ©N)	Úconv1Úbn1r   Úconv2Úbn2Úconv3Úbn3Ú
downsampleÚ	se_module©r#   r*   ZshortcutÚoutr   r   r   r+   =   s    










zBottleneck.forwardN)r,   r-   r.   Ú__doc__r+   r   r   r   r   r0   8   s   r0   c                       s&   e Zd ZdZdZd‡ fdd„	Z‡  ZS )ÚSEBottleneckz"
    Bottleneck for SENet154.
    é   r   Nc              	      sÄ   t t| ƒ ¡  tj||d ddd�| _t |d ¡| _tj|d |d d|d|dd�| _t |d ¡| _	tj|d |d ddd�| _
t |d ¡| _tjdd	�| _t|d |d
�| _|| _|| _d S )Nr'   r   F©r   r   r>   r(   ©r   ÚstrideÚpaddingÚgroupsr   Tr   ©r$   )r   r=   r   r   r   r2   r   r3   r4   r5   r6   r7   r    r   r   r9   r8   rA   ©r#   ÚinplanesÚplanesrC   r$   rA   r8   r%   r   r   r   Z   s&         þzSEBottleneck.__init__)r   N©r,   r-   r.   r<   Ú	expansionr   r/   r   r   r%   r   r=   T   s   r=   c                       s&   e Zd ZdZdZd‡ fdd„	Z‡  ZS )ÚSEResNetBottleneckzâ
    ResNet bottleneck with a Squeeze-and-Excitation module. It follows Caffe
    implementation and uses `stride=stride` in `conv1` and not in `conv2`
    (the latter is used in the torchvision implementation of ResNet).
    r>   r   Nc                    s¬   t t| ƒ ¡  tj||dd|d�| _t |¡| _tj||dd|dd�| _t |¡| _	tj||d ddd�| _
t |d ¡| _tjdd	�| _t|d |d
�| _|| _|| _d S )Nr   F©r   r   rA   r(   ©r   rB   rC   r   r>   r?   Tr   rD   )r   rJ   r   r   r   r2   r   r3   r4   r5   r6   r7   r    r   r   r9   r8   rA   rE   r%   r   r   r   r   s    zSEResNetBottleneck.__init__)r   NrH   r   r   r%   r   rJ   j   s   rJ   c                       s&   e Zd ZdZdZd‡ fdd„	Z‡  ZS )ÚSEResNeXtBottleneckzI
    ResNeXt bottleneck type C with a Squeeze-and-Excitation module.
    r>   r   Nc           	   	      sÄ   t t| ƒ ¡  t ||d  ¡| }tj||dddd�| _t |¡| _	tj||d|d|dd�| _
t |¡| _tj||d ddd�| _t |d ¡| _tjd	d
�| _t|d |d�| _|| _|| _d S )Né@   r   FrK   r(   r@   r>   r?   Tr   rD   )r   rM   r   ÚmathÚfloorr   r   r2   r   r3   r4   r5   r6   r7   r    r   r   r9   r8   rA   )	r#   rF   rG   rC   r$   rA   r8   Z
base_widthÚwidthr%   r   r   r   †   s    zSEResNeXtBottleneck.__init__)r   Nr>   rH   r   r   r%   r   rM   €   s   rM   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚSEResNetBlockr   Nc                    s‚   t t| ƒ ¡  tj||dd|dd�| _t |¡| _tj||dd|dd�| _t |¡| _	tj
dd�| _t||d�| _|| _|| _d S )	Nr(   r   F)r   rB   rA   r   rL   Tr   rD   )r   rR   r   r   r   r2   r   r3   r4   r5   r    r   r   r9   r8   rA   rE   r%   r   r   r   ˜   s    zSEResNetBlock.__init__c                 C   sp   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rT|  |¡}|  |¡| }|  |¡}|S r1   )r2   r3   r   r4   r5   r8   r9   r:   r   r   r   r+   £   s    








zSEResNetBlock.forward)r   N)r,   r-   r.   rI   r   r+   r/   r   r   r%   r   rR   •   s   rR   c                       s†   e Zd Zd‡ fd	d
„	Zddd„Zejjddd„ƒZejjd dd„ƒZ	ejjdd„ ƒZ
d!dd„Zdd„ Zd"edœdd„Zdd„ Z‡  ZS )#r   çš™™™™™É?r(   rN   Fr   r   éè  Úavgc                    sj  t t| ƒ ¡  || _|| _|| _|rÀdtj|dddddd�fdt d¡fd	tj	d
d�fdtjddddddd�fdt d¡fdtj	d
d�fdtjd|ddddd�fdt |¡fdtj	d
d�fg	}n6dtj||ddddd�fdt |¡fd	tj	d
d�fg}t 
t|ƒ¡| _tjddd
d�| _t|ddd�g| _| j|d|d ||ddd�| _|  jtd|j ddd�g7  _| j|d|d d|||	|
d�| _|  jtd|j ddd�g7  _| j|d|d d|||	|
d�| _|  jtd|j d d!d�g7  _| j|d"|d d|||	|
d�| _|  jtd"|j d#d$d�g7  _d"|j | _t| j| j|d%�\| _| _|  ¡ D ]}t|ƒ �qVd&S )'af  
        Parameters
        ----------
        block (nn.Module): Bottleneck class.
            - For SENet154: SEBottleneck
            - For SE-ResNet models: SEResNetBottleneck
            - For SE-ResNeXt models:  SEResNeXtBottleneck
        layers (list of ints): Number of residual blocks for 4 layers of the
            network (layer1...layer4).
        groups (int): Number of groups for the 3x3 convolution in each
            bottleneck block.
            - For SENet154: 64
            - For SE-ResNet models: 1
            - For SE-ResNeXt models:  32
        reduction (int): Reduction ratio for Squeeze-and-Excitation modules.
            - For all models: 16
        dropout_p (float or None): Drop probability for the Dropout layer.
            If `None` the Dropout layer is not used.
            - For SENet154: 0.2
            - For SE-ResNet models: None
            - For SE-ResNeXt models: None
        inplanes (int):  Number of input channels for layer1.
            - For SENet154: 128
            - For SE-ResNet models: 64
            - For SE-ResNeXt models: 64
        input_3x3 (bool): If `True`, use three 3x3 convolutions instead of
            a single 7x7 convolution in layer0.
            - For SENet154: True
            - For SE-ResNet models: False
            - For SE-ResNeXt models: False
        downsample_kernel_size (int): Kernel size for downsampling convolutions
            in layer2, layer3 and layer4.
            - For SENet154: 3
            - For SE-ResNet models: 1
            - For SE-ResNeXt models: 1
        downsample_padding (int): Padding for downsampling convolutions in
            layer2, layer3 and layer4.
            - For SENet154: 1
            - For SE-ResNet models: 0
            - For SE-ResNeXt models: 0
        num_classes (int): Number of outputs in `last_linear` layer.
            - For all models: 1000
        r2   rN   r(   r'   r   F)rA   rB   r   r3   Zrelu1Tr   r4   r5   Zrelu2r6   r7   Zrelu3é   ©r   rA   rB   r   )rA   Z	ceil_modeÚlayer0)Znum_chsr$   Úmoduler   )rG   ÚblocksrC   r$   Údownsample_kernel_sizeÚdownsample_paddingr>   Úlayer1é€   )rG   rZ   rA   rC   r$   r[   r\   é   Úlayer2é   é   Úlayer3i   é    Úlayer4©Z	pool_typeN)r   r   r   rF   Únum_classesÚ	drop_rater   r   r   r    Ú
Sequentialr   rX   Z	MaxPool2dÚpool0ÚdictZfeature_infoÚ_make_layerr]   rI   r`   rc   re   Únum_featuresr   Úglobal_poolÚlast_linearÚmodulesr   )r#   ÚblockÚlayersrC   r$   rh   Zin_chansrF   Ú	input_3x3r[   r\   rg   rn   Zlayer0_modulesr   r%   r   r   r   ¹   s     /÷     ÿüù	 ø
 ø
 ø
   ÿzSENet.__init__c	              
   C   s    d }	|dks| j ||j krNt tj| j ||j |||dd�t ||j ¡¡}	|| j |||||	ƒg}
||j | _ td|ƒD ]}|
 || j |||ƒ¡ qztj|
Ž S )Nr   FrW   )rF   rI   r   ri   r   r   ÚrangeÚappend)r#   rq   rG   rZ   rC   r$   rA   r[   r\   r8   rr   Úir   r   r   rl   5  s$        þüzSENet._make_layerc                 C   s   t d|rdndd�}|S )Nz^layer0z^layer(\d+)z^layer(\d+)\.(\d+))ÚstemrZ   )rk   )r#   ZcoarseZmatcherr   r   r   Úgroup_matcherG  s    zSENet.group_matcherTc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)ÚAssertionError)r#   Úenabler   r   r   Úset_grad_checkpointingL  s    zSENet.set_grad_checkpointingc                 C   s   | j S r1   )ro   )r#   r   r   r   Úget_classifierP  s    zSENet.get_classifierc                 C   s$   || _ t| j| j |d�\| _| _d S )Nrf   )rg   r   rm   rn   ro   )r#   rg   rn   r   r   r   Úreset_classifierT  s      ÿzSENet.reset_classifierc                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r1   )rX   rj   r]   r`   rc   re   ©r#   r*   r   r   r   Úforward_featuresY  s    





zSENet.forward_features)Ú
pre_logitsc                 C   s:   |   |¡}| jdkr(tj|| j| jd�}|r0|S |  |¡S )Nr   )ÚpÚtraining)rn   rh   ÚFZdropoutr‚   ro   )r#   r*   r€   r   r   r   Úforward_headb  s    

zSENet.forward_headc                 C   s   |   |¡}|  |¡}|S r1   )r   r„   r~   r   r   r   r+   h  s    

zSENet.forward)rS   r(   rN   Fr   r   rT   rU   )r   r   r   )F)T)rU   )F)r,   r-   r.   r   rl   ÚtorchZjitÚignorerx   r{   r|   r}   r   Úboolr„   r+   r/   r   r   r%   r   r   ·   s.                ý|    ÿ


	Fc                 K   s   t t| |f|ŽS r1   )r   r   )ÚvariantÚ
pretrainedÚkwargsr   r   r   Ú_create_senetn  s    r‹   Ú c                 K   s   | dddddt tdddœ
|–S )	NrT   )r(   éà   r�   )rV   rV   g      ì?Zbilinearzlayer0.conv1ro   )
Úurlrg   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationr)   ZstdZ
first_convÚ
classifierr   )rŽ   rŠ   r   r   r   Ú_cfgr  s          üûr‘   zmhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_senet154-e9eb9fe6.pth)rŽ   zhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet18-4bb0ce65.pthZbicubic)rŽ   r�   zhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet34-a4004e63.pthzhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet50-ce0d4300.pthzihttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet101-7e38fcc6.pthzihttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet152-d17c99b7.pthzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26_32x4d-65ebdb501.pthzwhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_se_resnext50_32x4d-f3651bad.pthzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_se_resnext101_32x4d-37725eac.pth)	zlegacy_senet154.in1kzlegacy_seresnet18.in1kzlegacy_seresnet34.in1kzlegacy_seresnet50.in1kzlegacy_seresnet101.in1kzlegacy_seresnet152.in1kzlegacy_seresnext26_32x4d.in1kzlegacy_seresnext50_32x4d.in1kzlegacy_seresnext101_32x4d.in1k)Úreturnc                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr'   r   rb   ©rq   rr   rC   r$   Úlegacy_seresnet18©rk   rR   r‹   ©r‰   rŠ   Z
model_argsr   r   r   r”   ”  s     
  ÿÿr”   c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr(   r>   é   r   rb   r“   Úlegacy_seresnet34r•   r–   r   r   r   r˜   ›  s     
  ÿÿr˜   c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr(   r>   r—   r   rb   r“   Úlegacy_seresnet50©rk   rJ   r‹   r–   r   r   r   r™   ¢  s     
  ÿÿr™   c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr(   r>   é   r   rb   r“   Úlegacy_seresnet101rš   r–   r   r   r   rœ   ©  s     
  ÿÿrœ   c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr(   r_   é$   r   rb   r“   Úlegacy_seresnet152rš   r–   r   r   r   rž   °  s     
  ÿÿrž   c                 K   s6   t f tddddgddddddd	œ|—Ž}td
| f|ŽS )Nr(   r_   r�   rN   rb   r   r^   T)rq   rr   rC   r$   r[   r\   rF   rs   Úlegacy_senet154)rk   r=   r‹   r–   r   r   r   rŸ   ·  s     
     þþrŸ   c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr'   rd   rb   r“   Úlegacy_seresnext26_32x4d©rk   rM   r‹   r–   r   r   r   r    ¿  s     
  ÿÿr    c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr(   r>   r—   rd   rb   r“   Úlegacy_seresnext50_32x4dr¡   r–   r   r   r   r¢   Æ  s     
  ÿÿr¢   c                 K   s.   t f tddddgdddœ|—Ž}td| f|ŽS )Nr(   r>   r›   rd   rb   r“   Úlegacy_seresnext101_32x4dr¡   r–   r   r   r   r£   Í  s     
  ÿÿr£   )F)rŒ   )F)F)F)F)F)F)F)F)F)*r<   rO   Úcollectionsr   r…   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrƒ   Z	timm.datar   r   Ztimm.layersr   Z_builderr   Ú	_registryr	   r
   Ú__all__r   ÚModuler   r0   r=   rJ   rM   rR   r   r‹   r‘   Zdefault_cfgsr”   r˜   r™   rœ   rž   rŸ   r    r¢   r£   r   r   r   r   Ú<module>   sŒ   " 8


ÿþÿÿÿÿþÿÿí