o
    rqis#                     @   s   d Z ddlmZ ddlZddlmZ ddl	Z
ddlmZmZ ddlmZmZ ddlmZ g dZG dd	 d	Zd
d Zdd Z				d#ddZ				d#ddZd$ddZd%ddZd&ddZd'ddZd d! Zed"krp	 dS dS )(zv
CVPR 2020 submission, Paper ID 6791
Source code for 'Learning to Cartoonize Using White-Box Cartoon Representations'
    N)Paralleldelayed)colorsegmentation   )disc_sn)gjtY@g`"1]@gQ^@c                   @   sP   e Zd ZdddZdddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dS )Vgg19Nc                 C   s"   t j|ddd | _td d S )Nlatin1T)encodingZallow_picklezFinished loading vgg19.npy)nploaditem	data_dictprint)selfZvgg19_npy_path r   h/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/models/cv/cartoon/loss.py__init__   s   zVgg19.__init__Fc                 C   s  |d d }t jdd|d\}}}t jd|td  |td  |td  gd}| |d| _t j| j| _| | jd	| _	t j| j	| _
| | j
d
| _| | jd| _t j| j| _| | jd| _t j| j| _| | jd| _| | jd| _t j| j| _| | jd| _t j| j| _| | jd| _t j| j| _| | jd| _t j| j| _| | jd| _| | jd| _t j| j| _| | jd| _t j| j| _| | jd| _t j| j| _ | | j d| _!t j| j!| _"| | j"d| _#| j!S )Nr   g     _@   )axisnum_or_size_splitsvaluer      )r   valuesconv1_1conv1_2pool1conv2_1conv2_2pool2conv3_1conv3_2conv3_3conv3_4pool3conv4_1conv4_2conv4_3conv4_4pool4)$tfsplitconcatVGG_MEAN
conv_layerr   nnZreluZrelu1_1r   Zrelu1_2max_poolr   r   Zrelu2_1r   Zrelu2_2r   r    Zrelu3_1r!   Zrelu3_2r"   Zrelu3_3r#   Zrelu3_4r$   r%   Zrelu4_1r&   Zrelu4_2r'   Zrelu4_3r(   Zrelu4_4r)   )r   rgbZ
include_fcZ
rgb_scaledbluegreenredZbgrr   r   r   build_conv4_4   sL   zVgg19.build_conv4_4c                 C   s   t jj|g dg dd|dS )N)r   r   r   r   SAME)Zksizestridespaddingname)r*   r/   r0   )r   bottomr9   r   r   r   r0   J   s   zVgg19.max_poolc                 C   sl   t |' | |}t jj||g ddd}| |}t j||}|W  d    S 1 s/w   Y  d S )Nr   r   r   r   r6   )r8   )r*   variable_scopeget_conv_filterr/   Zconv2dget_biasbias_add)r   r:   r9   ZfiltconvZconv_biasesZbiasr   r   r   r.   R   s   

$zVgg19.conv_layerc           
      C   s   t |< |  }d}|dd  D ]}||9 }qt |d|g}| |}| |}t jt 	|||}	|	W  d    S 1 sDw   Y  d S )Nr   )
r*   r<   	get_shapeas_listZreshapeget_fc_weightr>   r/   r?   matmul)
r   r:   r9   shapedimdxweightsbiasesZfcr   r   r   fc_layerZ   s   


$zVgg19.fc_layerc                 C      t j| j| d ddS )Nr   filterr9   r*   Zconstantr   r   r9   r   r   r   r=   g      zVgg19.get_conv_filterc                 C   rM   )Nr   rK   rO   rP   rQ   r   r   r   r>   j   rR   zVgg19.get_biasc                 C   rM   )Nr   rJ   rO   rP   rQ   r   r   r   rD   m   rR   zVgg19.get_fc_weightN)F)__name__
__module____qualname__r   r5   r0   r.   rL   r=   r>   rD   r   r   r   r   r      s    

.r   c                 C   s   t t| d}||}||}||}|  dd  \}}	}
tj||}t	|||	 |
  }tj||}t	|||	 |
  }|| }|S )Nz	vgg19.npyr   )
r   ospjoinr5   rB   rC   r*   ZlossesZabsolute_differencereduce_mean)Z	model_dirZinput_photoZtransfer_resZinput_superpixelZ	vgg_modelZ	vgg_photoZ
vgg_outputZvgg_superpixelhwcZ	abs_photoZ
photo_lossZabs_superpixelZsuperpixel_lossZlossr   r   r   content_lossq   s   


r]   c                 C   sv   t ||ddd}t | | ddd}t|| \}}tt||dddd\}}tt||dddd\}}	|	| }
|| }|
|fS )	N   g?)repsr   TZ	disc_gray)scalepatchr9   Z	disc_blur)guided_filtercolor_shift
lsgan_lossr   )Zinput_cartoonZoutput_cartoonZ	blur_fakeZblur_cartoonZ	gray_fakeZgray_cartoonZd_loss_grayZg_loss_grayd_loss_blurg_loss_blurZ
sty_g_lossZ
sty_d_lossr   r   r   
style_loss   s,   

rh       Fdiscriminatorc                 C   sz   | |||||dd}| |||||dd}t j|}t j|}t t | }	t t |t d|   }
|
|	fS )NFr9   rb   ZreuseTg      ?)r*   r/   ZsigmoidrY   log)rj   realfakera   channelrb   r9   
real_logit
fake_logitrg   rf   r   r   r   gan_loss   s    rr   c                 C   sf   | |||||dd}| |||||dd}t |d d }	dt |d d t |d   }
|
|	fS )NFrk   Tr   r   g      ?)r*   rY   )rj   rm   rn   ra   ro   rb   r9   rp   rq   Zg_lossZd_lossr   r   r   re      s   re   c              	   C   s   |    dd \}}t| d d |d d d d d f | d d d || d d d d f  d }t| d d d d |d d d f | d d d d d || d d f  d }|| d| |  }|S )Nr   r   r   )rB   rC   r*   rY   )imageZk_sizerZ   r[   Ztv_hZtv_wZtv_lossr   r   r   total_variation_loss   s   FFrt   {Gz?c                 C   s   t | }tt jd|d |d df| jd|}t| || }t||| }t| | || ||  }t| |  || ||  }	||	|  }
||
|  }t|
|| }t||| }||  | }|S )Nr   r   )dtype)r*   rF   tf_box_filteronesrv   )rI   yr_   r`   Zx_shapeNZmean_xZmean_yZcov_xyZvar_xAbZmean_AZmean_boutputr   r   r   rc      s   
 rc   uniformc                 C   s  t j| ddd\}}}t j|ddd\}}}|dkr9t jjdgddd}	tjjdgddd}
