a
    þdh  ã                   @   sj  d 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mZ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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edd d!d"d#d$d%d&d&d'd(d)d*œiƒZ ed/ed+œd,d-„ƒZ!dS )0zŒ NasNet-A (Large)
 nasnetalarge implementation grabbed from Cadene's pretrained models
 https://github.com/Cadene/pretrained-models.pytorch
é    )ÚpartialN)ÚConvNormActÚcreate_conv2dÚcreate_pool2dÚcreate_classifieré   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚNASNetALargec                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	ActConvBnr   Ú c                    sB   t t| ƒ ¡  t ¡ | _t|||||d| _tj|ddd| _	d S )N)Úkernel_sizeÚstrideÚpaddingçü©ñÒMbP?çš™™™™™¹?©ZepsZmomentum)
Úsuperr   Ú__init__ÚnnÚReLUÚactr   ÚconvÚBatchNorm2dÚbn©ÚselfÚin_channelsÚout_channelsr   r   r   ©Ú	__class__© ú[/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/nasnet.pyr      s    

ÿzActConvBn.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S ©N)r   r   r   ©r   Úxr"   r"   r#   Úforward   s    


zActConvBn.forward)r   r   ©Ú__name__Ú
__module__Ú__qualname__r   r'   Ú__classcell__r"   r"   r    r#   r      s   r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚSeparableConv2dr   c                    s:   t t| ƒ ¡  t||||||d| _t||ddd| _d S )N)r   r   r   Úgroupsr   r   )r   r   )r   r-   r   r   Údepthwise_conv2dÚpointwise_conv2dr   r    r"   r#   r   %   s    þÿzSeparableConv2d.__init__c                 C   s   |   |¡}|  |¡}|S r$   )r/   r0   r%   r"   r"   r#   r'   -   s    

zSeparableConv2d.forward)r   r(   r"   r"   r    r#   r-   #   s   r-   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	ÚBranchSeparablesr   r   Fc                    s‚   t t| ƒ ¡  |r|n|}t ¡ | _t|||||d| _tj|ddd| _	tjdd| _
t|||d|d| _tj|ddd| _d S )N©r   r   r   r   r   T©Zinplacer   )r   r1   r   r   r   Úact_1r-   Úseparable_1r   Úbn_sep_1Úact_2Úseparable_2Úbn_sep_2)r   r   r   r   r   Úpad_typeÚ	stem_cellZmiddle_channelsr    r"   r#   r   5   s    

ÿ
ÿzBranchSeparables.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r$   )r4   r5   r6   r7   r8   r9   r%   r"   r"   r#   r'   A   s    





zBranchSeparables.forward)r   r   Fr(   r"   r"   r    r#   r1   3   s   r1   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	CellStem0é*   r   c                    sú   t t| ƒ ¡  || _|| _t| j| jddd| _t| j| jdd|ƒ| _t| j| jdd|dd| _	t
dd	d|d
| _t| j| jdd|dd| _t
dd	dd|d| _t| j| jdd|dd| _t
dd	dd|d| _t| j| jd	d|ƒ| _t
dd	d|d
| _d S )Nr   ©r   é   é   é   T)r;   Úmaxé   ©r   ÚavgF©Úcount_include_padr   )r   r<   r   Únum_channelsÚ	stem_sizer   Úconv_1x1r1   Úcomb_iter_0_leftÚcomb_iter_0_rightr   Úcomb_iter_1_leftÚcomb_iter_1_rightÚcomb_iter_2_leftÚcomb_iter_2_rightÚcomb_iter_3_rightÚcomb_iter_4_leftÚcomb_iter_4_right©r   rI   rH   r:   r    r"   r#   r   L   s    zCellStem0.__init__c                 C   s¤   |   |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}|| }|  |¡}	|  |¡}
|	|
 }|  |¡}|| }|  |¡}|  	|¡}|| }t
 ||||gd¡}|S ©Nr   )rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   ÚtorchÚcat)r   r&   Úx1Úx_comb_iter_0_leftÚx_comb_iter_0_rightÚx_comb_iter_0Úx_comb_iter_1_leftÚx_comb_iter_1_rightÚx_comb_iter_1Úx_comb_iter_2_leftÚx_comb_iter_2_rightÚx_comb_iter_2Úx_comb_iter_3_rightÚx_comb_iter_3Úx_comb_iter_4_leftÚx_comb_iter_4_rightÚx_comb_iter_4Úx_outr"   r"   r#   r'   `   s"    









