
    7"j                          d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
Zd dlmZ d dlZd dlZ G d dej                         Z G d dej                         Zdd	Zed
k(  r edddd       yy)    N)
transformsutils)vgg16)Imagec                   J     e Zd Zd	 fd	Zd Zd Zd Zd Zd Zd Z	d Z
 xZS )
DiffJPEGc                 H   t         |           t        j                  g dg dg dg dg dg dg dg dg      j	                         d	z  |z  | _        t        j                  g d
g dg dg dg dg dg dg dg      j	                         d	z  |z  | _        d| _        y )N)      
   r
      (   3   =   )   r            :   <   7   )r      r
   r   r   9   E   8   )r            r   W   P   >   )   r   %   r   D   m   g   M   )r   #   r   @   Q   h   q   \   )1   r)   N   r   r&   y   x   e   )H   r-   _   b   p   d   r&   c   r7   )r   r"   r   /   r8   r8   r8   r8   )r"      r   B   r8   r8   r8   r8   )r   r   r   r8   r8   r8   r8   r8   )r9   r;   r8   r8   r8   r8   r8   r8   )r8   r8   r8   r8   r8   r8   r8   r8   g      ?)super__init__torchtensorfloatQ_table_lumQ_table_chromsoft_quant_scale)selfquality	__class__s     :/home/per/Documents/jpeg preprocessor/jpeg_preprocessor.pyr=   zDiffJPEG.__init__   s     <<,,,,..0/	)
 	 57S	 #	# #\\,,,,,,,,	+
 	 57S	 #	# !$    c                     |d d df   |d d df   |d d df   }}}d|z  d|z  z   d|z  z   }d|z  d|z  z
  d	|z  z   d	z   }d	|z  d
|z  z
  d|z  z
  d	z   }t        j                  |||gd      S )Nr         A`"?bX9?v/?gj+ſgJ4?      ?gs?gU0*д?dimr>   stack)rD   xrgbycbcrs           rG   rgb_to_ycbcrzDiffJPEG.rgb_to_ycbcr*   s    AaC&!AaC&!AaC&a1!GeAga'QY!CE)C/UVAXq(3.{{Ar2;A..rH   c                     |d d df   |d d df   |d d df   }}}|dz
  }|dz
  }|d|z  z   }|d|z  z
  d|z  z
  }|d|z  z   }t        j                  |||gd	      S )
Nr   rJ   rK   rO   g;On?gJOc?g|~!<?g'1Z?rP   rR   )rD   ycbcrrX   rY   rZ   rU   rV   rW   s           rG   ycbcr_to_rgbzDiffJPEG.ycbcr_to_rgb2   s    !A#Jac
E!A#Jr2#X#XbL
NWRZ'bL{{Aq!9!,,rH   c                    |j                   \  }}}}|j                  |||dz  d|dz  d      j                  dddddd      }| j                  d|j                        }|j                         }t        j                  ||      }t        j                  ||      }|j                  dddddd      j                  ||||      S 	N   r   rJ   rK            device	shapeviewpermute_dct_matrixrf   tr>   matmulreshape)	rD   rT   BCHWdct_mat	dct_mat_tx_dcts	            rG   dct_8x8zDiffJPEG.dct_8x8;   s    WW
1aFF1aAq!Q$*221Qq1Q?""1QXX"6IIK	Wa(UI.}}Qq1Qq)11!Q1==rH   c                    |j                   \  }}}}|j                  |||dz  d|dz  d      j                  dddddd      }| j                  d|j                        }|j                         }t        j                  ||      }t        j                  ||      }|j                  dddddd      j                  ||||      S r`   rg   )	rD   rT   ro   rp   rq   rr   rs   rt   x_idcts	            rG   idct_8x8zDiffJPEG.idct_8x8G   s    WW
1aFF1aAq!Q$*221Qq1Q?""1QXX"6IIK	i+fg.~~a!Aa*221aA>>rH   c                    t        j                  ||f|      }t        |      D ]  }t        |      D ]  }|dk(  rTt        j                  d|z        t        j
                  d|z  dz   |z  t        j                  z  d|z  z        z  |||f<   \t        j                  d|z        t        j
                  d|z  dz   |z  t        j                  z  d|z  z        z  |||f<     |S )Nre   r   rJ   rK   )r>   zerosrangenpsqrtcospi)rD   Nrf   matijs         rG   rk   zDiffJPEG._dct_matrixP   s    kk1a&0q 	LA1X L6!wwqs|bffac!eQYruu_ac5J.KKC!H!wwqs|bffac!eQYruu_ac5J.KKC!H	L	L 
rH   c                    |j                   \  }}}}|j                  |||dz  d|dz  d      j                  dddddd      }|j                  dddddd      }	||	z  }
t        j                  |
      }|
||
z
  j                         z   }t        j                  |      j                         |j                         z  }||	z  }|j                  dddddd      j                  ||||      }||fS )Nra   r   rJ   rK   rb   rc   rd   )
