U
    ¯Ê¹jÂ;  ã                
   @   s¼  d Z ddlmZ ddlmZmZmZmZ ddlZddl	m
Z
 ddlmZmZ ddlmZmZmZmZ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gZG dd„ de
jƒZ G dd„ de
jƒZ!G dd„ de
jƒ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d�e&dd�e&dd�e&dd�e&ddd�e&ddd�d œƒZ'ed.e$d!œd"d#„ƒZ(ed/e$d!œd$d%„ƒZ)ed0e$d!œd&d'„ƒZ*ed1e$d!œd(d)„ƒZ+ed2e$d!œd*d+„ƒZ,dS )3a  Pytorch impl of Aligned Xception 41, 65, 71

This is a correct, from scratch impl of Aligned Xception (Deeplab) models compatible with TF weights at
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md

Hacked together by / Copyright 2020 Ross Wightman
é    )Úpartial)ÚListÚDictÚTypeÚOptionalN©ÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)ÚClassifierHeadÚConvNormActÚDropPathÚPadTypeÚcreate_conv2dÚget_norm_act_layer)Ú	to_3tupleé   )Úbuild_model_with_cfg)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚXceptionAlignedc                
       sV   e Zd Zddddejejfeeeeeeeej	 eej	 dœ‡ fdd„Z
dd„ Z‡  ZS )	ÚSeparableConv2dé   r   Ú )Úin_chsÚout_chsÚkernel_sizeÚstrideÚdilationÚpaddingÚ	act_layerÚ
norm_layerc	           	   	      s’   t t| ƒ ¡  || _|| _t||||||dd�| _||ƒ| _|d k	rN|dd�nt 	¡ | _
t||dd�| _||ƒ| _|d k	r„|dd�nt 	¡ | _d S )NT©r   r   r   Z	depthwise©Zinplacer   ©r   )Úsuperr   Ú__init__r   r   r   Úconv_dwÚbn_dwÚnnÚIdentityÚact_dwÚconv_pwÚbn_pwÚact_pw)	Úselfr   r   r   r   r   r   r    r!   ©Ú	__class__© ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/xception_aligned.pyr&      s"         þ

zSeparableConv2d.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S ©N)r'   r(   r+   r,   r-   r.   ©r/   Úxr2   r2   r3   Úforward4   s    





zSeparableConv2d.forward)Ú__name__Ú
__module__Ú__qualname__r)   ÚReLUÚBatchNorm2dÚintr   r   ÚModuler&   r7   Ú__classcell__r2   r2   r0   r3   r      s"   ÷÷r   c                       sZ   e Zd Zddddejejdfeeeeeeeej	 eej	 e
dœ	‡ fdd„Zdd	„ Z‡  ZS )
ÚPreSeparableConv2dr   r   r   T)	r   r   r   r   r   r   r    r!   Ú	first_actc
              	      sl   t t| ƒ ¡  t||d�}
|| _|| _|	r6|
|dd�nt ¡ | _t	||||||dd�| _
t	||dd�| _d S )N©r    Tr#   r"   r   r$   )r%   r@   r&   r   r   r   r)   r*   Únormr   r'   r,   )r/   r   r   r   r   r   r   r    r!   rA   Znorm_act_layerr0   r2   r3   r&   ?   s         þzPreSeparableConv2d.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r4   )rC   r'   r,   r5   r2   r2   r3   r7   Y   s    


zPreSeparableConv2d.forward)r8   r9   r:   r)   r;   r<   r=   r   r   r>   Úboolr&   r7   r?   r2   r2   r0   r3   r@   >   s&   öör@   c                       sf   e Zd Zdddddejddfeeeeeeeeej	 e
eej	  e
ej	 dœ
‡ fdd„Zd	d
„ Z‡  ZS )ÚXceptionModuler   r   TFN)
r   r   r   r   Úpad_typeÚstart_with_reluÚno_skipr    r!   Ú	drop_pathc                    sü   t t| ƒ ¡  t|ƒ}|| _|d | _|| _|s^| j| jksD|dkr^t|| jd||	dd�| _nd | _|rld n|}t	 
¡ | _tdƒD ]n}|r¬| j d|d › �||dkd�¡ | j d	|d › �t||| d|d
krÖ|nd||||	d�¡ || }q‚|
| _d S )Néÿÿÿÿr   F)r   r!   Z	apply_actr   Úactr   r#   Úconvé   )r   r   r   r    r!   )r%   rE   r&   r   Úin_channelsÚout_channelsrH   r   Úshortcutr)   Ú
SequentialÚstackÚrangeÚ
add_moduler   rI   )r/   r   r   r   r   rF   rG   rH   r    r!   rI   Zseparable_act_layerÚir0   r2   r3   r&   a   s@    
     ÿ

