
    ie                        d dl mZ d dlmZ d dlmZmZmZ d dlZ	ddl
mZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZ ddlmZ ddlmZ ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3  e.       rddlm4Z4  e,       rd dl5Z5 e-       rd dl6m7Z8 ddlm9Z9m:Z: ndZ9dZ: e/jv                  e<      Z= e3d       G d de             Z> e3d       G d de             Z?e>Z@y)    )Iterable)	lru_cache)AnyOptionalUnionN   )BatchFeature)BaseImageProcessor)center_crop)convert_to_rgbdivide_to_patchesget_resize_output_image_sizeget_size_with_aspect_ratiogroup_images_by_shapereorder_images)	normalize)rescale)resize)	ChannelDimension
ImageInput	ImageTypeSizeDictget_image_size#get_image_size_for_max_height_widthget_image_typeget_max_height_widthinfer_channel_dimension_format)ImagesKwargsUnpack)
TensorTypeis_torch_availableis_torchvision_availableis_vision_availablelogging)is_rocm_platformis_torchdynamo_compilingrequires)PILImageResampling)
functional)pil_torch_interpolation_mappingtorch_pil_interpolation_mapping)torchtorchvision)backendsc                        e Zd ZdZdee   f fdZedefd       Z	ede
fd       Z	 	 	 d7ded	edz  d
e
ez  dz  ded   dee   ddfdZdedefdZ	 	 	 	 	 	 d8ded   dededz  de
dz  dededz  dedz  deed   df   fdZ	 	 d9dddedddeddf
dZe	 	 d9dddeeef   ded    deddf
d!       Zddd"eddfd#Zddd$eee   z  d%eee   z  ddfd&Z ed'(      	 	 	 	 	 	 d:d)edz  d*eee   z  dz  d+eee   z  dz  d,edz  d-edz  ded   defd.       Zddd,ed-ed)ed*eee   z  d+eee   z  ddfd/Z dddeddfd0Z!ded   d1ededdd2ed3ed,ed-ed)ed*eee   z  dz  d+eee   z  dz  d4edz  dedz  dedz  d5e
e"z  dz  de#f d6Z$ xZ%S );TorchvisionBackendzATorchvision backend for GPU-accelerated batched image processing.kwargsc                 H    t        |   di |  | j                  di | y N super__init___set_attributesselfr1   	__class__s     w/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/transformers/image_processing_backends.pyr7   zTorchvisionBackend.__init__W   &    "6"&v&    returnc                 .    t         j                  d       y)  
        `bool`: Whether or not this image processor is using the fast (Torchvision) backend.
        The `is_fast` property is deprecated and will be removed in v5.3 of Transformers.
        Use the `backend` attribute instead (e.g., `processor.backend == "torchvision"`).
        The `is_fast` property is deprecated and will be removed in v5.3 of Transformers. Use the `backend` attribute instead (e.g., `processor.backend == 'torchvision'`).Tloggerwarning_oncer:   s    r<   is_fastzTorchvisionBackend.is_fast[   s     	`	
 r>   c                      y)B
        `str`: The backend used by this image processor.
        r-   r4   rF   s    r<   backendzTorchvisionBackend.backendh   s    
 r>   Nimagedo_convert_rgbinput_data_formatdeviceztorch.devicetorch.Tensorc                 f   t        |      }|t        j                  t        j                  t        j                  fvrt        d|       |r| j                  |      }|t        j                  k(  rt        j                  |      }n6|t        j                  k(  r#t        j                  |      j                         }|j                  dk(  r|j                  d      }|t        |      }|t        j                   k(  r!|j#                  ddd      j                         }||j%                  |      }|S )z/Process a single image for torchvision backend.Unsupported input image type    r   r   )r   r   PILTORCHNUMPY
ValueErrorr   tvFpil_to_tensorr,   
from_numpy
contiguousndim	unsqueezer   r   LASTpermuteto)r:   rK   rL   rM   rN   r1   
image_types          r<   process_imagez TorchvisionBackend.process_imageo   s     $E*
immY__iooNN<ZLIJJ''.E&%%e,E9??*$$U+668E::?OOA&E$ >u E 0 5 55MM!Q*557EHHV$Er>   c                     t        |      S zConvert an image to RGB format.r   r:   rK   s     r<   r   z!TorchvisionBackend.convert_to_rgb       e$$r>   imagespad_size
fill_valuepadding_modereturn_maskdisable_grouping	is_nested)rO   rO   c                    |@|j                   r|j                  st        d| d      |j                   |j                  f}nt        |      }t	        |||      \  }	}
i }i }|	j                         D ]  \  }}|j                  dd }|d   |d   z
  }|d   |d   z
  }|dk  s|dk  rt        d| d	| d      ||k7  rdd||f}t        j                  ||||
      }|||<   |sst        j                  |t        j                        ddddddf   }d|dd|d   d|d   f<   |||<    t        ||
|      }|rt        ||
|      }||fS |S )z5Pad images using Torchvision with batched operations.NCPad size must contain 'height' and 'width' keys only. Got pad_size=.)rl   rm   r   r   zrPadding dimensions are negative. Please make sure that the `pad_size` is larger than the image size. Got pad_size=z, image_size=)fillrj   dtype.)rm   )heightwidthrV   r   r   itemsshaperW   padr,   
zeros_likeint64r   )r:   rg   rh   ri   rj   rk   rl   rm   r1   grouped_imagesgrouped_images_indexprocessed_images_groupedprocessed_masks_groupedrx   stacked_images
image_sizepadding_heightpadding_widthpaddingstacked_masksprocessed_imagesprocessed_maskss                         r<   ry   zTorchvisionBackend.pad   s    OO #fgofppq!rss 8H+F3H/D%50
,, $& "$%3%9%9%; 	?!E>'--bc2J%a[:a=8N$QK*Q-7M!]Q%6 008zzlRSU  X%a?!$z`l!m.<$U+ % 0 0u{{ STWYZ\]_`T` aGHc?Z]?OjmOCD1>'.#	?& **BDXdmn,-DFZfopO#_44r>   sizeresamplez7PILImageResampling | tvF.InterpolationMode | int | None	antialiasc                    |#t        |t        t        f      r
t        |   }n|}nt        j
                  j                  }|t        j
                  j                  k(  r/t        j                  d       t        j
                  j                  }|j                  r?|j                  r3t        |j                         dd |j                  |j                        }n|j                  r(t        ||j                  dt         j"                        }n|j$                  r?|j&                  r3t)        |j                         dd |j$                  |j&                        }n@|j*                  r%|j,                  r|j*                  |j,                  f}nt/        d| d      t1               rt3               r| j5                  ||||      S t	        j6                  ||||      S )	z"Resize an image using Torchvision.Na  You have used a torchvision backend image processor with LANCZOS resample which not yet supported for torch.Tensor. BICUBIC resample will be used as an alternative. Please fall back to a pil backend image processor if you want full consistency with the original model.rq   Fr   default_to_squarerM   jSize must contain 'height' and 'width' keys, or 'max_height' and 'max_width', or 'shortest_edge' key. Got rp   interpolationr   )
