a
    d-/                     @   sp  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 ddlmZmZ ddlmZ ddlmZ dd	lmZ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d*ddZ edddddd e
ed!d"d#
dddddd e
ed!d"d#
d$Z!ed+ed%d&d'Z"ee#d(d)i dS ),z Pytorch Inception-Resnet-V2 implementation
Sourced from https://github.com/Cadene/tensorflow-model-zoo.torch (MIT License) which is
based upon Google's Tensorflow implementation and pretrained weights (Apache 2.0 License)
    )partialN)IMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)create_classifierConvNormAct   )build_model_with_cfg)flatten_modules)register_modelgenerate_default_cfgsregister_model_deprecationsInceptionResnetV2c                       s&   e Zd Zd fdd	Zdd Z  ZS )Mixed_5bNc                    s   t t|   |pt}|ddddd| _t|ddddd|dddddd	| _t|ddddd|ddd
ddd	|ddd
ddd	| _ttj	d
dddd|ddddd| _
d S )N   `   r   kernel_sizestride0   @         r   r   padding   F)r   r   Zcount_include_pad)superr   __init__r   branch0nn
Sequentialbranch1branch2Z	AvgPool2dbranch3self
conv_block	__class__ h/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/inception_resnet_v2.pyr      s     zMixed_5b.__init__c                 C   s@   |  |}| |}| |}| |}t||||fd}|S Nr   r   r    r!   r"   torchcatr$   xx0x1x2Zx3outr(   r(   r)   forward*   s    



zMixed_5b.forward)N__name__
__module____qualname__r   r4   __classcell__r(   r(   r&   r)   r      s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Block35      ?Nc                    s   t t|   || _|pt}|ddddd| _t|ddddd|dddddd| _t|ddddd|dddddd|dddddd| _	tj
d	dddd| _t | _d S )
N@      r   r   r   r   r   r      )r   r:   r   scaler   r   r   r   r    r!   Conv2dconv2dReLUactr$   r?   r%   r&   r(   r)   r   4   s    zBlock35.__init__c                 C   sV   |  |}| |}| |}t|||fd}| |}|| j | }| |}|S r*   )r   r    r!   r,   r-   rA   r?   rC   r$   r/   r0   r1   r2   r3   r(   r(   r)   r4   I   s    




zBlock35.forward)r;   Nr5   r(   r(   r&   r)   r:   3   s   r:   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Mixed_6aNc              
      sr   t t|   |pt}|ddddd| _t|ddddd|dddddd|ddddd| _tjddd	| _	d S )
Nr<     r   r   r      r   r   r   )
r   rF   r   r   r   r   r   r    	MaxPool2dr!   r#   r&   r(   r)   r   U   s    zMixed_6a.__init__c                 C   s4   |  |}| |}| |}t|||fd}|S r*   )r   r    r!   r,   r-   rE   r(   r(   r)   r4   c   s
    


zMixed_6a.forward)Nr5   r(   r(   r&   r)   rF   T   s   rF   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Block17r;   Nc                    s   t t|   || _|pt}|ddddd| _t|ddddd|dddddd	|ddd
ddd	| _tj	ddddd| _
t | _d S )N@  r   r   r   r>      )r      )r   r   r   )rN   r   )r   r   rG   )r   rK   r   r?   r   r   r   r   r    r@   rA   rB   rC   rD   r&   r(   r)   r   l   s    zBlock17.__init__c                 C   sJ   |  |}| |}t||fd}| |}|| j | }| |}|S r*   )r   r    r,   r-   rA   r?   rC   r$   r/   r0   r1   r3   r(   r(   r)   r4   |   s    



zBlock17.forward)r;   Nr5   r(   r(   r&   r)   rK   k   s   rK   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Mixed_7aNc              
      s   t t|   |pt}t|ddddd|ddddd| _t|ddddd|ddddd| _t|ddddd|dddddd	|dd
ddd| _tj	ddd| _
d S )NrL   rH   r   r   rG   r   r   i   r   r<   rI   )r   rP   r   r   r   r   r   r    r!   rJ   r"   r#   r&   r(   r)   r      s     zMixed_7a.__init__c                 C   s@   |  |}| |}| |}| |}t||||fd}|S r*   r+   r.   r(   r(   r)   r4      s    



zMixed_7a.forward)Nr5   r(   r(   r&   r)   rP      s   rP   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	Block8r;   FNc                    s   t t|   || _|pt}|ddddd| _t|ddddd|dddddd|dd	d
ddd| _tj	ddddd| _
|rd nt | _d S )N   r   r   r      )r   r   )r   r   r   rH   )r   r   )r   r   i  )r   rQ   r   r?   r   r   r   r   r    r@   rA   rB   relu)r$   r?   no_relur%   r&   r(   r)   r      s    zBlock8.__init__c                 C   sT   |  |}| |}t||fd}| |}|| j | }| jd urP| |}|S r*   )r   r    r,   r-   rA   r?   rT   rO   r(   r(   r)   r4      s    




zBlock8.forward)r;   FNr5   r(   r(   r&   r)   rQ      s   rQ   c                       s|   e 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 edddZdd Z  ZS )!r     r           r=   avgbatchnorm2dMbP?rT   c	           	   	      s  t t|   || _d| _|dks&J ttd||t|dtddd  |ddd	d
| _ ddddd
| _	 dddddd| _
tdd	ddg| _tjdd	d| _ ddddd
| _ ddddd
| _|  jtddddg7  _tjdd	d| _t d| _tj fddtdD  | _|  jtddddg7  _t d| _tj fddtdD  | _|  jtddd dg7  _t d| _tj fd!dtd"D  | _td d#| _ d$| jddd
| _|  jt| jdd%dg7  _t | j| j||d&\| _!| _"| _#d S )'Ni   r=   r   )ZepsT)Zinplace)r   
norm_layer	act_layerZnorm_kwargsZ
act_kwargsr   r   r   r   r   r   	conv2d_2b)Znum_chsZ	reductionmodulerI   P   r      	conv2d_4ar%   c                    s   g | ]}t d  dqS )g(\?r?   r%   )r:   .0_rb   r(   r)   
<listcomp>       z.InceptionResnetV2.__init__.<locals>.<listcomp>
   r<      repeatc                    s   g | ]}t d  dqS )g?rc   )rK   rd   rb   r(   r)   rg      rh      rL      repeat_1c                    s   g | ]}t d  dqS )g?rc   )rQ   rd   rb   r(   r)   rg      rh   	   )rU   r%   rR   	conv2d_7b)	pool_type	drop_rate)$r   r   r   num_classesnum_featuresr   r   dict	conv2d_1a	conv2d_2ar]   Zfeature_infor   rJ   
maxpool_3a	conv2d_3bra   
maxpool_5ar   mixed_5br   rangerk   rF   mixed_6arn   rP   mixed_7arepeat_2rQ   block8rp   r   global_pool	head_dropclassif)	r$   rs   Zin_chansrr   Zoutput_strider   r[   Znorm_epsr\   r&   rb   r)   r      sF    	zInceptionResnetV2.__init__Fc                    s8   dd t t|  ddD   d  fdd}|S )Nc                 S   s   i | ]\}\}}||qS r(   r(   )re   ikrf   r(   r(   r)   
<dictcomp>   rh   z3InceptionResnetV2.group_matcher.<locals>.<dictcomp>r(   )prefixr   c                    s   t  fdddD rdS t  fdddD r4dS t  fddd	D rVtd S  D ].}|t d
d t| kr^|   S q^tdS d S )Nc                    s   g | ]}  |qS r(   
startswithre   nnamer(   r)   rg      rh   zEInceptionResnetV2.group_matcher.<locals>._matcher.<locals>.<listcomp>)Zconv2d_1Zconv2d_2r   c                    s   g | ]}  |qS r(   r   r   r   r(   r)   rg     rh   )Zconv2d_3Zconv2d_4r   c                    s   g | ]}  |qS r(   r   r   r   r(   r)   rg     rh   )r   Zconv2d_7.inf)anylenkeystuplesplitfloat)r   r   Z
module_mapr   r)   _matcher   s    z1InceptionResnetV2.group_matcher.<locals>._matcher)	enumerater	   Znamed_childrenpop)r$   Zcoarser   r(   r   r)   group_matcher   s    
zInceptionResnetV2.group_matcherTc                 C   s   |rJ dd S )Nzcheckpointing not supportedr(   )r$   enabler(   r(   r)   set_grad_checkpointing  s    z(InceptionResnetV2.set_grad_checkpointingc                 C   s   | j S Nr   )r$   r(   r(   r)   get_classifier  s    z InceptionResnetV2.get_classifierc                 C   s$   || _ t| j| j |d\| _| _d S )N)rq   )rs   r   rt   r   r   )r$   rs   r   r(   r(   r)   reset_classifier  s    z"InceptionResnetV2.reset_classifierc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}| |}|S r   )rv   rw   r]   rx   ry   ra   rz   r{   rk   r}   rn   r~   r   r   rp   r$   r/   r(   r(   r)   forward_features  s     














z"InceptionResnetV2.forward_features)
pre_logitsc                 C   s&   |  |}| |}|r|S | |S r   )r   r   r   )r$   r/   r   r(   r(   r)   forward_head*  s    

zInceptionResnetV2.forward_headc                 C   s   |  |}| |}|S r   )r   r   r   r(   r(   r)   r4   /  s    

zInceptionResnetV2.forward)rV   r   rW   r=   rX   rY   rZ   rT   )F)T)rX   )F)r6   r7   r8   r   r,   Zjitignorer   r   r   r   r   boolr   r4   r9   r(   r(   r&   r)   r      s&           5

Fc                 K   s   t t| |fi |S r   )r   r   )variant
pretrainedkwargsr(   r(   r)   _create_inception_resnet_v25  s    r   ztimm/rV   )r   +  r   )rj   rj   gQ?Zbicubiczconv2d_1a.convr   )
Z	hf_hub_idrs   Z
input_sizeZ	pool_sizeZcrop_pctinterpolationmeanZstdZ
first_conv
classifier)zinception_resnet_v2.tf_in1k#inception_resnet_v2.tf_ens_adv_in1k)returnc                 K   s   t dd| i|S )Ninception_resnet_v2r   )r   )r   )r   r   r(   r(   r)   r   N  s    r   Zens_adv_inception_resnet_v2r   )F)F)$__doc__	functoolsr   r,   Ztorch.nnr   Ztorch.nn.functionalZ
functionalFZ	timm.datar   r   Ztimm.layersr   r   Z_builderr   Z_manipulater	   	_registryr
   r   r   __all__Moduler   r:   rF   rK   rP   rQ   r   r   Zdefault_cfgsr   r6   r(   r(   r(   r)   <module>   sJ    ! r

