o
    )j>7                     @   sz   d dl Z d dlZd dlmZ ddlmZ ddgZG dd deZG dd	 d	ej	Z
G d
d dej	ZG dd dej	ZdS )    N   )SplAtConv2dResNet
Bottleneckc                   @   s   e Zd Zdd ZdS )DropBlock2Dc                 O   s   t )N)NotImplementedError)selfargskwargs r   o/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/animal_recognition/resnet.py__init__   s   zDropBlock2D.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                       s$   e Zd Z fddZdd Z  ZS )GlobalAvgPool2dc                    s   t t|   dS )z:Global average pooling over the input's spatial dimensionsN)superr   r   )r   	__class__r   r   r      s   zGlobalAvgPool2d.__init__c                 C   s   t j|d|ddS )Nr   r   )nnZ
functionalZadaptive_avg_pool2dviewsize)r   Zinputsr   r   r   forward   s
   zGlobalAvgPool2d.forward)r   r   r   r   r   __classcell__r   r   r   r   r      s    r   c                       sF   e Zd ZdZ														d fdd	Zd	d
 Z  ZS )r      r   N@   F        c                    s  t t|   t||d  | }tj||ddd| _||| _|| _|| _	|o-|dkp-|| _
|	| _| j
r@tjd|dd| _d}|dkrZt|d| _|dkrTt|d| _t|d| _|dkrqt||d||
|
|d|||||d| _n)|rtj||d||
|
|dd	| _||| _ntj||d||
|
|dd	| _||| _tj||d
 ddd| _||d
 | _|rddlm} || jj tjdd| _|| _|
| _|| _d S )Ng      P@r   F)kernel_sizebias   )paddingr   )r   strider!   dilationgroupsr   radixZrectifyrectify_avg
norm_layerdropblock_prob)r   r"   r!   r#   r$   r   r   r   )zeros_TZinplace)r   r   r   intr   Conv2dconv1bn1r(   r%   avd	avd_first	AvgPool2d	avd_layerr   
dropblock1
dropblock2
dropblock3r   conv2bn2conv3bn3Ztorch.nn.initr)   weightReLUrelu
downsampler#   r"   )r   inplanesplanesr"   r=   r%   cardinalitybottleneck_widthr/   r0   r#   is_firstrectified_convr&   r'   r(   
last_gammaZgroup_widthr)   r   r   r   r   "   s   

	
	
zBottleneck.__init__c                 C   s   |}|  |}| |}| jdkr| |}| |}| jr&| jr&| |}| |}| j	dkrD| 
|}| jdkr?| |}| |}| jrO| jsO| |}| |}| |}| jdkrc| |}| jd urm| |}||7 }| |}|S )Nr   r   )r-   r.   r(   r3   r<   r/   r0   r2   r6   r%   r7   r4   r8   r9   r5   r=   )r   xZresidualoutr   r   r   r   y   s2   



















zBottleneck.forward)r   Nr   r   r   FFr   FFFNr   F)r   r   r   	expansionr   r   r   r   r   r   r   r      s$    Wc                       s^   e Zd Zddddddddddddddddejf fdd	Z						
dddZdd Z  ZS )r   r   r   i  Fr   r   c                    s  || _ || _|	r|
d nd| _|| _|| _|| _|| _|| _tt	| 
  || _|| _|r1tj}ntj}|r:d|ini }|	r}t|d|
fddddd|||
tjdd	||
|
fddddd|||
tjdd	||
|
d fddddd|| _n|		dd
dddd|| _|| j| _tjdd	| _tjdddd| _| j|d|d |dd| _| j|d|d d|d| _|s|dkr| j|d|d dd||d| _| j|d|d dd||d| _n@|dkr| j|d|d dd||d| _| j|d|d dd||d| _n| j|d|d d||d| _| j|d|d d||d| _t | _|dkr/t|nd | _td|j  || _!| " D ]9}t#|tjre|j$d |j$d  |j% }|j&j'(dt)*d|  q@t#||rx|j&j'+d |j,j'-  q@d S )N   r   Zaverage_moder    r   F)r   r"   r!   r   Tr*      )r   r"   r!   r   )r'   rB      )r"   r'   r      )r"   r#   r'   r(   i   )r"   r'   r(   r   g       @)r    r   ).r@   rA   r>   avg_downrD   r%   r/   r0   r   r   r   rC   r&   r   r,   
Sequentialr;   r-   r.   r<   Z	MaxPool2dmaxpool_make_layerlayer1layer2layer3layer4r   avgpoolZDropoutdropZLinearrG   fcmodules
isinstancer   Zout_channelsr:   dataZnormal_mathsqrtZfill_r   Zzero_)r   blocklayersr%   r$   rA   Znum_classesZdilatedr#   Z	deep_stemZ
stem_widthrL   rC   r&   r/   r0   Z
final_dropr(   rD   r'   Z
conv_layerZconv_kwargsmnr   r   r   r      s  




	zResNet.__init__NTc	                 C   s  d }	|dks| j ||j krbg }
| jrB|dkr$|
tj||ddd n|
tjddddd |
tj| j ||j dddd n|
tj| j ||j d|dd |
|||j  tj|
 }	g }|dksl|dkr||| j |||	| j| j	| j
| j| jd|| j| j||| jd n,|dkr||| j |||	| j| j	| j
| j| jd|| j| j||| jd ntd	|||j | _ td|D ]}||| j || j| j	| j
| j| j|| j| j||| jd
 qtj| S )Nr   TF)r   r"   Z	ceil_modeZcount_include_pad)r   r"   r   rH   )r=   r%   r@   rA   r/   r0   r#   rB   rC   r&   r'   r(   rD   r   z=> unknown dilation size: {})r%   r@   rA   r/   r0   r#   rC   r&   r'   r(   rD   )r>   rG   rL   appendr   r1   r,   rM   r%   r@   rA   r/   r0   rC   r&   rD   RuntimeErrorformatrange)r   r\   r?   blocksr"   r#   r'   r(   rB   r=   Zdown_layersr]   ir   r   r   rO   2  s   	

zResNet._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}t	
|d}| jr;| |}| |}|S )Nr   )r-   r.   r<   rN   rP   rQ   rR   rS   rT   torchflattenrU   rV   )r   rE   r   r   r   r     s   










zResNet.forward)r   r   Nr   T)	r   r   r   r   ZBatchNorm2dr   rO   r   r   r   r   r   r   r      s6     
k)rZ   rf   Ztorch.nnr   Zsplatr   __all__objectr   Moduler   r   r   r   r   r   r   <module>   s   ~