rh   ri   rj   r>   rounddetachabssumnumelrn   )rD   coefftablechannel_typero   rp   rq   rr   coeff_blocksrl   qhardsoft	bit_proxyouts                  rG   quantizezDiffJPEG.quantizeZ   s    [[
1azz!Q1aAq9AA!Q1aQRSJJq!Q1a(1{{1~D1H$$&&IIdO'')EKKM9	Qhkk!Q1a+33Aq!Q?I~rH   c                 (   | j                  |      }|d d ddf   |d d ddf   |d d ddf   }}}t        j                  j                  |d      }t        j                  j                  |d      }| j	                  |      }| j	                  |      }	| j	                  |      }
| j                  || j                  j                  |j                        d      \  }}| j                  |	| j                  j                  |j                        d      \  }}| j                  |
| j                  j                  |j                        d      \  }}||z   |z   }| j                  |      }| j                  |      }| j                  |      }t        j                  j                  |dd      }t        j                  j                  |dd      }t        j                  |||gd	      }| j                  |      }t        j                  |dd      |fS )
Nr   rJ   rK   rc   lumchromnearest)scale_factormoderP   )r[   nn
functional
avg_pool2drv   r   rA   torf   rB   ry   interpolater>   catr^   clamp)rD   rT   r]   rX   rY   rZ   cb_smallcr_smally_dctcb_dctcr_dcty_qbit_ycb_qbit_cbcr_qbit_cr	total_bity_reccb_reccr_rec	ycbcr_recrgb_recs                          rG   forwardzDiffJPEG.forwardj   s   !!!$!AaC%L%!A#,a!er2==++B2==++B2Qh'h']]5$*:*:*=*=ahh*GO
U}}VT-?-?-B-B299-MwWf}}VT-?-?-B-B299-MwWfFNV+	c"t$t$**6	*R**6	*RIIuff51=	##I.{{7Aq)944rH   U   )__name__
__module____qualname__r=   r[   r^   rv   ry   rk   r   r   __classcell__rF   s   @rG   r   r      s+    $6/-
>? 5rH   r   c                   $     e Zd Z fdZd Z xZS )
MS_SSIM_L2c                 "    t         |           y )N)r<   r=   )rD   rF   s    rG   r=   zMS_SSIM_L2.__init__   s    rH   c                    t         j                  j                  ||      }t        j                  g dg dg dg|j
                        j                         j                  dddd      t        j                  g dg dg dg|j
                        j                         j                  dddd      fd	}t         j                  j                   ||       ||            }|d
|z  z   S )N)r   rJ   )r   rK   re   rJ   rc   )r   r   r   )r   r   r   )rJ   rK   rJ   c                 &   d| d d ddf   z  d| d d ddf   z  z   d| d d ddf   z  z   }t         j                  j                  |d      }t         j                  j                  |d      }t        j                  |dz  |dz  z   d	z         S )
NrL   r   rJ   rM   rK   rN   rc   )paddinggư>)r   r   conv2dr>   r~   )imgimg_graygxgysobel_xsobel_ys       rG   edgesz!MS_SSIM_L2.forward.<locals>.edges   s    S1Q3Z'%AacE
*::U3q1u:=MMH%%h%CB%%h%CB::b!eb!emd233rH   g?)	r   r   mse_lossr>   r?   rf   r@   ri   l1_loss)rD   predtargetl2r   	loss_edger   r   s         @@rG   r   zMS_SSIM_L2.forward   s    ]]##D&1,,(;DKKPVVX]]^_`abcdef,,
77;DKKPVVX]]^_`abcdef	4
 MM))%+uV}E	C)O##rH   )r   r   r   r=   r   r   r   s   @rG   r   r      s    $rH   r   c           
      P   t        j                  |       j                  d      }t        j                  t        j
                  d      t        j                         g      } ||      j                  d      }|j                         j                         j                  d      }t        j                  |g|      }	t        d      }
t               }t        d       t!        |      D ]  }|	j#                           |
|      \  }} |||      }|}|||z  z   }|j%                          |	j'                          t)        j*                         5  |j-                  dd	       d d d        |d
z  dk(  st        d|dd|j/                         dd|j/                         d        |j                         j1                  d      j3                  d	dd      j5                         j7                         }|dz  j9                  t:        j<                        }t        j>                  |      jA                  |       t        d|        dd} ||       } ||      }t        d|dz  dd       t        d|dz  dd       t        ddd	||z  z
  z  dd       y # 1 sw Y   <xY w)NRGB)   r   r   T)lrr   )rE   zStarting optimisation...rJ   2   ziter 4dz | loss_id: z.4fz | loss_bit: rK      zOptimised image saved to c                     t        j                  |       }t        j                         }|j	                  |d|       |j                         S )NJPEG)formatrE   )r   openioBytesIOsavetell)img_pathrE   r   bufs       rG   	jpeg_sizez&preprocess_for_jpeg.<locals>.jpeg_size   s9    jj"jjlVW5xxzrH   zOriginal JPEG size: i   z.1fz KBzOptimised JPEG size: zReduction: r7   %r   )!r   r   convertr   ComposeResizeToTensor	unsqueezecloner   requires_grad_optimAdamr   r   printr|   	zero_gradbackwardstepr>   no_gradclamp_itemsqueezerj   cpunumpyastyper}   uint8	fromarrayr   )
image_pathoutput_pathnum_iterr   
weight_bitimg_pil	transform
img_tensorpreprocessed	optimizerjpeg_simloss_fnr   recbit_estimateloss_idloss_bitlosspreprocessed_imgr   	orig_sizenew_sizes                         rG   preprocess_for_jpegr     sl   jj$,,U3G"")$$ I 7#--a0J ##%,,.==dCL

L>b1I#HlG	
$%8_ d$\2\#z*h..]]_ 	&1%	&r6Q;E!B|GLLN3+?}X]]_]`Labcd $**,44Q7??!AFJJLRRT(3.66rxx@	OO$%**;7	%k]
34 *%I%H	 4 4C
89	!(4-!4C
89	KQ)!334S9
;<-	& 	&s   JJ%	__main__z	input.jpgzoutput_preprocessed.jpg   gMb`?)r   r   )i,  g{Gz?gMbP?)r>   torch.nnr   torch.optimr   torchvisionr   r   torchvision.modelsr   r   r}   PILr   r   osModuler   r   r  r    rH   rG   <module>r     sh       ) $   	 	
u5ryy u5t$ $(/=h z%>Y^_ rH   