o
    2h                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlm  m	Z
 d dlmZ d dlmZ d dlmZ d dlmZ dddd	Zd
Zd?ddZd?ddZd?ddZdd Zdd Z							d@ddZd ddZh dZ			 	dAddZ		 	dBdd Zd!d" Zd#d$ Zd%d& Z d'd( d)d( d*d( ee d+Z!d,d- Z"d.d/ Z#d0d1 Z$	dCd2d3Z%	dDd6d7Z&e' d8d9 Z(	:	;		<			dEd=d>Z)dS )F    N)backendconvert_to_tensor)
get_device)	draw_seedbilinearznearest-exactbicubic)r   nearestr   )lanczos3lanczos5c                 C   s   t | } t|}| jdvrtd| j |dkrdnd}| j| dvr-td| j | j| dkrU| j|d	\}}}d
| d|  d|  | j} | j	|d	} | S | 
 } | S )N      yInvalid images rank: expected rank 3 (single image) or rank 4 (batch of images). Received input with shape: images.shape=channels_first)   r   zaInvalid channel size: expected 3 (RGB) or 1 (Grayscale). Received input with shape: images.shape=r   dimgŏ1w-!?gbX9?gv/?)r   r   standardize_data_formatndim
ValueErrorshapeunbindtodtype	unsqueezeclone)imagesdata_formatchannel_axisrgb r%   X/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/torch/image.pyrgb_to_grayscale   s,   

 r'   c           	      C   s   t | } | j}t|}|dkrdnd}t| jdvr#td| j t|s2tdt| t	
|j}t	t	| |k d| } t	| g d|\}}}t	||}t	||}t	||}d	d
 }t	j|||||d} | S )Nchannels_lastr   r   r   r   CInvalid images dtype: expected float dtype. Received: images.dtype=        r   r   r   c                 S   s   t t | ||}t t | ||}|| }t |dk|d}t |dk|d}t |dk|| d}dd|  }	t ||k|	||   d |	| |  d }
t || k|	||  |
}
t |dk|
d|
dk |
j }
|
||fS )Nr         ?r*         @gUUUUUU?gUUUUUU?)torchmaximumminimumwherer   r   )r"   r#   r$   valuer0   range_
safe_value
safe_range
saturationnormhuer%   r%   r&   rgb_planes_to_hsv_planesM   s   "
z,rgb_to_hsv.<locals>.rgb_planes_to_hsv_planesaxis)r   r   r   r   lenr   r   is_float_dtypestandardize_dtyper.   finfoepsr1   abssplitsqueezestack)	r   r    r   channels_axisr@   redgreenbluer9   r%   r%   r&   
rgb_to_hsv5   s6   

rI   c                 C   s   t | } | j}t|}|dkrdnd}t| jdvr#td| j t|s2tdt| t	
| g d|\}}}t	||}t	||}t	||}dd	 }t	j|||||d
} | S )Nr(   r   r   r   r   r)   r+   c                 S   s   t | dd }t t |d d dd}t dt |d  dd}t dt |d  dd}d| }||||   }||||   }	||||   }
||	|
fS )Nr,   r-   g      @r*   g       @g      @)r.   	remaindercliprA   )r8   r6   r2   dhdrdgdbone_minus_srF   rG   rH   r%   r%   r&   hsv_planes_to_rgb_planes}   s   
z,hsv_to_rgb.<locals>.hsv_planes_to_rgb_planesr:   )r   r   r   r   r<   r   r   r=   r>   r.   rB   rC   rD   )r   r    r   rE   r8   r6   r2   rQ   r%   r%   r&   
hsv_to_rgbg   s2   

rR   c                 C   sR   d}| j dk r| jdd} d}| j}d}||vr#d}|d }| |} | |||fS )NFr   r   r   T)r   r   r   r   )image
req_dtypesneed_squeeze	out_dtype	need_cast	req_dtyper%   r%   r&   _cast_squeeze_in   s   

rY   c                 C   sH   |r| j dd} |r"|tjtjtjtjtjfv rt| } | |} | S )Nr   r   )	rC   r.   uint8int8int16int32int64roundr   )rS   rW   rU   rV   r%   r%   r&   _cast_squeeze_out   s   

