U
    ¯Ê¹j§H  ã                   @   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__© úN/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/dla.pyr      s.         þ     þzDlaBasic.__init__N©ÚshortcutÚchildrenc                 C   sT   |d k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 k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
 |¡¡ qŽt
 |
¡| _t
 |¡| _| jròt
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 k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 k	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              	      s@  t t| ƒ ¡  |
dkrd| }
|	r*|
|7 }
|dkr@tj||d�nt ¡ | _t ¡ | _t|||d�}|dkrÌ||||f|Ž| _	|||df|Ž| _
||krºt 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 krg }|   |¡}|  |¡}| jr0| |¡ |  ||¡}| jd k	rd|  |¡}|  ||g| ¡}n| |¡ |  |d |¡}|S r,   )rg   rh   ro   rP   rj   rm   rk   )r!   r.   r*   r+   Ú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s2t‚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�\| _| _| _|�rþt 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 )Nru   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   ÚAssertionErrorr   rl   r   r   r   Ú
base_layerÚ_make_conv_levelrz   r|   ri   ra   r}   r~   r€   r�   Zfeature_infoÚnum_featuresr   Úglobal_poolÚ	head_dropÚfcÚFlattenrf   ÚflattenÚmodulesÚ
isinstancer   r_   Ú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dddg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t dƒ‚d S )Nz$gradient checkpointing not supported)r‡   )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ˆ   rz   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)rw   )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   ry   )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 )	Nrv   )r   éà   r¬   )rx   rx   g      ì?Zbilinearzbase_layer.0r�   )
Úurlr†   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZ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   s(   t ddtddd�}td| ft |f|ŽŽS )N©r   r   r   r9   r   r   ©r   ru   é€   é   é   é   r   é   ©rp   r…   rq   rD   rE   Údla60_res2net©ri   rH   rª   ©r¨   r©   Z
model_argsr'   r'   r(   rº   ¨  s       þrº   c                 K   s(   t ddtddd�}td| ft |f|ŽŽS )Nr²   r³   rJ   rI   r¹   Údla60_res2nextr»   r¼   r'   r'   r(   r½   °  s       þr½   c                 K   s<   t ddddddgddddddgtd	�}td
| ft |f|ŽŽS )Nr   r9   r   ru   r:   r´   rµ   r¶   ©rp   r…   rq   Údla34)ri   r   rª   r¼   r'   r'   r(   r¿   ¸  s      ÿr¿   c                 K   s<   t ddddddgddddddgtd�}td	| ft |f|ŽŽS )
Nr   r9   r   ru   r:   r´   rµ   r¾   Údla46_c©ri   r8   rª   r¼   r'   r'   r(   rÀ   ¿  s      ÿrÀ   c                 K   s@   t ddddddgddddddgtddd	�}td
| ft |f|ŽŽS )Nr   r9   r   ru   r:   r´   rµ   rI   r¹   Údla46x_crÁ   r¼   r'   r'   r(   rÂ   Æ  s       þrÂ   c                 K   s@   t ddddddgddddddgtdd	d
�}td| ft |f|ŽŽS )Nr   r9   r   r   ru   r:   r´   rµ   rI   r¹   Údla60x_crÁ   r¼   r'   r'   r(   rÃ   Î  s       þrÃ   c                 K   s<   t ddddddgdddddd	gtd
�}td| ft |f|ŽŽS )Nr   r9   r   r   ru   r´   rµ   r¶   r·   r¾   Údla60rÁ   r¼   r'   r'   r(   rÄ   Ö  s     þrÄ   c                 K   s@   t ddddddgdddddd	gtdd
d�}td| ft |f|ŽŽS )Nr   r9   r   r   ru   r´   rµ   r¶   r·   rI   r¹   Údla60xrÁ   r¼   r'   r'   r(   rÅ   Þ  s       þrÅ   c                 K   s>   t ddddddgdddddd	gtd
d�}td| ft |f|ŽŽS )Nr   r   rI   r   ru   r´   rµ   r¶   r·   T©rp   r…   rq   r•   Údla102rÁ   r¼   r'   r'   r(   rÇ   æ  s      þrÇ   c                 K   sB   t ddddddgdddddd	gtddd
d�}td| ft |f|ŽŽS )Nr   r   rI   r   ru   r´   rµ   r¶   r·   T©rp   r…   rq   rD   rE   r•   Údla102xrÁ   r¼   r'   r'   r(   rÉ   î  s        þrÉ   c                 K   sB   t ddddddgdddddd	gtd
ddd�}td| ft |f|ŽŽS )Nr   r   rI   r   ru   r´   rµ   r¶   r·   r:   TrÈ   Údla102x2rÁ   r¼   r'   r'   r(   rÊ   ö  s        þrÊ   c                 K   s>   t ddddddgddddd	d
gtdd�}td| ft |f|ŽŽS )Nr   r9   r   ry   r   ru   r´   rµ   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}

ô