a
    dH                     @   sX  d Z ddlZddlmZ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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d7ddZd8ddZeeddeddeddeddeddeddeddeddeddeddeddedddZed9eddd Z ed:d!d"Z!ed;edd#d$Z"ed<edd%d&Z#ed=edd'd(Z$ed>edd)d*Z%ed?edd+d,Z&ed@edd-d.Z'edAedd/d0Z(edBedd1d2Z)edCedd3d4Z*edDedd5d6Z+dS )Eaf   Deep Layer Aggregation and DLA w/ Res2Net
DLA original adapted from Official Pytorch impl at: https://github.com/ucbdrive/dla
DLA Paper: `Deep Layer Aggregation` - https://arxiv.org/abs/1707.06484

Res2Net additions from: https://github.com/gasvn/Res2Net/
Res2Net Paper: `Res2Net: A New Multi-scale Backbone Architecture` - https://arxiv.org/abs/1904.01169
    N)ListOptionalIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsDLAc                       sD   e Zd ZdZd	 fdd	Zd
eej eeej  dddZ	  Z
S )DlaBasicz	DLA Basicr   c              	      sr   t t|   tj||d||d|d| _t|| _tjdd| _	tj||dd|d|d| _
t|| _|| _d S )N   Fkernel_sizestridepaddingbiasdilationTZinplacer   )superr   __init__nnConv2dconv1BatchNorm2dbn1ReLUreluconv2bn2r   )selfinplanesplanesr   r   _	__class__ X/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/dla.pyr      s    zDlaBasic.__init__Nshortcutchildrenc                 C   sT   |d u r|}|  |}| |}| |}| |}| |}||7 }| |}|S N)r   r   r   r   r    r!   xr*   r+   outr'   r'   r(   forward'   s    





zDlaBasic.forward)r   r   )NN)__name__
__module____qualname____doc__r   r   torchTensorr   r0   __classcell__r'   r'   r%   r(   r      s   r   c                       sH   e Zd ZdZdZd fdd	Zdeej ee	ej  dd	d
Z
  ZS )DlaBottleneckzDLA/DLA-X Bottleneck   r   @   c              
      s   t t|   || _tt||d  | }|| j }tj	||ddd| _
t|| _tj	||d||d||d| _t|| _tj	||ddd| _t|| _tjdd| _d S )	Nr:   r   Fr   r   r   )r   r   r   r   r   groupsTr   )r   r8   r   r   intmathfloor	expansionr   r   r   r   r   r   r    conv3bn3r   r   )r!   r"   	outplanesr   r   cardinality
base_width
mid_planesr%   r'   r(   r   <   s    

zDlaBottleneck.__init__Nr)   c                 C   sr   |d u r|}|  |}| |}| |}| |}| |}| |}| |}| |}||7 }| |}|S r,   )r   r   r   r   r    rA   rB   r-   r'   r'   r(   r0   L   s    








zDlaBottleneck.forward)r   r   r   r:   )NNr1   r2   r3   r4   r@   r   r   r5   r6   r   r0   r7   r'   r'   r%   r(   r8   8   s   r8   c                       sH   e Zd ZdZdZd fdd	Zdeej ee	ej  d	d
dZ
  ZS )DlaBottle2neckzj Res2Net/Res2NeXT DLA Bottleneck
    Adapted from https://github.com/gasvn/Res2Net/blob/master/dla.py
    r9   r         c                    s.  t t|   |dk| _|| _tt||d  | }|| j }|| _	t
j||| ddd| _t
|| | _td|d }	g }
g }t|	D ]4}|
t
j||d||||dd |t
| qt
|
| _t
|| _| jrt
jd|ddnd | _t
j|| |ddd| _t
|| _t
jdd	| _d S )
Nr   r:   Fr;   r   )r   r   r   r   r<   r   )r   r   r   Tr   )r   rH   r   is_firstscaler=   r>   r?   r@   widthr   r   r   r   r   maxrangeappendZ
ModuleListconvsbnsZ	AvgPool2dpoolrA   rB   r   r   )r!   r"   rC   r   r   rL   rD   rE   rF   Znum_scale_convsrQ   rR   r$   r%   r'   r(   r   g   s.    