isinstancer(   intr*   rW   InterpolationModeBILINEARLANCZOSrD   rE   BICUBICshortest_edgelongest_edger   r   r   r   FIRST
max_height	max_widthr   ru   rv   rV   r&   r%   _compile_friendly_resizer   )r:   rK   r   r   r   r1   r   new_sizes           r<   r   zTorchvisionBackend.resize   s    (%7$=> ? I (11::MC11999A
  1199M$"3"31

RS!""!!H
 3''"'"2"8"8	H __:5::<;Ldoo_c_m_mnH[[TZZTZZ0H6  $%*:*<00-QZ[[zz%R[\\r>   r   r   ztvF.InterpolationModec                    | j                   t        j                  k(  r| j                         dz  } t	        j
                  | |||      } | dz  } t        j                  | dkD  d|       } t        j                  | dk  d|       } | j                         j                  t        j                        } | S t	        j
                  | |||      } | S )zOA wrapper around tvF.resize for torch.compile compatibility with uint8 tensors.   r      r   )	rt   r,   uint8floatrW   r   whereroundr_   )rK   r   r   r   s       r<   r   z+TorchvisionBackend._compile_friendly_resize   s     ;;%++%KKMC'EJJuhmW`aECKEKKS%8EKK	1e4EKKM$$U[[1E  JJuhmW`aEr>   scalec                     ||z  S )z5Rescale an image by a scale factor using Torchvision.r4   r:   rK   r   r1   s       r<   r   zTorchvisionBackend.rescale  s     u}r>   meanstdc                 0    t        j                  |||      S )z%Normalize an image using Torchvision.)rW   r   r:   rK   r   r   r1   s        r<   r   zTorchvisionBackend.normalize  s     }}UD#..r>   
   )maxsizedo_normalize
