o
    ॵimM                     @   sn  d dl Z d dlmZ d dlZd dlZd dlmZ eja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 Zd4ddZd4ddZdd Zd4ddZd4ddZd4ddZd4ddZd4d d!Zd4d"d#Zd$d% ZG d&d' d'ej	Zd(d) ZG d*d+ d+ej	ZG d,d- d-ej	Zd.d/ ZG d0d1 d1ej	Z d2d3 Z!dS )5    N)join)nnc                       s(   e Zd Zd fdd	ZdddZ  ZS )	
BasicBlock   c              	      sn   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inplacer   )superr   __init__r   Conv2dconv1	BatchNormbn1ReLUreluconv2bn2r	   )selfinplanesplanesr	   r   	__class__ a/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/ocr_utils/model_dla34.pyr      s.   


zBasicBlock.__init__Nc                 C   sT   |d u r|}|  |}| |}| |}| |}| |}||7 }| |}|S N)r   r   r   r   r   r   xresidualoutr   r   r   forward)   s   





zBasicBlock.forwardr   r   r    __name__
__module____qualname__r   r%   __classcell__r   r   r   r   r      s    r   c                       s,   e Zd ZdZd fdd	Zd	ddZ  ZS )

Bottleneck   r   c              	      s   t t|   t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   Fr   r   r   r   Tr   )r   r,   r   	expansionr   r   r   r   r   r   r   conv3bn3r   r   r	   )r   r   r   r	   r   r/   bottle_planesr   r   r   r   =   s.   



zBottleneck.__init__Nc                 C   r   |d u r|}|  |}| |}| |}| |}| |}| |}| |}| |}||7 }| |}|S r    r   r   r   r   r   r0   r1   r!   r   r   r   r%   S      








zBottleneck.forwardr&   r    )r(   r)   r*   r/   r   r%   r+   r   r   r   r   r,   :   s    r,   c                       s0   e Zd ZdZdZd	 fdd	Zd
ddZ  ZS )BottleneckXr-       r   c              
      s   t t|   tj}|| d }tj||ddd| _t|| _tj||d||d||d| _	t|| _
tj||ddd| _t|| _tjdd| _|| _d S )	Nr7   r   Fr.   r   )r   r	   r
   r   r   groupsTr   )r   r6   r   cardinalityr   r   r   r   r   r   r   r0   r1   r   r   r	   )r   r   r   r	   r   r9   r2   r   r   r   r   l   s0   

	

zBottleneckX.__init__Nc                 C   r3   r    r4   r!   r   r   r   r%      r5   zBottleneckX.forwardr&   r    )r(   r)   r*   r/   r9   r   r%   r+   r   r   r   r   r6   h   s
    r6   c                       $   e Zd Z fddZdd Z  ZS )Rootc                    sP   t t|   tj||ddd|d d d| _t|| _tjdd| _	|| _
d S )Nr   Fr-   )r	   r   r
   Tr   )r   r;   r   r   r   convr   bnr   r   r#   )r   in_channelsout_channelsr   r#   r   r   r   r      s   


zRoot.__init__c                 G   s@   |}|  t|d}| |}| jr||d 7 }| |}|S )Nr   r   )r<   torchcatr=   r#   r   )r   r"   childrenr   r   r   r%      s   

zRoot.forwardr'   r   r   r   r   r;      s    r;   c                       s4   e Zd Z						d	 fdd	Zd
ddZ  ZS )Treer   Fr   c                    s  t t|   |dkrd| }|r||7 }|dkr,|||||	d| _|||d|	d| _n!t|d ||||d||	|
d	| _t|d ||||| ||	|
d| _|dkrYt||||
| _|| _|| _d | _	d | _
|| _|dkrttj||d| _	||krttj||ddddt|| _
d S d S )	Nr   r-   r   )r   )root_dimroot_kernel_sizer   root_residualr	   Fr   r	   r   )r   rC   r   tree1tree2r;   root
level_rootrD   
downsampleprojectlevelsr   	MaxPool2d
Sequentialr   r   )r   rO   blockr>   r?   r	   rL   rD   rE   r   rF   r   r   r   r      sp   

	
zTree.__init__Nc                 C   s   |d u rg n|}| j r|  |n|}| jr| |n|}| jr$|| | ||}| jdkr@| |}| j||g|R  }|S || | j||d}|S )Nr   )rB   )rM   rN   rL   appendrI   rO   rJ   rK   )r   r"   r#   rB   bottomx1x2r   r   r   r%      s   