zDlaBottle2neck.__init__Nr)   c                 C   s  |d u r|}|  |}| |}| |}t|| jd}g }|d }tt| j| j	D ]T\}\}	}
|dksr| j
r||| }n|||  }|	|}|
|}| |}|| qX| jdkr| jd ur|| |d  n||d  t|d}| |}| |}||7 }| |}|S )Nr   r   )r   r   r   r5   splitrM   	enumerateziprQ   rR   rK   rP   rL   rS   catrA   rB   )r!   r.   r*   r+   r/   ZspxZspospiconvbnr'   r'   r(   r0      s4    









zDlaBottle2neck.forward)r   r   rI   rJ   rI   )NNrG   r'   r'   r%   r(   rH   a   s   rH   c                       s0   e Zd Z fddZeej dddZ  ZS )DlaRootc                    sR   t t|   tj||ddd|d d d| _t|| _tjdd| _	|| _
d S )Nr   Fr9   )r   r   r   Tr   )r   r]   r   r   r   r[   r   r\   r   r   r*   )r!   in_channelsout_channelsr   r*   r%   r'   r(   r      s    zDlaRoot.__init__)
x_childrenc                 C   s<   |  t|d}| |}| jr.||d 7 }| |}|S )Nr   r   )r[   r5   rX   r\   r*   r   )r!   r`   r.   r'   r'   r(   r0      s    

zDlaRoot.forward)	r1   r2   r3   r   r   r5   r6   r0   r7   r'   r'   r%   r(   r]      s   r]   c                       s@   e Zd Zd fdd	Zdeej eeej  dd	d
Z  Z	S )DlaTreer   r:   Fr   c              	      sH  t t|   |
dkrd| }
|	r*|
|7 }
|dkr@tj||dnt | _t | _t|||d}|dkr||||fi || _	|||dfi || _
||krttj||ddddt|| _t|
|||| _n^|t||d t|d ||||fd	di|| _	t|d |||fd	|
| i|| _
d | _|	| _|
| _|| _d S )
Nr   r9   r   r   )r   rD   rE   F)r   r   r   )root_kernel_sizeroot_shortcutroot_dim)r   ra   r   r   Z	MaxPool2dIdentity
downsampleprojectdicttree1tree2
Sequentialr   r   r]   rootupdate
level_rootre   levels)r!   rp   blockr^   r_   r   r   rD   rE   ro   re   rc   rd   cargsr%   r'   r(   r      sV     
	zDlaTree.__init__Nr)   c                 C   s   |d u rg }|  |}| |}| jr0|| | ||}| jd urd| |}| ||g| }n|| | |d |}|S r,   )rg   rh   ro   rP   rj   rm   rk   )r!   r.   r*   r+   Zbottomx1Zx2r'   r'   r(   r0      s    





zDlaTree.forward)r   r   r   r:   Fr   r   F)NN)
r1   r2   r3   r   r   r5   r6   r   r0   r7   r'   r'   r%   r(   ra      s           :ra   c                	       s   e Zd Zddddddeddf	 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   avgr   r:   Fg        c              
      s  t t|   || _|| _|| _|| _|dks2J ttj	||d dddddt
|d tjdd	| _| |d |d |d | _| j|d |d |d d
d| _t|||
d}t|d
 |	|d |d
 d
fddi|| _t|d |	|d
 |d d
fddi|| _t|d |	|d |d d
fddi|| _t|d |	|d |d d
fddi|| _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t|d dddg| _|d | _t| j| j|d|d\| _| _| _|rtdnt | _|  D ]r}t |tj	rX|j!d |j!d  |j" }|j#j$%dt&'d|  n(t |tj
r|j#j$(d |j)j$*  qd S )Nrt   r      r   r   F)r   r   r   r   Tr   r9   rb   )rD   rE   rd   ro   rI      level0)Znum_chsZ	reductionmodulelevel1level2rJ   level3   level4level5rT   )	pool_typeuse_conv	drop_rateg       @)+r   r   r   channelsnum_classesrD   rE   r   rl   r   r   r   
base_layer_make_conv_levelry   r{   ri   ra   r|   r}   r   r   Zfeature_infonum_featuresr   global_pool	head_dropfcFlattenrf   flattenmodules
isinstancer   r_   ZweightdataZnormal_r>   sqrtZfill_r   Zzero_)r!   rp   r   Zoutput_strider   Zin_chansr   rD   rE   rq   shortcut_rootr   rr   mnr%   r'   r(   r     sR    
 ****	
zDLA.__init__c                 C   s^   g }t |D ]F}|tj||d|dkr*|nd|d|dt|tjddg |}qtj| S )Nr   r   r   Fr   Tr   )rO   extendr   r   r   r   rl   )r!   r"   r#   rQ   r   r   r   rZ   r'   r'   r(   r   B  s    
zDLA._make_conv_levelc                 C   s   t d|rdng dd}|S )Nz^base_layer^level(\d+)))z^level(\d+)\.tree(\d+)N)z^level(\d+)\.root)r9   )r   )r   )stemblocks)ri   )r!   ZcoarseZmatcherr'   r'   r(   group_matcherO  s
    	zDLA.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr'   )r!   enabler'   r'   r(   set_grad_checkpointing\  s    zDLA.set_grad_checkpointingc                 C   s   | j S r,   )r   )r!   r'   r'   r(   get_classifier`  s    zDLA.get_classifierc                 C   s>   || _ t| j| j |dd\| _| _|r0tdnt | _d S )NT)r   r   r   )	r   r   r   r   r   r   r   rf   r   )r!   r   r   r'   r'   r(   reset_classifierd  s
    zDLA.reset_classifierc                 C   sJ   |  |}| |}| |}| |}| |}| |}| |}|S r,   )r   ry   r{   r|   r}   r   r   r!   r.   r'   r'   r(   forward_featuresj  s    






zDLA.forward_features)
pre_logitsc                 C   s6   |  |}| |}|r"| |S | |}| |S r,   )r   r   r   r   )r!   r.   r   r'   r'   r(   forward_headt  s    



