a
    þdŠ+  ã                   @   s˜   d dl Z d dl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	dd„ Z
G dd„ dejƒZG dd„ dejƒZdS )é    N)Ú
functionalc                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚHyperIQAzC
    Combine the hypernet and target network within a network.
    c                    s   t t| ƒ ¡  t|Ž | _d S ©N)Úsuperr   Ú__init__ÚHyperNetÚhypernet)ÚselfÚargs©Ú	__class__© úi/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/facexlib/assessment/hyperiqa_net.pyr      s    zHyperIQA.__init__c                 C   s6   |   |¡}t|ƒ}| ¡ D ]
}d|_q||d ƒ}|S )NFÚtarget_in_vec)r   Ú	TargetNetÚ
parametersZrequires_grad)r	   ÚimgZ
net_paramsZ
target_netÚparamÚpredr   r   r   Úforward   s    
zHyperIQA.forward©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__r   r   r   r   r      s   r   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r   a/  
    Hyper network for learning perceptual rules.
    Args:
        lda_out_channels: local distortion aware module output size.
        hyper_in_channels: input feature channels for hyper network.
        target_in_size: input vector size for target network.
        target_fc(i)_size: fully connection layer size of target network.
        feature_size: input feature map width/height for hyper network.
    Note:
        For size match, input args must satisfy: 'target_fc(i)_size * target_fc(i+1)_size' is divisible by 'feature_size ^ 2'. # noqa E501
    c	           	         sÀ  t t| ƒ ¡  || _|| _|| _|| _|| _|| _|| _	t
||ƒ| _t d¡| _t tjdddddtjddtjdd	dddtjddtjd	| jdddtjdd¡| _tj| jt| j| j |d
  ƒddd| _t | j| j¡| _tj| jt| j| j |d
  ƒddd| _t | j| j¡| _tj| jt| j| j |d
  ƒddd| _t | j| j¡| _tj| jt| j| j |d
  ƒddd| _t | j| j¡| _t | j| j¡| _t | jd¡| _d S )N)é   r   é   é   r   )r   r   )ÚpaddingT©Zinplaceé   é   é   )r   r   r   Ú
hyperInChnÚtarget_in_sizeÚf1Úf2Úf3Úf4Úfeature_sizeÚresnet50_backboneÚresÚnnZAdaptiveAvgPool2dÚpoolÚ
SequentialÚConv2dÚReLUÚconv1ÚintÚ	fc1w_convÚLinearÚfc1b_fcÚ	fc2w_convÚfc2b_fcÚ	fc3w_convÚfc3b_fcÚ	fc4w_convÚfc4b_fcÚfc5w_fcÚfc5b_fc)	r	   Úlda_out_channelsZhyper_in_channelsr%   Ztarget_fc1_sizeZtarget_fc2_sizeZtarget_fc3_sizeZtarget_fc4_sizer*   r   r   r   r   '   s4    *&þÿ***zHyperNet.__init__c                 C   sÊ  | j }|  |¡}|d  d| jdd¡}|  |d ¡ d| j||¡}|  |¡ d| j| jdd¡}|  |  	|¡ 
¡ ¡ d| j¡}|  |¡ d| j| jdd¡}|  |  	|¡ 
¡ ¡ d| j¡}	|  |¡ d| j| jdd¡}
|  |  	|¡ 
¡ ¡ d| j¡}|  |¡ d| j| jdd¡}|  |  	|¡ 
¡ ¡ d| j¡}|  |  	|¡ 
¡ ¡ dd| jdd¡}|  |  	|¡ 
¡ ¡ dd¡}i }||d< ||d< ||d< ||d< |	|d< |
|d	< ||d
< ||d< ||d< ||d< ||d< |S )Nr   éÿÿÿÿr   Úhyper_in_featÚtarget_fc1wÚtarget_fc1bÚtarget_fc2wÚtarget_fc2bÚtarget_fc3wÚtarget_fc3bÚtarget_fc4wÚtarget_fc4bÚtarget_fc5wÚtarget_fc5b)r*   r,   Úviewr%   r2   r$   r4   r&   r6   r.   Úsqueezer7   r'   r8   r9   r(   r:   r;   r)   r<   r=   r>   )r	   r   r*   Zres_outr   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   Úoutr   r   r   r   M   s6    
$zHyperNet.forwardr   r   r   r   r   r      s   &r   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )	Ú
Bottlenecké   r   Nc                    s˜   t t| ƒ ¡  tj||ddd| _t |¡| _tj||d|ddd| _t |¡| _	tj||d ddd| _
t |d ¡| _tjdd| _|| _|| _d S )	Nr   F)Úkernel_sizeÚbiasr#   ©rQ   Ústrider   rR   rP   Tr    )r   rO   r   r-   r0   r2   ÚBatchNorm2dÚbn1Úconv2Úbn2Úconv3Úbn3r1   ÚreluÚ
downsamplerT   )r	   ÚinplanesÚplanesrT   r\   r   r   r   r   {   s    zBottleneck.__init__c                 C   s~   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd urh|  |¡}||7 }|  |¡}|S r   )r2   rV   r[   rW   rX   rY   rZ   r\   )r	   ÚxZresidualrN   r   r   r   r   ‡   s    