image_mean	image_std
do_rescalerescale_factorc                     |r>|r<t        j                  ||      d|z  z  }t        j                  ||      d|z  z  }d}|||fS )N)rN   g      ?F)r,   tensor)r:   r   r   r   r   r   rN   s          r<   !_fuse_mean_std_and_rescale_factorz4TorchvisionBackend._fuse_mean_std_and_rescale_factor#  sO     ,j@C.DXYJYv>#BVWIJ9j00r>   c                     | j                  ||||||j                        \  }}}|r3| j                  |j                  t        j
                        ||      }|S |r| j                  ||      }|S )zFRescale and normalize images using Torchvision (fused for efficiency).)r   r   r   r   r   rN   rs   )r   rN   r   r_   r,   float32r   )r:   rg   r   r   r   r   r   s          r<   rescale_and_normalizez(TorchvisionBackend.rescale_and_normalize4  s     -1,R,R%!!)== -S -
)
Iz ^^FIIEMMI$BJPYZF  \\&.9Fr>   c                 4   |j                   |j                  t        d|j                                |j                  dd \  }}|j                   |j                  }}||kD  s||kD  rv||kD  r||z
  dz  nd||kD  r||z
  dz  nd||kD  r||z
  dz   dz  nd||kD  r||z
  dz   dz  ndg}t        j                  ||d      }|j                  dd \  }}||k(  r||k(  r|S t        ||z
  dz        }	t        ||z
  dz        }
t        j                  ||	|
||      S )	z'Center crop an image using Torchvision.N=The size dictionary must have keys 'height' and 'width'. Got rq   rR   r   r   )rr   g       @)	ru   rv   rV   keysrx   rW   ry   r   crop)r:   rK   r   r1   image_heightimage_widthcrop_height
crop_widthpadding_ltrbcrop_top	crop_lefts              r<   r   zTorchvisionBackend.center_cropM  sS    ;;$**"4\]a]f]f]h\ijkk$)KK$4!k"&++tzzZ#{\'A3=3Kk)a/QR5@<5O|+1UV7AK7Ok)A-!3UV9D|9S|+a/A5YZ	L GGE<a8E(-BC(8%L+[([L-H{2c9:z1S89	xxxKLLr>   	do_resizedo_center_crop	crop_sizedo_padreturn_tensorsc           	         t        ||      \  }}i }|j                         D ]   \  }}|r| j                  |||      }|||<   " t        ||      }t        ||      \  }}i }|j                         D ]4  \  }}|r| j	                  ||      }| j                  ||||	|
|      }|||<   6 t        ||      }|r| j                  |||      }t        d|i|      S )z=Preprocess using Torchvision backend (fast, GPU-accelerated).)rl   rK   r   r   )rh   rl   pixel_valuesdatatensor_type)r   rw   r   r   r   r   ry   r	   )r:   rg   r   r   r   r   r   r   r   r   r   r   r   rh   rl   r   r1   r|   r}   resized_images_groupedrx   r   resized_imagesr~   r   s                            r<   _preprocesszTorchvisionBackend._preprocessi  s&   * 0EV^n/o,,!#%3%9%9%; 	;!E>!%>W_!`,:"5)	; ((>@TU 0E^fv/w,,#% %3%9%9%; 	=!E>!%!1!1.)!L!77
NL*V_N /=$U+	= **BDXY#xx(88^nxo.2B!CQ_``r>   )NNN)Nr   constantFFF)NT)NNNNNN)&__name__
__module____qualname____doc__r   r   r7   propertyboolrG   strrJ   r   r   r   ra   r   listr   r   r   tuplery   r   staticmethodr   r   r   r   r   r   r   r   r   r    r	   r   __classcell__r;   s   @r<   r0   r0   S   sY   K'!5 ' 
 
 
    '+;?+/!! t! !11D8	!
 (! &! 
!F%J %: % "!"#-!(-!&0 ^$0  0  $J	0 
 Dj0  0  +0  $;0  
u34nD	E0 l OS3]3] 3] L	3]
 3] 
