a
    
dF                     @   s   d dl Z d dlmZ d dlm  mZ ddlm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S )    N   )ResNet18c                       s&   e Zd Zd fdd	Zdd Z  ZS )
ConvBNReLU   r   c                    s6   t t|   tj|||||dd| _t|| _d S )NFkernel_sizestridepaddingbias)superr   __init__nnConv2dconvBatchNorm2dbn)selfin_chanout_chanksr   r	   	__class__ W/var/www/html/stable-diffusion-webui/repositories/CodeFormer/facelib/parsing/bisenet.pyr   
   s    zConvBNReLU.__init__c                 C   s   |  |}t| |}|S N)r   Frelur   )r   xr   r   r   forward   s    
zConvBNReLU.forward)r   r   r   __name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s   r   c                       s$   e Zd Z fddZdd Z  ZS )BiSeNetOutputc                    s:   t t|   t||dddd| _tj||ddd| _d S Nr   r   r   r   r	   F)r   r
   )r   r$   r   r   r   r   r   conv_out)r   r   Zmid_chan	num_classr   r   r   r      s    zBiSeNetOutput.__init__c                 C   s   |  |}| |}||fS r   )r   r'   )r   r   featoutr   r   r   r      s    

zBiSeNetOutput.forwardr   r   r   r   r   r$      s   r$   c                       s$   e Zd Z fddZdd Z  ZS )AttentionRefinementModulec                    sP   t t|   t||dddd| _tj||ddd| _t|| _	t
 | _d S r%   )r   r+   r   r   r   r   r   
conv_attenr   bn_attenSigmoidsigmoid_attenr   r   r   r   r   r   r   $   s
    z"AttentionRefinementModule.__init__c                 C   sP   |  |}t|| dd  }| |}| |}| |}t||}|S )N   )	r   r   
avg_pool2dsizer,   r-   r/   torchmul)r   r   r)   attenr*   r   r   r   r   +   s    



z!AttentionRefinementModule.forwardr   r   r   r   r   r+   "   s   r+   c                       s$   e Zd Z fddZdd Z  ZS )ContextPathc                    sn   t t|   t | _tdd| _tdd| _tdddddd| _	tdddddd| _
tdddddd| _d S )N      i   r   r   r&   r   )r   r7   r   r   resnetr+   arm16arm32r   conv_head32conv_head16conv_avg)r   r   r   r   r   7   s    zContextPath.__init__c                 C   s   |  |\}}}| dd  \}}| dd  \}}| dd  \}	}
t|| dd  }| |}tj||	|
fdd}| |}|| }tj|||fdd}| |}| |}|| }tj|||fdd}| 	|}|||fS )Nr1   nearest)mode)
r:   r3   r   r2   r?   interpolater<   r=   r;   r>   )r   r   Zfeat8feat16feat32Zh8Zw8Zh16Zw16Zh32Zw32avgZavg_upZ
feat32_armZ
feat32_sumZ	feat32_upZ
feat16_armZ
feat16_sumZ	feat16_upr   r   r   r   @   s     




zContextPath.forwardr   r   r   r   r   r7   5   s   	r7   c                       s$   e Zd Z fddZdd Z  ZS )FeatureFusionModulec                    sv   t t|   t||dddd| _tj||d ddddd| _tj|d |ddddd| _tj	dd| _
t | _d S )	Nr   r   r&      Fr   T)inplace)r   rF   r   r   convblkr   r   conv1conv2ReLUr   r.   sigmoidr0   r   r   r   r   Y   s    zFeatureFusionModule.__init__c                 C   st   t j||gdd}| |}t|| dd  }| |}| |}| |}| 	|}t 
||}|| }|S )Nr   )dimr1   )r4   catrI   r   r2   r3   rJ   r   rK   rM   r5   )r   ZfspZfcpZfcatr)   r6   Z
feat_attenfeat_outr   r   r   r   a   s    




zFeatureFusionModule.forwardr   r   r   r   r   rF   W   s   rF   c                       s&   e Zd Z fddZdddZ  ZS )BiSeNetc                    sP   t t|   t | _tdd| _tdd|| _tdd|| _	tdd|| _
d S )Nr8   r9   @   )r   rQ   r   r7   cprF   ffmr$   r'   
conv_out16
conv_out32)r   r(   r   r   r   r   p   s    zBiSeNet.__init__Fc                 C   s  |  dd  \}}| |\}}}|}| ||}	| |	\}
}| |\}}| |\}}tj|
||fddd}
tj|||fddd}tj|||fddd}|rtj|||fddd}tj|||fddd}tj|||fddd}|
|||||fS |
||fS d S )Nr1   bilinearT)rA   align_corners)r3   rS   rT   r'   rU   rV   r   rB   )r   r   Zreturn_feathwZ	feat_res8Zfeat_cp8Z	feat_cp16Zfeat_spZ	feat_fuser*   r)   Zout16rC   Zout32rD   r   r   r   r   x   s     zBiSeNet.forward)Fr   r   r   r   r   rQ   n   s   rQ   )r4   torch.nnr   Ztorch.nn.functional
functionalr   r:   r   Moduler   r$   r+   r7   rF   rQ   r   r   r   r   <module>   s   "