r`   Fconstantr*   c	                 C   sl  t |}|tv rtd| d|tvrtdt d| |dkr*td| |r2|r2tdt|dks?td	| t|}t| } | jd
vrTtd| j	 t
| tjtjg\} }	}
}|dkrj| d} |r| j	}|d |d }}|\}}tt|| | }tt||d}tt|| | }tt||d}tt|| d }tt|| d }| d d d d ||| ||| f } n|rq| j	}|d |d }}|\}}tt|| | }t||}tt|| | }t||}tt|| d }tt|| d }| j	d }| j	d }|dkrDtjtj||||f| j| jd| | tj||||f| j| jd| gdd}n| }|dkrotjtj||||f| j| jd|tj||||f| j| jd| gdd}|} |r{|dvr{d}|dv rdnd }tj| |t| ||d}|dkr|tjkr|jddd}|dkr|d}t||	|
|d}|S )NzeResizing with Lanczos interpolation is not supported by the PyTorch backend. Received: interpolation=.<Invalid value for argument `interpolation`. Expected of one . Received: interpolation=ra   z\Invalid value for argument `fill_mode`. Only `'constant'` is supported. Received: fill_mode=zIOnly one of `pad_to_aspect_ratio` & `crop_to_aspect_ratio` can be `True`.   zPArgument `size` must be a tuple of two elements (height, width). Received: size=r   r   r(   r   r   r   re   r   r   r   r   devicer:   r   )r   r   F)sizemodealign_corners	antialiasr      )minmaxr   re   r   r   )rW   rU   rV   )r   r   UNSUPPORTED_INTERPOLATIONSr   RESIZE_INTERPOLATIONSr<   tupler   r   r   rY   r.   float32float64permuteintfloatrp   ro   catonesr   ri   FinterpolaterZ   clampr`   )r   rj   interpolationrm   crop_to_aspect_ratiopad_to_aspect_ratio	fill_mode
fill_valuer    rW   rU   rV   r   heightwidthtarget_heighttarget_widthcrop_height
crop_widthcrop_box_hstartcrop_box_wstart
pad_height	pad_widthimg_box_hstartimg_box_wstart
batch_sizechannels
padded_imgrl   resizedr%   r%   r&   resize   s  
















r   r   )r	   r   >   wrapmirrorr	   reflectra   c                    s  t |}t vrtdtt  d tvr'tdt d ttjdvr<tdj	 jdvrItdj	 d	}jd
krXj
ddd}jdkrcj
dd|dkrldj	d }tjfddj	dd  D ddi}tjdd |D dd}	t|	|ddddf}	d d df  }
d d df  }d d df  }d d df  }|d d df< |d d df< |
d d df< |d d df< tjjjg ddddt|d
d
fd d dddf  }tjjj|g dd}dd d dddf< td|	 tj ddd  tj|g |j	dddR d 7  t fd!dttD }|dkr]|d"}|rf|jdd}|S )#Nrc   rd   8Invalid value for argument `fill_mode`. Expected of one . Received: fill_mode=r   r   )r   re   zInvalid transform rank: expected rank 1 (single transform) or rank 2 (batch of transforms). Received input with shape: transform.shape=Fr   r   r   Tr   r   rq   c                    s    g | ]}t j| j jd qS )rh   )r.   aranger   ri   ).0rj   )	transformr%   r&   
<listcomp>  s    z$affine_transform.<locals>.<listcomp>indexingijc                 S   s   g | ]	}t j|d dqS )r   r   )r.   r   )r   xr%   r%   r&   r     s    r   re   r      )r   r   r   r   ra   )padrk   r2   )r   zBhwij, Bjk -> Bhwik)sourcedestination)r   c              	      s*   g | ]}t |  | t d qS )orderr   r   map_coordinatesAFFINE_TRANSFORM_INTERPOLATIONS)r   i)coordinatesr   r   r   r   r%   r&   r     s    rf   )r   r   r   keysr   setAFFINE_TRANSFORM_FILL_MODESr   r   r   r   rw   r.   meshgridconcatenatetiler   nn
functionalr   reshapeeinsummoveaxisrD   ranger<   rC   )r   r   r   r   r   r    rU   r   r   indicesa0a2b1b2offsetaffinedr%   )r   r   r   r   r   r   r&   affine_transformV  s   








&