zTree.forward)r   Fr   r   r   F)NNr'   r   r   r   r   rC      s    <rC   c                       sF   e Zd Zdeddddf fdd	ZdddZdd	d
Zdd Z  ZS )DLAi  F   c	              
      s  t t|   || _|| _|| _ttjd|d dddddt	|d tj
dd| _| |d |d |d | _| j|d |d |d d	d
| _t|d	 ||d |d	 d	d|d| _t|d ||d	 |d d	d|d| _t|d ||d |d d	d|d| _t|d ||d |d d	d|d| _t|| _tj|d |ddddd| _|  D ]5}	t|	tjr|	jd |	jd  |	j }
|	jjdtd|
  qt|	t	r|	jj d |	j!j"  qd S )Nr   r   rX   r   Fr   r	   r
   r   Tr   r-   rG   )rL   rF                @)#r   rW   r   channelsreturn_levelsnum_classesr   rQ   r   r   r   
base_layer_make_conv_levellevel0level1rC   level2level3level4level5	AvgPool2davgpoolfcmodules
isinstancer   r?   weightdatanormal_mathsqrtfill_r   zero_)r   rO   r^   r`   rR   residual_rootr_   	pool_sizelinear_rootmnr   r   r   r     s   		
zDLA.__init__r   c           	   
   C   s   d }|dks
||kr t t j||dt j||ddddt|}g }||||||d td|D ]
}|||| q2t j| S )Nr   rG   FrH   )rM   )r   rQ   rP   r   r   rS   range)	r   rR   r   r   blocksr	   rM   layersir   r   r   _make_levelI  s   

zDLA._make_levelc                 C   s\   g }t |D ]"}|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   )rz   extendr   r   r   r   rQ   )r   r   r   convsr	   r   rl   r}   r   r   r   rb   Z  s"   

zDLA._make_conv_levelc                 C   sn   g }|  |}tdD ]}t| d||}|| q| jr"|S | |}| |}||	dd}|S )N   zlevel{}r   r\   )
ra   rz   getattrformatrS   r_   rj   rk   viewsize)r   r"   yr}   r   r   r   r%   l  s   


zDLA.forward)r   r&   )	r(   r)   r*   r   r   r~   rb   r%   r+   r   r   r   r   rW      s    
G
rW   c                 K   s"   t g dg dfdti|}|S )Nr   r   r   r-   r-   r   )   r7   @            rR   )rW   r   
pretrainedkwargsmodelr   r   r   dla34|  s   r   c                 K   (   dt _tg dg dfdt i|}|S Nr-   r   r   r7   r   r   r   r   rR   r,   r/   rW   r   r   r   r   dla46_c     r   c                 K   r   r   r6   r/   rW   r   r   r   r   dla46x_c  r   r   c                 K   r   )Nr-   r   r   r   r-   r   r   r   rR   r   r   r   r   r   dla60x_c  r   r   c                 K   r   Nr-   r   r   r7   r   r   r   i   rR   r   r   r   r   r   dla60  r   r   c                 K   r   r   r   r   r   r   r   dla60x  r   r   c                 K   *   dt _tg dg dft dd|}|S Nr-   r   r   r   r   rZ   r   r   TrR   ru   r   r   r   r   r   dla102     r   c                 K   r   r   r   r   r   r   r   dla102x  r   r   c                 K   r   )Nr   r   r   Tr   )r6   r9   rW   r   r   r   r   dla102x2  r   r   c                 K   r   )Nr-   )r   r   r-   r   r[   r   r   Tr   r   r   r   r   r   dla169  r   r   c                 C   s   | a | t_ d S r    )r   dla)r=   r   r   r   set_bn  s   
r   c                       r:   )Identityc                    s   t t|   d S r    )r   r   r   )r   r   r   r   r     s   zIdentity.__init__c                 C   s   |S r    r   )r   r"   r   r   r   r%     s   zIdentity.forwardr'   r   r   r   r   r     s    r   c                 C   s   | j j}t|dd }d| d |d  d|  }t|dD ](}t|dD ]}dt|| |  dt|| |   |dd||f< q,q#td|dD ]}|ddd d d d f ||dd d d d f< qTd S )Nr-   r   r]   r   r   )rn   ro   rq   ceilr   rz   fabs)upwfcr}   jr   r   r   fill_up_weights  s   *.r   c                       r:   )IDAUpc                    s  t t|   || _|| _t|D ]X\}}||krt }nttj	||ddddt
|tjdd}t|| }|dkr@t }	ntj|||d ||d d|dd}	t|	 t| d	t| | t| d
t| |	 qtdt|D ]&}ttj	|d ||d|d ddt
|tjdd}
t| dt| |
 qq|  D ]5}t|tj	r|jd |jd  |j }|jjdtd|  qt|t
r|jjd |jj  qd S )Nr   FrH   Tr   r-   r   )r	   r
   output_paddingr8   r   proj_up_rY   node_r]   )r   r   r   r^   out_dim	enumerater   r   rQ   r   r   r   intConvTranspose2dr   setattrstrrz   lenrl   rm   r   r?   rn   ro   rp   rq   rr   rs   r   rt   )r   node_kernelr   r^   
up_factorsr}   r   projr   r   noderx   ry   r   r   r   r     s`   	
zIDAUp.__init__c           	      C   s   t | jt |ksJ dt | jt |t|}t|D ]\}}t| dt| }t| dt| }|||||< q|d }g }tdt |D ]}t| dt| }|t	||| gd}|
| qJ||fS )Nz{} vs {} layersr   r   r   r   r   )r   r^   r   listr   r   r   rz   r@   rA   rS   )	r   r|   r}   lupsamplerN   r"   r   r   r   r   r   r%     s   zIDAUp.forwardr'   r   r   r   r   r     s    /r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )DLAUpr   r-   rZ      r   Nc                    s   t t|   |d u r } | _t  tj|td}tt	 d D ]C}| d t
| d|td  |d  |d  |   | |d d <  fdd d d  D |d d < q#d S )N)dtyper   r-   ida_{}r   c                    s   g | ]}  qS r   r   ).0_r^   r   r   r   
<listcomp><      z"DLAUp.__init__.<locals>.<listcomp>)r   r   r   r^   r   nparrayr   rz   r   r   r   r   )r   r^   scalesr>   r}   r   r   r   r   .  s"   