zCellStem0.forward)r=   r   r(   r"   r"   r    r#   r<   K   s   r<   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	CellStem1r   c              
      s¸  t t| ƒ ¡  || _|| _td| j | jddd| _t ¡ | _	t 
¡ | _| j dtjdddd¡ | j dtj| j| jd dddd¡ t 
¡ | _| j d	t d
¡¡ | j dtjdddd¡ | j dtj| j| jd dddd¡ tj| jddd| _t| j| jdd|ƒ| _t| j| jdd|ƒ| _tddd|d| _t| j| jdd|ƒ| _tdddd|d| _t| j| jdd|ƒ| _tdddd|d| _t| j| jdd|ƒ| _tddd|d| _d S )Nr@   r   r>   ÚavgpoolF©r   rG   r   ©r   ZbiasÚpad©éÿÿÿÿr   rn   r   r   r   r   r?   rA   rB   rC   rD   rE   rF   )r   rh   r   rH   rI   r   rJ   r   r   r   Ú
SequentialÚpath_1Ú
add_moduleÚ	AvgPool2dÚConv2dÚpath_2Ú	ZeroPad2dr   Úfinal_path_bnr1   rK   rL   r   rM   rN   rO   rP   rQ   rR   rS   rT   r    r"   r#   r   |   s,    

&
&zCellStem1.__init__c                 C   sØ   |   |¡}|  |¡}|  |¡}|  |¡}|  t ||gd¡¡}|  |¡}|  |¡}	||	 }
|  	|¡}|  
|¡}|| }|  |¡}|  |¡}|| }|  |
¡}|| }|  |
¡}|  |¡}|| }t ||||gd¡}|S rU   )rJ   r   rp   rt   rv   rV   rW   rK   rL   rM   rN   rO   rP   rQ   rR   rS   )r   Úx_conv0Úx_stem_0Úx_leftÚx_reluÚx_path1Úx_path2Úx_rightrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   r"   r"   r#   r'   œ   s*    












zCellStem1.forward)r   r(   r"   r"   r    r#   rh   z   s    rh   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	FirstCellr   c              
      sr  t t| ƒ ¡  t||ddd| _t ¡ | _t ¡ | _	| j	 
dtjdddd¡ | j	 
dtj||dddd¡ t ¡ | _| j 
d	t d
¡¡ | j 
dtjdddd¡ | j 
dtj||dddd¡ tj|d ddd| _t||dd|ƒ| _t||dd|ƒ| _t||dd|ƒ| _t||dd|ƒ| _tdddd|d| _tdddd|d| _tdddd|d| _t||dd|ƒ| _d S )Nr   r>   ri   r@   Frj   r   rk   rl   rm   r   r   r   r?   rC   rE   rF   )r   r~   r   r   rJ   r   r   r   ro   rp   rq   rr   rs   rt   ru   r   rv   r1   rK   rL   rM   rN   r   rO   Úcomb_iter_3_leftrQ   rR   ©r   Úin_chs_leftÚout_chs_leftÚin_chs_rightÚout_chs_rightr:   r    r"   r#   r   À   s&    


zFirstCell.__init__c                 C   sÒ   |   |¡}|  |¡}|  |¡}|  t ||gd¡¡}|  |¡}|  |¡}|  |¡}	||	 }
|  	|¡}|  
|¡}|| }|  |¡}|| }|  |¡}|  |¡}|| }|  |¡}|| }t ||
||||gd¡}|S rU   )r   rp   rt   rv   rV   rW   rJ   rK   rL   rM   rN   rO   r   rQ   rR   )r   r&   Úx_prevrz   r{   r|   ry   r}   rY   rZ   r[   r\   r]   r^   r_   ra   Úx_comb_iter_3_leftrb   rc   rd   rf   rg   r"   r"   r#   r'   Ý   s(    











zFirstCell.forward)r   r(   r"   r"   r    r#   r~   ¾   s   r~   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú
NormalCellr   c                    sÐ   t t| ƒ ¡  t||dd|d| _t||dd|d| _t||dd|ƒ| _t||dd|ƒ| _t||dd|ƒ| _	t||dd|ƒ| _
tdddd|d| _tdddd|d| _tdddd|d| _t||dd|ƒ| _d S )Nr   r2   r?   rC   rE   FrF   )r   r‡   r   r   Úconv_prev_1x1rJ   r1   rK   rL   rM   rN   r   rO   r   rQ   rR   r€   r    r"   r#   r   ü   s    zNormalCell.__init__c                 C   s¨   |   |¡}|  |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}	||	 }
|  |¡}|| }|  |¡}|  |¡}|| }|  	|¡}|| }t
 |||