r   c               	   C   s   t |}t| } tj|tjd}tj|tjd}|t vr-tdt	t  d| | j
dvr:td| j |jdd  dksI| dvrQtd	|j |jdd  dks`| dvrhtd
|j |j|jkrztd|j d|j d}| j
dkr| jdd} d}|j
dkr|jdd}|j
dkr|jdd}|dkr| d} | j\}}}	}
t||}| dkr|d}|jd dkr|dkr||d}tjtj|	tj| jdtj|tj| jddd\}}tj|||	|
g| jd}t|D ]p}|| \}}}}}}}}|| ||  d }|| ||  | | }|| ||  | | }tj| | gdd}g }t|
D ]#}| |d d d d |f }t||t| d|d}||||	 q=tj|dd||< q|dkru|d}|r~|jdd}|S )Nr   rc   rd   r   r   rg   )r   re   )re   r   zfInvalid start_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: zdInvalid end_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: zRstart_points and end_points must have the same shape. Received start_points.shape=z, end_points.shape=Fr   r   r   Tre   r   rq   r   rh   xyr   ri   r,   ra   r   r   rf   )r   r   r   r.   tensorru   r   r   r   r   r   r   r   r   rw   compute_homography_matrixrepeatr   r   ri   emptyr   rD   flattenr   appendr   rC   ) r   start_points
end_pointsr   r   r    rU   r   r   r   r   
transformsgrid_xgrid_youtputr   r   a1r   a3a4a5a6a7denomx_iny_incoordsmapped_channelschannelchannel_imgmapped_channelr%   r%   r&   perspective_transform  s   











r   c                 C   s  t | tjd} t |tjd}| d d ddf | d d ddf }}| d d ddf | d d ddf }}| d d ddf | d d ddf }}| d d ddf | d d ddf }}	|d d ddf |d d ddf }
}|d d ddf |d d ddf }}|d d ddf |d d ddf }}|d d ddf |d d ddf }}tjtj|
|t|
t|
t|
t|
| |
 | | gddtjt|
t|
t|
|
|t|
| |
 | | gddtj||t|t|t|t|| | | | gddtjt|t|t|||t|| | | | gddtj||t|t|t|t|| | | | gddtjt|t|t|||t|| | | | gddtj||t|t|t|t|| | | | gddtjt|t|t|||t||	 | |	 | gddgdd}tj||||||||	gddd}tj||}|	dd}|S )	Nr   r   r   re   r   r   r      )
r   r.   ru   rD   	ones_like
zeros_liker   linalgsolver   )r   r   start_x1start_y1start_x2start_y2start_x3start_y3start_x4start_y4end_x1end_y1end_x2end_y2end_x3end_y3end_x4end_y4coefficient_matrixtarget_vectorhomography_matrixr%   r%   r&   r   +  s   &&&&&&&&







jn
r   c                 C   s"   |d }t | | d|  | S )Nr   re   )r.   rA   )indexrj   sr%   r%   r&   _mirror_index_fixer  s   r   c                 C   s&   t td|  d d| d d dS )Nre   r   )r.   floor_divider   r   rj   r%   r%   r&   _reflect_index_fixer  s   r   c                 C      t | d|d S Nr   r   r.   rK   r   r%   r%   r&   <lambda>      r   c                 C   r   r   r   r   r%   r%   r&   r     r  c                 C   s   | | S Nr%   r   r%   r%   r&   r     s    )ra   r	   r   r   r   c                 C   s   t | st | sdS dS )NTF)r.   is_floating_point
is_complex)ar%   r%   r&   _is_integer  s   r  c                 C   s,   t | r| nt| } | tj}|dfgS Nr   )r  r.   r_   r   r]   )
coordinater   r%   r%   r&   _nearest_indices_and_weights  s   
r	  c                 C   s:   t | }| | }d| }|t j}||f|d |fgS r  )r.   floorr   r]   )r  lowerupper_weightlower_weightr   r%   r%   r&   _linear_indices_and_weights  s
   
r  c                 C   sH  t | }dd |D }t|t|jkr!td|j dt| t|d jdk r=t|}|f|d j }td| t|ttfrLt|rLt|}t|t|jkrdtdt| d	t|j t	|}	|	d u r{td
t
t  d| |dkrt}
n|dkrt}
ntd|dkrdd }ndd }g }t||jD ](\}}|
|}g }|D ]\}}|	||}|||}||||f q|| qg }tj| D ]3}t| \}}}tdd |D r|| }nttj|}t||| |}|ttj||  qttj|}t|rt|r|nt|}||jS )Nc                 S   s   g | ]}t |qS r%   r   )r   cr%   r%   r&   r     s    z#map_coordinates.<locals>.<listcomp>zaFirst dim of `coordinates` must be the same as the rank of `inputs`. Received inputs with shape: z and coordinate leading dim of r   r   zOInvalid coordinates rank: expected at least rank 2. Received input with shape: z;coordinates must be a sequence of length inputs.shape, but z != z8Invalid value for argument `fill_mode`. Expected one of r   z+map_coordinates currently requires order<=1ra   c                 S   s   d| k| |k @ S )Nr   r%   r   r%   r%   r&   is_valid  s   z!map_coordinates.<locals>.is_validc                 S   s   dS )NTr%   r   r%   r%   r&   r    s   c                 s   s    | ]}|d u V  qdS )TNr%   )r   validr%   r%   r&   	<genexpr>+  s    z"map_coordinates.<locals>.<genexpr>)r   r<   r   r   
isinstancerx   ry   r  _INDEX_FIXERSgetr   r   r	  r  NotImplementedErrorzipr   	itertoolsproductall	functoolsreduceoperatorand_r.   r1   muladdr_   r   r   )inputsr   r   r   r   	input_arrcoordinate_arrsr   r   index_fixer
interp_funr  valid_1d_interpolationsr  rj   interp_nodesvalid_interpr   weightfixed_indexr  outputsitemsr   
validitiesweightscontribution	all_validresultr%   r%   r&   r     s   







r   r   r   r,   r,   c           
      C   s   dd }t | } t |}t |}| j}t| jdvr"td| j d}| jdkr1| jdd} d	}|d
kr=| dddd} | jd }||||}||d|d |d }t	j
jj| |dt|d d |d}	|d
krr|	dddd}	|rz|	jdd}	|	S )Nc                    s>   fdd  fdd}|| |}| dd| d | d }|S )Nc                    sB   t j|  |jd| d d  }t d|| d  }|t | S )Nrh   r   re   g      )r.   r   ri   expsum)rj   sigmar   kernel1dr   r%   r&   _get_gaussian_kernel1d>  s   
zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel1dc                    s0    | d |d } | d |d }t ||S r   )r.   outer)rj   r6  
kernel1d_x
kernel1d_y)r8  r%   r&   _get_gaussian_kernel2dF  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel2dr   r   )view)kernel_sizer6  r   r<  kernelr%   )r8  r   r&   _create_gaussian_kernel=  s
   
z.gaussian_blur.<locals>._create_gaussian_kernelr   r   Fr   r   r   Tr(   r   re   )stridepaddinggroups)r   r   r<   r   r   r   r   rw   expandr.   r   r   conv2drx   rC   )
r   r>  r6  r    r@  r   rU   num_channelsr?  blurred_imagesr%   r%   r&   gaussian_blur:  s@   

rH  c                 C   sB   t | \}}t }|dkrd S tjt d}|t||  |S )Nmetar   )r   r   r.   	Generatormanual_seedrx   )seed
first_seedsecond_seedri   	generatorr%   r%   r&   torch_seed_generatorz  s   rP        4@      @r   c              
      s  t |}t vrtdtt  d tvr'tdt d tjdvr6tdj t	t	|}t	|}j
}td| dB td| dB f}	d	}
jd
krdjddd}
|dkrrj\}}}}d}n	j\}}}}d}t dkrt|nd }tjdd|||f||jd| }tjdd|||f||jd| }t|j|d|	||f|d}t|j|d|	||f|d}| }| }tjt|t|dd\}}|dj|dj}}|||   |||  t}|dkr&t|D ]t fddt|D |df< q	n(t|D ]#t fddt|D |d d d d d d f< q*|
rV|d}||}|S )Nrc   rd   r   r   r   r      r   Fr   r   r   Tr(   r   rI  r*   r,   )rj   rO  r   ri   )r>  r6  r    r   r   c              	      s8   g | ]}t |d f |  | gt dqS .r   r   r   r$   distorted_xdistorted_yr   r   r   r   r   r%   r&   r         z%elastic_transform.<locals>.<listcomp>.c              	      s8   g | ]}t |d f |  | gt dqS rT  r   rU  rV  r%   r&   r     rY  )r   r   r   r   r   r   r   r<   r   r   r   rx   r   r   r   rP  r.   normalri   rH  rC   r   r   r   r   r   rD   )r   alphar6  r   r   r   rL  r    input_dtyper>  rU   r   r   r   r   r!   rO  dxdyr   ytransformed_imagesr%   rV  r&   elastic_transform  s   


 



&

 

ra  r  )r   FFFra   r*   N)r   ra   r   N)r   r   N)ra   r*   )r2  r3  N)rQ  rR  r   r   r*   NN)*r  r  r  r.   torch._dynamo_dynamodynamotorch.nn.functionalr   r   r|   	keras.srcr   keras.src.backend.torch.corer   r   keras.src.random.seed_generatorr   rs   rr   r'   rI   rR   rY   r`   r   r   r   r   r   r   r   r   r  r  r	  r  r   rH  disablerP  ra  r%   r%   r%   r&   <module>   s    


2(
 
p
i 
	
T
@