.zDLAUp.__init__c                 C   sn   t |}t|dksJ tt|d D ] }t| d|}||| d d  \}}||| d d < q|S )Nr   r   r-   )r   r   rz   r   r   )r   r|   r}   idar"   r   r   r   r   r%   >  s   zDLAUp.forward)r   Nr'   r   r   r   r   r   ,  s    r   c                 C   sJ   |   D ]}t|tjr"tjj|jdd |jd ur"tj|jd qd S )NgMbP?)stdr   )	rl   rm   r   r   initrp   rn   r   	constant_)r|   rx   r   r   r   fill_fc_weightsH  s   
r   c                       s.   e Zd Z				d	 fdd	Zdd Z  ZS )
DLASegr   FrZ   r   c           
         s\  t t|   |dv sJ ddddd| _tt|| _t | |dd| _	| j	j
}dd tt|| jd  D }t|| jd  |d	| _| jD ]a}| j| }|d
krttj|| j |ddddtjddtj||ddd
dd}	d|v r|	d jjd n#t|	 ntj|| j |ddd
dd}	d|v r|	jjd nt|	 | ||	 qJd S )N)r-   rZ   r   r   r-   r   )hmv2cc2vregT)r   r_   c                 S   s   g | ]}d | qS )r-   r   )r   r}   r   r   r   r   ^  r   z#DLASeg.__init__.<locals>.<listcomp>)r   r   r   r   )r   r
   r   r   rY   r   r\   gQ)r   r   r   headsr   r   log2first_levelglobalsbaser^   rz   r   r   dla_upr   rQ   r   r   r   ro   rs   r   __setattr__)
r   	base_namer   
down_ratio	head_convr^   r   headclassesrk   r   r   r   r   R  s^    



zDLASeg.__init__c                 C   sF   |  |}| || jd  }i }| jD ]}| ||||< q|gS r    )r   r   r   r   __getattr__)r   r"   retr   r   r   r   r%     s   

zDLASeg.forward)r   FrZ   r   r'   r   r   r   r   r   P  s    2r   c                  C   s
   t  } | S r    )r   )r   r   r   r   TableRecModel  s   r   r    )"rq   os.pathr   numpyr   r@   r   BatchNorm2dr   Moduler   r,   r6   r;   rC   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s<   *.0N|





	
	
			B=