zDLA.forward_headc                 C   s   |  |}| |}|S r,   )r   r   r   r'   r'   r(   r0   |  s    

zDLA.forward)r   r   )F)T)rv   )F)r1   r2   r3   rH   r   r   r5   Zjitignorer   r   r   r   r   boolr   r0   r7   r'   r'   r%   r(   r     s*   <



Fc                 K   s    t t| |fdtddd|S )NF)r   r9   r   rI   rx   )Zout_indices)Zpretrained_strictZfeature_cfg)r	   r   ri   )variant
pretrainedkwargsr'   r'   r(   _create_dla  s    r    c                 K   s   | dddddt tddd
|S )	Nru   )r      r   )rw   rw   g      ?Zbilinearzbase_layer.0r   )
urlr   Z
input_sizeZ	pool_sizeZcrop_pctinterpolationmeanZstdZ
first_conv
classifierr   )r   r   r'   r'   r(   _cfg  s    r   ztimm/)Z	hf_hub_id)z
dla34.in1kzdla46_c.in1kzdla46x_c.in1kzdla60x_c.in1kz
dla60.in1kzdla60x.in1kzdla102.in1kzdla102x.in1kzdla102x2.in1kzdla169.in1kzdla60_res2net.in1kzdla60_res2next.in1k)returnc                 K   s0   t ddtddd}td| fi t |fi |S )Nr   r   r   r9   r   r   r~   rt            i   r      rp   r   rq   rD   rE   dla60_res2netri   rH   r   r   r   Z
model_argsr'   r'   r(   r     s
    r   c                 K   s0   t ddtddd}td| fi t |fi |S )Nr   r   rJ   rI   r   dla60_res2nextr   r   r'   r'   r(   r     s
    r   c                 K   s4   t g dg dtd}td| fi t |fi |S )Nr   r   r   r9   r9   r   )r~   rt   r:   r   r   r   rp   r   rq   dla34)ri   r   r   r   r'   r'   r(   r     s    r   c                 K   s4   t g dg dtd}td| fi t |fi |S )Nr   r~   rt   r:   r:   r   r   r   dla46_cri   r8   r   r   r'   r'   r(   r     s    r   c                 K   s8   t g dg dtddd}td| fi t |fi |S )Nr   r   rt   rI   r   dla46x_cr   r   r'   r'   r(   r     s
    r   c                 K   s8   t g dg dtddd}td| fi t |fi |S )Nr   r   rt   rI   r   dla60x_cr   r   r'   r'   r(   r     s
    r   c                 K   s4   t g dg dtd}td| fi t |fi |S )Nr   r   r   dla60r   r   r'   r'   r(   r     s
    r   c                 K   s8   t g dg dtddd}td| fi t |fi |S )Nr   r   rt   rI   r   dla60xr   r   r'   r'   r(   r     s
    r   c                 K   s6   t g dg dtdd}td| fi t |fi |S )Nr   r   r   r   rI   r   r   Trp   r   rq   r   dla102r   r   r'   r'   r(   r     s
    r   c                 K   s:   t g dg dtdddd}td| fi t |fi |S )Nr   r   rt   rI   Trp   r   rq   rD   rE   r   dla102xr   r   r'   r'   r(   r     s
    r   c                 K   s:   t g dg dtdddd}td| fi t |fi |S )Nr   r   r:   rI   Tr   dla102x2r   r   r'   r'   r(   r     s
    r   c                 K   s6   t g dg dtdd}td| fi t |fi |S )N)r   r   r9   r   rx   r   r   Tr   dla169r   r   r'   r'   r(   r     s
    r   )F)r   )F)F)F)F)F)F)F)F)F)F)F)F),r4   r>   typingr   r   r5   Ztorch.nnr   Ztorch.nn.functionalZ
functionalFZ	timm.datar   r   Ztimm.layersr   Z_builderr	   	_registryr
   r   __all__Moduler   r8   rH   r]   ra   r   r   r   Zdefault_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   sp   !)EL}