"      þ
zXceptionModule.__init__c                 C   sH   |}|   |¡}| jd k	r"|  |¡}| jsD| jd k	r<|  |¡}|| }|S r4   )rR   rP   rH   rI   ©r/   r6   Úskipr2   r2   r3   r7   …   s    




zXceptionModule.forward©r8   r9   r:   r)   r;   r=   r   rD   r   r>   r   r&   r7   r?   r2   r2   r0   r3   rE   `   s*   õõ$rE   c                       sb   e Zd Zddddejddfeeeeeeeej	 e
eej	  e
ej	 dœ	‡ fdd„Zdd	„ Z‡  ZS )
ÚPreXceptionModuler   r   FN)	r   r   r   r   rF   rH   r    r!   rI   c
                    sæ   t t| ƒ ¡  t|ƒ}|| _|d | _|| _|sZ| j| jksD|dkrZt|| jd|d�| _n
t	 
¡ | _t||d�|dd�| _t	 ¡ | _tdƒD ]N}
| j d|
d › �t|||
 d|
d	krº|nd|||||
d
kd�	¡ ||
 }qŒ|	| _d S )NrJ   r   )r   rB   Tr#   r   rL   rM   r   )r   r   r   r    r!   rA   )r%   rY   r&   r   rN   rO   rH   r   rP   r)   r*   r   rC   rQ   rR   rS   rT   r@   rI   )r/   r   r   r   r   rF   rH   r    r!   rI   rU   r0   r2   r3   r&   ’   s0    


÷
zPreXceptionModule.__init__c                 C   sD   |   |¡}|}|  |¡}| js@| jd k	r2|  |¡}||  |¡ }|S r4   )rC   rR   rH   rI   rP   rV   r2   r2   r3   r7   º   s    



zPreXceptionModule.forwardrX   r2   r2   r0   r3   rY   ‘   s&   öö(rY   c                       s¾   e Zd ZdZddddejejdddf	ee e	e	e	e
eej eej eeedœ
‡ f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   zModified Aligned Xception
    éè  r   é    Fç        Úavg)
Ú	block_cfgÚnum_classesÚin_chansÚoutput_strideÚpreactr    r!   Ú	drop_rateÚdrop_path_rateÚglobal_poolc              	      s  t t| ƒ ¡  |dkst‚|| _|| _d| _t||d�}tj	t
|dfdddœ|—Ž|rftdddd	d�nt
ddd	dœ|—ŽgŽ | _d	}d}g | _t 	¡ | _|r tnt}t|ƒ}d
}t|ƒD ]ì\}}|	| |d	  }|dkràt|ƒnd |d< ||d< |d d	k�rr|�rd|› d�n
d|› d�}|  jtt|d ƒd ||d�g7  _||d  }||k�rn||d 9 }d	|d< n|}| j t|ƒ|f ||—Ž¡ | jd j| _|d	7 }q¸|  jt| j|dtt| jƒd	 ƒ d�g7  _|�rä|dd�nt ¡ | _t| j||
|d�| _d S )N)é   é   r[   F)r    r!   r[   r   rM   )r   r   é@   r   r   r\   rI   r   r   zblocks.z.stack.conv2z.stack.act3r   éþÿÿÿ)Znum_chsZ	reductionÚmodulerJ   Tr#   )Zin_featuresr_   Ú	pool_typerc   )r[   rh   )r%   r   r&   ÚAssertionErrorr_   rc   Úgrad_checkpointingÚdictr)   rQ   r   r   ÚstemZfeature_infoÚblocksrY   rE   ÚlenÚ	enumerater   r   rT   ÚstrrO   Znum_featuresr*   rK   r
   Úhead)r/   r^   r_   r`   ra   rb   r    r!   rc   rd   re   Z
layer_argsZcurr_dilationZcurr_strideZ	module_fnZnet_num_blocksZnet_block_idxrU   ÚbZ	block_dprÚnameZnext_strider0   r2   r3   r&   É   sZ    ý
&


  ÿüzXceptionAligned.__init__c                 C   s   t ddd�S )Nz^stemz^blocks\.(\d+))ro   rp   )rn   )r/   Zcoarser2   r2   r3   Úgroup_matcher  s    þzXceptionAligned.group_matcherTc                 C   s
   || _ d S r4   )rm   )r/   Úenabler2   r2   r3   Úset_grad_checkpointing  s    z&XceptionAligned.set_grad_checkpointingc                 C   s   | j jS r4   )rt   Úfc)r/   r2   r2   r3   Úget_classifier  s    zXceptionAligned.get_classifierc                 C   s   | j j||d� d S )N)rk   )rt   Úreset)r/   r_   re   r2   r2   r3   Úreset_classifier  s    z XceptionAligned.reset_classifierc                 C   s@   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|  |¡}|S r4   )ro   rm   ÚtorchÚjitZis_scriptingr   rp   rK   r5   r2   r2   r3   Úforward_features  s    