3]j  <@	S/   78 	
 
 $ 
 
// huo%/ Xe_$	/ 
/ r %)1504"&'++/1Tk1 DK'$.1 4;&-	1
 4K1 1 (1 
1 1   	
  DK' 4;& 
2MM M
 
M8-a^$-a -a 	-a
 L-a -a -a -a -a -a DK'$.-a 4;&--a t-a T/-a +-a  j(4/!-a$ 
%-ar>   r0   )visionc                   :    e Zd ZdZdee   f fdZedefd       Z	ede
fd       Z	 	 d*ded	edz  d
e
ez  dz  dee   dej                  f
dZdedefdZ	 	 	 	 d+deej                     dededz  de
dz  dedeeej                     eej                     f   eej                     z  fdZ	 	 d*dej                  dedddedz  dej                  f
dZdej                  dedej                  fdZdej                  deee   z  deee   z  dej                  fdZdej                  dedej                  fdZdeej                     dededdded ed!ed"ed#ed$eee   z  dz  d%eee   z  dz  d&edz  dedz  d'e
ez  dz  defd(Zde e
e!f   f fd)Z" xZ#S ),
PilBackendz9PIL/NumPy backend for portable CPU-only image processing.r1   c                 H    t        |   di |  | j                  di | y r3   r5   r9   s     r<   r7   zPilBackend.__init__  r=   r>   r?   c                 .    t         j                  d       y)rA   rB   FrC   rF   s    r<   rG   zPilBackend.is_fast  s     	`	
 r>   c                      y)rI   pilr4   rF   s    r<   rJ   zPilBackend.backend  s    
 r>   NrK   rL   rM   c                    t        |      }|t        j                  t        j                  t        j                  fvrt        d|       |r| j                  |      }|t        j                  k(  r9t        j                  |      }|j                  dk\  r8|t        j                  n|}n#|t        j                  k(  r|j                         }|j                  dk(  rt        j                  |d      }|t        |      }|t        j                  k(  r0t        |t        j                         rt        j"                  |d      }|S )z'Process a single image for PIL backend.rQ      rR   r   )axis)rR   r   r   )r   r   rS   rT   rU   rV   r   nparrayr[   r   r]   numpyexpand_dimsr   r   ndarray	transpose)r:   rK   rL   rM   r1   r`   s         r<   ra   zPilBackend.process_image  s     $E*
immY__iooNN<ZLIJJ''.E&HHUOEzzQ=N=V$4$9$9\m!9??*KKME::?NN5q1E$ >u E 0 5 55%,UI6r>   c                     t        |      S rc   rd   re   s     r<   r   zPilBackend.convert_to_rgb  rf   r>   rg   rh   ri   rj   rk   c                    |@|j                   r|j                  st        d| d      |j                   |j                  }}nt        |      \  }}g }	g }
|D ]  }t	        |t
        j                        \  }}||z
  }||z
  }|dk  s|dk  rt        d| d| d| d| d		      ||k7  s||k7  r@d