tjjdgd	dd}n"|d
kr[t jjdgddd}	t jjdgddd}
t jjdgddd}|	| |
|  ||  |	|
 |  }|	| |
|  ||  |	|
 |  }||fS )Nr   )r   r   normalr   gv/?g?)rF   meanZstddevgbX9?gA`"?r~   gy&1?g1Zd?)rF   minvalmaxvalg^I+?gCl?gFx?gK7?)r*   r+   randomr   r   r~   )Zimage1Zimage2modeb1g1r1b2g2r2Zb_weightZg_weightZr_weightZoutput1Zoutput2r   r   r   rd      s"   

rd      c                    s@   fdd t | d }t|d fdd| D }t |S )Nc                    s,   t j|  ddddd}tj|| ddd} | S )Nr   
   T)Z
n_segmentssigmaZcompactnessZconvert2labZstart_labelZavgr   )kindZbg_label)r   Zslicr   Z	label2rgb)rs   Z	seg_label)seg_numr   r   process_slic   s   z'simple_superpixel.<locals>.process_slicr   )Zn_jobsc                 3   s    | ]	}t  |V  qd S rS   )r   ).0rs   )r   r   r   	<genexpr>  s    
z$simple_superpixel.<locals>.<genexpr>)r   rF   r   array)Zbatch_imager   Znum_jobZ	batch_outr   )r   r   r   simple_superpixel   s   
r   c                 C   sv   |    d }dd| d d  }|td| d d| d |df }t|tj}tj	| |g dd}|S )NrA   r   r   r;   r6   )
rB   rC   r   rx   r   ZastypeZfloat32r*   r/   Zdepthwise_conv2d)rI   r_   chweightZ
box_kernelr}   r   r   r   rw     s   &rw   __main__)r   ri   Frj   )r   )ru   )r~   )r   )__doc__Zos.pathpathrW   numpyr   Zscipy.statsstatsstZ
tensorflowr*   Zjoblibr   r   Zskimager   r   networkr   r-   r   r]   rh   rr   re   rt   rc   rd   r   rw   rT   r   r   r   r   <module>   s<    ^






	