z XceptionAligned.forward_features©Ú
pre_logitsc                 C   s   | j ||d�S )Nr�   )rt   )r/   r6   r‚   r2   r2   r3   Úforward_head   s    zXceptionAligned.forward_headc                 C   s   |   |¡}|  |¡}|S r4   )r€   rƒ   r5   r2   r2   r3   r7   #  s    

zXceptionAligned.forward)F)T)r]   )F)r8   r9   r:   Ú__doc__r)   r;   r<   r   r   r=   rD   r   r>   Úfloatrs   r&   r~   r   Úignorerw   ry   r{   r}   r€   rƒ   r7   r?   r2   r2   r0   r3   r   Å   s@   õõ<

	Fc                 K   s    t t| |fdtddd�i|—ŽS )NZfeature_cfgTÚhook)Zflatten_sequentialZfeature_cls)r   r   rn   )ÚvariantÚ
pretrainedÚkwargsr2   r2   r3   Ú	_xception)  s    ý
üûr‹   r   c                 K   s   | dddddt tdddœ
|–S )	NrZ   )r   é+  rŒ   )é
   r�   gL7‰A`åì?Zbicubiczstem.0.convzhead.fc)
Úurlr_   Z
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierr   )rŽ   rŠ   r2   r2   r3   Ú_cfg3  s         ûúr’   ztimm/g®Gázî?)Ú	hf_hub_idr�   )r“   )zxception65.ra3_in1kzxception41.tf_in1kzxception65.tf_in1kzxception71.tf_in1kzxception41p.ra3_in1kzxception65p.ra3_in1k)Úreturnc              
   K   sŒ   t dddd�t dddd�t dddd�ft dddd�gd t dd	dd�t d
ddddd�f•}t |ttjddd�d�}tdd| it |f|Ž—ŽS )z" Modified Aligned Xception-41
    rh   é€   rM   ©r   r   r   é   éØ  r   rf   ©r˜   é   rš   rš   ©é   rœ   i   TF©r   r   r   rH   rG   çü©ñÒMbP?çš™™™™™¹?©ÚepsZmomentum©r^   r!   Ú
xception41r‰   )r£   ©rn   r   r)   r<   r‹   ©r‰   rŠ   r^   Z
model_argsr2   r2   r3   r£   S  s    ü÷r£   c              
   K   sŒ   t dddd�t dddd�t dddd�ft dddd�gd t dd	dd�t d
ddddd�f•}t |ttjddd�d�}tdd| it |f|Ž—ŽS )z" Modified Aligned Xception-65
    rh   r•   rM   r–   r—   r˜   r   rg   r™   rš   r›   TFr�   rž   rŸ   r    r¢   Ú
xception65r‰   )r¦   r¤   r¥   r2   r2   r3   r¦   f  s    ü÷r¦   c              
   K   s¤   t dddd�t dddd�t dddd�t dddd�t dddd�ft dddd�gd t dd	dd�t d
ddddd�f•}t |ttjddd�d�}tdd| it |f|Ž—ŽS )z" Modified Aligned Xception-71
    rh   r•   rM   r–   r—   r   r˜   rg   r™   rš   r›   TFr�   rž   rŸ   r    r¢   Ú
xception71r‰   )r§   r¤   r¥   r2   r2   r3   r§   y  s    úõr§   c              	   K   s‚   t dddd�t dddd�t dddd�ft dddd�gd t dd	dd�t d
dddd�f•}t |dtjd�}tdd| it |f|Ž—ŽS )z- Modified Aligned Xception-41 w/ Pre-Act
    rh   r•   rM   r–   r—   r˜   r   rf   r™   rš   r›   T)r   r   rH   r   ©r^   rb   r!   Úxception41pr‰   )r©   )rn   r)   r<   r‹   r¥   r2   r2   r3   r©   Ž  s    ü÷r©   c              	   K   sŒ   t dddd�t dddd�t dddd�ft dddd�gd t dd	dd�t d
dddd�f•}t |dttjddd�d�}tdd| it |f|Ž—ŽS )z- Modified Aligned Xception-65 w/ Pre-Act
    rh   r•   rM   r–   r—   r˜   r   rg   r™   rš   r›   T)r   r   r   rH   rž   rŸ   r    r¨   Úxception65pr‰   )rª   r¤   r¥   r2   r2   r3   rª   ¡  s    ü÷  ÿrª   )F)r   )F)F)F)F)F)-r„   Ú	functoolsr   Útypingr   r   r   r   r~   Ztorch.nnr)   Z	timm.datar   r	   Ztimm.layersr
   r   r   r   r   r   Ztimm.layers.helpersr   Z_builderr   Z_manipulater   Ú	_registryr   r   Ú__all__r>   r   r@   rE   rY   r   r‹   r’   Zdefault_cfgsr£   r¦   r§   r©   rª   r2   r2   r2   r3   Ú<module>   sZ    &"14d


þþþò