|||gd¡}|S rU   )rˆ   rJ   rK   rL   rM   rN   rO   r   rQ   rR   rV   rW   )r   r&   r…   ry   r}   rY   rZ   r[   r\   r]   r^   r_   ra   r†   rb   rc   rd   rf   rg   r"   r"   r#   r'     s"    









zNormalCell.forward)r   r(   r"   r"   r    r#   r‡   ú   s   r‡   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚReductionCell0r   c                    sà   t t| ƒ ¡  t||dd|d| _t||dd|d| _t||dd|ƒ| _t||dd|ƒ| _t	ddd|d| _
t||dd|ƒ| _t	d	ddd
|d| _t||dd|ƒ| _t	d	ddd
|d| _t||dd|ƒ| _t	ddd|d| _d S ©Nr   r2   r?   r@   rA   rB   rC   rD   rE   FrF   )r   r‰   r   r   rˆ   rJ   r1   rK   rL   r   rM   rN   rO   rP   rQ   rR   rS   r€   r    r"   r#   r   *  s    zReductionCell0.__init__c                 C   s®   |   |¡}|  |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}	||	 }
|  |¡}|  |¡}|| }|  |¡}||
 }|  	|¡}|  
|¡}|| }t |
|||gd¡}|S rU   ©rˆ   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rV   rW   ©r   r&   r…   ry   r}   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   r"   r"   r#   r'   =  s$    










zReductionCell0.forward)r   r(   r"   r"   r    r#   r‰   (  s   r‰   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚReductionCell1r   c                    sà   t t| ƒ ¡  t||dd|d| _t||dd|d| _t||dd|ƒ| _t||dd|ƒ| _t	ddd|d| _
t||dd|ƒ| _t	d	ddd
|d| _t||dd|ƒ| _t	d	ddd
|d| _t||dd|ƒ| _t	ddd|d| _d S rŠ   )r   r   r   r   rˆ   rJ   r1   rK   rL   r   rM   rN   rO   rP   rQ   rR   rS   r€   r    r"   r#   r   Z  s    zReductionCell1.__init__c                 C   s®   |   |¡}|  |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}	||	 }
|  |¡}|  |¡}|| }|  |¡}||
 }|  	|¡}|  
|¡}|| }t |
|||gd¡}|S rU   r‹   rŒ   r"   r"   r#   r'   m  s$    










zReductionCell1.forward)r   r(   r"   r"   r    r#   r   X  s   r   c                	       sx   e Zd ZdZ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d„ Zdd„ Z‡  ZS )!r   zNASNetALarge (6 @ 4032) éè  rC   é`   r@   éÀ  é    ç        rE   Úsamec
                    s¢  t t| ƒ ¡  || _|| _|| _|| _|dks2J ‚| jd }
t|| jdddtt	j
dddd	d
| _t| j|
|d  |	d| _t| j|
| |	d| _t|
|
d d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 d|
 d|
 d|
 |	d| _td|
 |
d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _t d|
 d|
 d|
 d|
 |	d| _!td|
 d|
 d|
 d|
 |	d| _"td|
 d|
 d|
 d|
 |	d| _#td|
 d|
 d|
 d|
 |	d| _$td|
 d|
 d|
 d|
 |	d| _%td|
 d|
 d|
 d|
 |	d| _&td|
 d|
 d|
 d|
 |	d| _'t	j(dd| _)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g| _+t,| j| j||d\| _-| _.| _/d S ) Nr‘   é   rC   r   r@   r   r   r   F)r   r   r   r   r   Z