zBottleneck.forward)r   N)r   r   r   Ú	expansionr   r   r   r   r   r   r   rO   x   s   rO   c                       s0   e Zd Zd	‡ fdd„	Zd
dd„Zdd„ Z‡  ZS )ÚResNetBackboneéè  c              
      s†  t t| ƒ ¡  d| _tjddddddd| _t d¡| _tj	dd| _
tjddd	d
| _|  |d|d ¡| _| j|d|d	 dd| _| j|d|d dd| _| j|d|d dd| _t tjddd	d	dddtjddd¡| _t d|¡| _t tjddd	d	dddtjddd¡| _t d|¡| _t tjddd	d	dddtjddd¡| _t d|¡| _tjddd| _t d||d  ¡| _d S )Né@   r#   é   r"   FrS   Tr    r   )rQ   rT   r   r   é€   )rT   é   r!   é   r   é    r   )r   ra   r   r]   r-   r0   r2   rU   rV   r1   r[   Z	MaxPool2dÚmaxpoolÚ_make_layerÚlayer1Úlayer2Úlayer3Úlayer4r/   Z	AvgPool2dÚ	lda1_poolr5   Úlda1_fcÚ	lda2_poolÚlda2_fcÚ	lda3_poolÚlda3_fcÚ	lda4_poolÚlda4_fc)r	   r?   Úin_chnÚblockÚlayersZnum_classesr   r   r   r       s6    þþþzResNetBackbone.__init__r   c              	   C   sž   d }|dks| j ||j krLt tj| j ||j d|ddt ||j ¡¡}g }| || j |||ƒ¡ ||j | _ td|ƒD ]}| || j |ƒ¡ q|tj|Ž S )Nr   F)rQ   rT   rR   )r]   r`   r-   r/   r0   rU   ÚappendÚrange)r	   rx   r^   ÚblocksrT   r\   ry   Úir   r   r   rj   Â   s    þzResNetBackbone._make_layerc                 C   sô   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |  |¡ | d¡d¡¡}|  	|¡}|  
|  |¡ | d¡d¡¡}|  |¡}|  |  |¡ | d¡d¡¡}|  |¡}|  |  |¡ | d¡d¡¡}t ||||fd¡}i }||d< ||d< |S )Nr   r@   r   rA   r   )r2   rV   r[   ri   rk   rp   ro   rL   Úsizerl   rr   rq   rm   rt   rs   rn   rv   ru   ÚtorchÚcat)r	   r_   Zlda_1Zlda_2Zlda_3Zlda_4ZvecrN   r   r   r   r   Ò   s"    







zResNetBackbone.forward)rb   )r   )r   r   r   r   rj   r   r   r   r   r   r   ra   ž   s   "
ra   c                 K   s   t | |tg d¢fi |¤Ž}|S )z#Constructs a ResNet-50 model_hyper.)r#   rP   é   r#   )ra   rO   )r?   rw   ÚkwargsÚmodelr   r   r   r+   ë   s    r+   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r   z0
    Target network for quality prediction.
    c                    s¢   t t| ƒ ¡  t t|d |d ƒt ¡ ¡| _t t|d |d ƒt ¡ ¡| _t t|d |d ƒt ¡ ¡| _	t t|d |d ƒt ¡ t|d	 |d
 ƒ¡| _
d S )NrB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   )r   r   r   r-   r/   ÚTargetFCZSigmoidÚl1Úl2Úl3Úl4)r	   Zparasr   r   r   r   ö   s$    þþþýzTargetNet.__init__c                 C   s0   |   |¡}|  |¡}|  |¡}|  |¡ ¡ }|S r   )r…   r†   r‡   rˆ   rM   )r	   r_   Úqr   r   r   r     s
    


zTargetNet.forwardr   r   r   r   r   r   ñ   s   r   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r„   zõ
    Fully connection operations for target net
    Note:
        Weights & biases are different for different images in a batch,
        thus here we use group convolution for calculating images in a batch with individual weights & biases.
    c                    s   t t| ƒ ¡  || _|| _d S r   )r   r„   r   ÚweightrR   )r	   rŠ   rR   r   r   r   r     s    zTargetFC.__init__c                 C   sÎ   |  d|jd |jd  |jd |jd ¡}| j  | jjd | jjd  | jjd | jjd | jjd ¡}| j  | jjd | jjd  ¡}tj|||| jjd d}|  |jd | jjd |jd |jd ¡S )Nr@   r   r   r"   r#   rP   )ÚinputrŠ   rR   Úgroups)rL   ÚshaperŠ   rR   ÚFZconv2d)r	   Zinput_Zinput_reZ	weight_reZbias_rerN   r   r   r   r   "  s    ,&ÿ zTargetFC.forwardr   r   r   r   r   r„     s   r„   )r   Ztorch.nnr-   r   rŽ   ÚModuler   r   rO   ra   r+   r   r„   r   r   r   r   Ú<module>   s   ^&M$