d|fd|ff}|dk(  rt        j                  ||d|      }nt        j                  |||      }|	j                  |       |st        j                  ||ft        j                        }d|d|d|f<   |
j                  |        |r|	|
fS |	S )z)Pad images to specified size using NumPy.Nro   rp   channel_dimr   zsPadding dimensions are negative. Please make sure that the `pad_size` is larger than the image size. Got pad_size=(z, z), image_size=(z).)r   r   r   )modeconstant_values)r   rs   r   )ru   rv   rV   r   r   r   r   r   ry   appendzerosr{   )r:   rg   rh   ri   rj   rk   r1   target_heighttarget_widthr   r   rK   ru   rv   r   r   	pad_widthmasks                     r<   ry   zPilBackend.pad  s    OO #fgofppq!rss*2//8>><M*>v*F'M< 	-E*5>N>T>TUMFE*V3N(50M!]Q%6 11>r,_e^ffhinhooqs 
 &%<*? $a%81m:LM	:-FF5)*V`aEFF5),GE##E*xx =RXXN()WfWfuf_%&&t,3	-6 #_44r>   r   r   zPILImageResampling | Nonereducing_gapc                 T   |>t        |t        t        f      s(t        |t        v r
t        |   }nt        j                  }||nt        j                  }|j
                  rN|j                  rBt        |t        j                        \  }}t        ||f|j
                  |j                        }n|j
                  r(t        ||j
                  dt        j                        }n|j                  rN|j                  rBt        |t        j                        \  }}t        ||f|j                  |j                        }n@|j                  r%|j                   r|j                  |j                   f}nt#        d| d      t%        ||||t        j                  t        j                        S )z Resize an image using PIL/NumPy.r   Fr   r   rp   )r   r   r   data_formatrM   )r   r(   r   r+   r   r   r   r   r   r   r   r   r   r   r   ru   rv   rV   	np_resize)	r:   rK   r   r   r   r1   ru   rv   r   s	            r<   r   zPilBackend.resize  su    
8>PRU=V(W.:xKj?j:8D-66'389K9T9T$"3"3*5>N>T>TUMFE1""!!H
 3''"'"2"8"8	H __*5>N>T>TUMFE:FE?DOO]a]k]klH[[TZZTZZ0H6 
 %(...44
 	
r>   r   c                 X    t        ||t        j                  t        j                        S )z/Rescale an image by a scale factor using NumPy.)r   r   rM   )
np_rescaler   r   r   s       r<   r   zPilBackend.rescaleC  s)     (...44	
 	
r>   r   r   c                 Z    t        |||t        j                  t        j                        S )zNormalize an image using NumPy.)r   r   r   rM   )np_normalizer   r   r   s        r<   r   zPilBackend.normalizeQ  s,     (...44
 	
r>   c                     |j                   |j                  t        d|j                                t	        ||j                   |j                  ft
        j                  t
        j                        S )z!Center crop an image using NumPy.r   )r   r   rM   )ru   rv   rV   r   np_center_cropr   r   )r:   rK   r   r1   s       r<   r   zPilBackend.center_cropa  sg     ;;$**"4\]a]f]f]h\ijkk++tzz*(...44	
 	
r>   r   r   r   r   r   r   r   r   r   r   c                 $   g }|D ]f  }|r| j                  |||      }|r| j                  ||      }|r| j                  ||      }|	r| j                  ||
|      }|j	                  |       h |r| j                  ||      }t        d|i|      S )z2Preprocess using PIL backend (portable, CPU-only).r   )rh   r   r   )r   r   r   r   r   ry   r	   )r:   rg   r   r   r   r   r   r   r   r   r   r   r   rh   r   r1   r   rK   s                     r<   r   zPilBackend._preprocessr  s    &  		+E%dXN((	:UN;uj)D##E*		+ #xx(88xL.2B!CQ_``r>   c                 |    t         |          }|j                  dd      j                  d      r|d   d d |d<   |S )Nimage_processor_type Pil)r6   to_dictgetendswith)r:   processor_dictr;   s     r<   r  zPilBackend.to_dict  sK    *4b9BB5I5CDZ5[\_]_5`N12r>   )NN)Nr   r   F)$r   r   r   r   r   r   r7   r   r   rG   r   rJ   r   r   r   r   ra   r   r   r   r   r   ry   r   r   r   r   r   r   r    r	   r   dictr   r  r   r   s   @r<   r   r     s   C'!5 ' 
 
 
    '+;?	"" t" !11D8	"
 &" 
"H%J %: % "!"#-!1 RZZ 1  1  $J	1 
 Dj1  1  
tBJJbjj!11	2T"**5E	E1 n 15#'1
zz1
 1
 .	1

 Dj1
 
1
f
zz
 

 


zz
 huo%
 Xe_$	
 

 
zz
 

 

""aRZZ "a "a 	"a
 ."a "a "a "a "a "a DK'$."a 4;&-"a t"a T/"a j(4/"a" 
#"aHc3h  r>   r   )Acollections.abcr   	functoolsr   typingr   r   r   r   r   image_processing_baser	   image_processing_utilsr
   image_transformsr   r  r   r   r   r   r   r   r   r  r   r   r   r   image_utilsr   r   r   r   r   r   r   r   r   processing_utilsr   r   utilsr    r!   r"   r#   r$   utils.import_utilsr%   r&   r'   r(   r,   torchvision.transforms.v2r)   rW   r*   r+   
get_loggerr   rD   r0   r   BaseImageProcessorFastr4   r>   r<   <module>r     s    %  ' '  / 6 
 
 
 3  U T /;]]&*#&*# 
		H	% 
+,Ba+ Ba -BaJ
 
;A# A  AJ , r>   