norm_layerZ	apply_act)rH   r:   )r   r‚   rƒ   r„   r:   é   é   é   é   é   Tr3   r   Úconv0)Znum_chsZ	reductionÚmoduleé¨   zcell_stem_1.conv_1x1.actið  zreduction_cell_0.conv_1x1.actià  zreduction_cell_1.conv_1x1.actr   r   )Ú	pool_typeÚ	drop_rate)0r   r   r   Únum_classesrI   Únum_featuresÚchannel_multiplierr   r   r   r   rš   r<   Úcell_stem_0rh   Úcell_stem_1r~   Úcell_0r‡   Úcell_1Úcell_2Úcell_3Úcell_4Úcell_5r‰   Úreduction_cell_0Úcell_6Úcell_7Úcell_8Úcell_9Úcell_10Úcell_11r   Úreduction_cell_1Úcell_12Úcell_13Úcell_14Úcell_15Úcell_16Úcell_17r   r   ÚdictZfeature_infor   Úglobal_poolÚ	head_dropÚlast_linear)r   rŸ   Zin_chansrI   r¡   r    Zoutput_striderž   r¹   r:   Zchannelsr    r"   r#   r   ‹  sÖ    
þÿÿ
þ
þ
þ
þ
þ
þþþþþþþþþþþþþþþûÿzNASNetALarge.__init__Fc                 C   s   t dg d¢d}|S )Nz^conv0|cell_stem_[01]))z^cell_(\d+)N)z^reduction_cell_0)r•   )z^reduction_cell_1)r—   )ÚstemÚblocks)r¸   )r   ZcoarseZmatcherr"   r"   r#   Úgroup_matcherô  s
    þzNASNetALarge.group_matcherTc                 C   s   |rJ dƒ‚d S )Nz$gradient checkpointing not supportedr"   )r   Úenabler"   r"   r#   Úset_grad_checkpointing   s    z#NASNetALarge.set_grad_checkpointingc                 C   s   | j S r$   )r»   )r   r"   r"   r#   Úget_classifier  s    zNASNetALarge.get_classifierc                 C   s$   || _ t| j| j |d\| _| _d S )N)r   )rŸ   r   r    r¹   r»   )r   rŸ   r¹   r"   r"   r#   Úreset_classifier  s    
ÿzNASNetALarge.reset_classifierc                 C   s  |   |¡}|  |¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}	|  |	|¡}
|  	|
|	¡}|  
||	¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  |¡}|S r$   )rš   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   rµ   r¶   r·   r   )r   r&   rw   rx   Zx_stem_1Zx_cell_0Zx_cell_1Zx_cell_2Zx_cell_3Zx_cell_4Zx_cell_5Zx_reduction_cell_0Zx_cell_6Zx_cell_7Zx_cell_8Zx_cell_9Z	x_cell_10Z	x_cell_11Zx_reduction_cell_1Z	x_cell_12Z	x_cell_13Z	x_cell_14Z	x_cell_15Z	x_cell_16Z	x_cell_17r"   r"   r#   Úforward_features  s2    


zNASNetALarge.forward_featuresc                 C   s"   |   |¡}|  |¡}|  |¡}|S r$   )r¹   rº   r»   r%   r"   r"   r#   Úforward_head,  s    


zNASNetALarge.forward_headc                 C   s   |   |¡}|  |¡}|S r$   )rÃ   rÄ   r%   r"   r"   r#   r'   2  s    

zNASNetALarge.forward)	rŽ   rC   r   r@   r   r‘   r’   rE   r“   )F)T)rE   )r)   r*   r+   Ú__doc__r   rV   ZjitÚignorer¾   rÀ   rÁ   rÂ   rÃ   rÄ   r'   r,   r"   r"   r    r#   r   ˆ  s*            öi

Fc                 K   s    t t| |fdtdddi|¤ŽS )NZfeature_cfgÚhookT)Zfeature_clsZ
no_rewrite)r   r   r¸   )ÚvariantÚ
pretrainedÚkwargsr"   r"   r#   Ú_create_nasnet8  s    ý
üûrË   znasnetalarge.tf_in1kztimm/zjhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/nasnetalarge-dc4a7b8b.pth)rC   éK  rÌ   )é   rÍ   gôýÔxé&í?Zbicubic)ç      à?rÎ   rÎ   rŽ   z
conv0.convr»   )Z	hf_hub_idÚurlZ
input_sizeZ	pool_sizeZcrop_pctÚinterpolationÚmeanZstdrŸ   Z
first_convÚ
classifier)Úreturnc                 K   s$   t f ddi|¤Ž}td| fi |¤ŽS )z'NASNet-A large model architecture.
    r:   r“   Únasnetalarge)r¸   rË   )rÉ   rÊ   Zmodel_kwargsr"   r"   r#   rÔ   S  s    rÔ   )F)F)"rÅ   Ú	functoolsr   rV   Ztorch.nnr   Ztorch.nn.functionalZ
functionalÚFZtimm.layersr   r   r   r   Z_builderr   Ú	_registryr	   r
   Ú__all__ÚModuler   r-   r1   r<   rh   r~   r‡   r‰   r   r   rË   Zdefault_cfgsrÔ   r"   r"   r"   r#   Ú<module>   sJ   /D<.00 1

õÿ