
    ^ji                         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&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6  e0       rddlm7Z7  e.       rd dl8Z8 e/       rd dl9m:Z; ddlm<Z<m=Z= ndZ<dZ= e1j|                  e?      Z@ e6d       G d de             ZA e6d       G d de             ZBeAZCy)    )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is_valid_imageload_image_as_tensor)ImagesKwargsUnpack)
TensorTypeis_torch_availableis_torchvision_availableis_vision_availablelogging)is_rocm_platformis_torchdynamo_compilingis_torchvision_greater_or_equalrequires)PILImageResampling)
functional)pil_torch_interpolation_mappingtorch_pil_interpolation_mapping)torchtorchvision)backendsc                    F    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e
ee
   z  eee
      z  fdZ	 	 	 d9d
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	 	 	 	 	 	 d:d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	 	 d;d
ddedddeddf
dZe	 	 d;d
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d0       Z ddd.ed/ed+ed,eee   z  d-eee   z  ddfd1Z!d
ddeddfd2Z"ded   d3ededdd4ed5ed.ed/ed+ed,eee   z  d	z  d-eee   z  d	z  d6ed	z  ded	z  ded	z  d7e
e#z  d	z  de$f d8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selfr4   	__class__s     q/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/image_processing_backends.pyr:   zTorchvisionBackend.__init__Y   &    "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     	`	
 rA   c                      y)B
        `str`: The backend used by this image processor.
        r0   r7   rI   s    r?   backendzTorchvisionBackend.backendj   s    
 rA   image_url_or_urlsc                     t        |t        t        f      r|D cg c]  }| j                  |       c}S t        |t              rt        |      S t        |      r|S t        dt        |             c c}w )z
        Convert a single or a list of URLs / paths into `torch.Tensor` objects.

        Already-valid image objects (tensors, numpy arrays, PIL Images) are passed through
        unchanged so that callers who pre-load images are unaffected.
        z=only a single or a list of entries is supported but got type=)	
isinstancelisttuplefetch_imagesstrr   r   	TypeErrortype)r=   rN   xs      r?   rS   zTorchvisionBackend.fetch_imagesq   sv     '$72CDQD%%a(DD)3/'(9::-.$$[\`ar\s[tuvv Es   A5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=   rX   rY   rZ   r[   r4   
image_types          r?   process_imagez TorchvisionBackend.process_image   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rA   c                     t        |      S zConvert an image to RGB format.r   r=   rX   s     r?   r   z!TorchvisionBackend.convert_to_rgb       e$$rA   imagespad_size
fill_valuepadding_modereturn_maskdisable_grouping	is_nested)r\   r\   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=.)ry   rz   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=)fillrw   dtype.)rz   )heightwidthrc   r   r   itemsshaperd   padr/   
zeros_likeint64r   )r=   rt   ru   rv   rw   rx   ry   rz   r4   grouped_imagesgrouped_images_indexprocessed_images_groupedprocessed_masks_groupedr   stacked_images
image_sizepadding_heightpadding_widthpaddingstacked_masksprocessed_imagesprocessed_maskss                         r?   r   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rA   sizeresamplez7PILImageResampling | tvF.InterpolationMode | int | None	antialiasc                    |#t        |t        t        f      r
t        |   }n|}nt        j
                  j                  }|t        j
                  j                  k(  r:t        d      s/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t1        d| d      t3               rt5               r| j7                  ||||      S t	        j8                  ||||	      S )
z"Resize an image using Torchvision.Nz0.27aC  You have used a torchvision backend image processor with LANCZOS resample which is not supported for torch.Tensor with torchvision < 0.27. BICUBIC resample will be used as an alternative. Please upgrade torchvision to 0.27+ or fall back to a pil backend image processor if you want full consistency with the original model.r~   Fr   default_to_squarerZ   jSize must contain 'height' and 'width' keys, or 'max_height' and 'max_width', or 'shortest_edge' key. Got r}   interpolationr   )rP   r+   intr-   rd   InterpolationModeBILINEARLANCZOSr)   rG   rH   BICUBICshortest_edgelongest_edger   r   r   r   FIRST
max_height	max_widthr   r   r   rc   r(   r'   _compile_friendly_resizer   )r=   rX   r   r   r   r4   r   new_sizes           r?   r   zTorchvisionBackend.resize   s    (%7$=> ? I (11::MC11999BabhBi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[\\rA   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   )	r   r/   uint8floatrd   r   whereroundrl   )rX   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rA   scalec                     ||z  S )z5Rescale an image by a scale factor using Torchvision.r7   r=   rX   r   r4   s       r?   r   zTorchvisionBackend.rescale#  s     u}rA   meanstdc                 0    t        j                  |||      S )z%Normalize an image using Torchvision.)rd   r   r=   rX   r   r   r4   s        r?   r   zTorchvisionBackend.normalize,  s     }}UD#..rA   
   )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)r[   g      ?F)r/   tensor)r=   r   r   r   r   r   r[   s          r?   !_fuse_mean_std_and_rescale_factorz4TorchvisionBackend._fuse_mean_std_and_rescale_factor6  sO     ,j@C.DXYJYv>#BVWIJ9j00rA   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   r[   r   )r   r[   r   rl   r/   float32r   )r=   rt   r   r   r   r   r   s          r?   rescale_and_normalizez(TorchvisionBackend.rescale_and_normalizeG  s     -1,R,R%!!)== -S -
)
Iz ^^FIIEMMI$BJPYZF  \\&.9FrA   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 r~   r_   r   r   )r   g       @)	r   r   rc   keysr   rd   r   r   crop)r=   rX   r   r4   image_heightimage_widthcrop_height
crop_widthpadding_ltrbcrop_top	crop_lefts              r?   r   zTorchvisionBackend.center_crop`  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LrA   	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).)ry   rX   r   r   )ru   ry   pixel_valuesdatatensor_type)r   r   r   r   r   r   r   r	   )r=   rt   r   r   r   r   r   r   r   r   r   r   r   ru   ry   r   r4   r   r   resized_images_groupedr   r   resized_imagesr   r   s                            r?   _preprocesszTorchvisionBackend._preprocess|  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_``rA   )NNN)Nr   constantFFF)NT)NNNNNN)'__name__
__module____qualname____doc__r!   r    r:   propertyboolrJ   rT   rM   rQ   rS   r   r   r   rn   r   r   r   r   rR   r   r   staticmethodr   r   r   r   r   r   r   r   r   r"   r	   r   __classcell__r>   s   @r?   r3   r3   U   s|   K'!5 ' 
 
 
   wcDIoT#Y.O w& '+;?+/!! 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4]4] 4] L	4]
 4] 
4]l  <@	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rA   r3   )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.r4   c                 H    t        |   di |  | j                  di | y r6   r8   r<   s     r?   r:   zPilBackend.__init__  r@   rA   rB   c                 .    t         j                  d       y)rD   rE   FrF   rI   s    r?   rJ   zPilBackend.is_fast  s     	`	
 rA   c                      y)rL   pilr7   rI   s    r?   rM   zPilBackend.backend  s    
 rA   NrX   rY   rZ   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.r^      r_   r   )axis)r_   r   r   )r   r   r`   ra   rb   rc   r   nparrayrh   r   rj   numpyexpand_dimsr   rP   ndarray	transpose)r=   rX   rY   rZ   r4   rm   s         r?   rn   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rA   c                     t        |      S rp   rq   rr   s     r?   r   zPilBackend.convert_to_rgb  rs   rA   rt   ru   rv   rw   rx   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.Nr|   r}   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   r   r   )r   r   rc   r   r   r   r   r   r   appendzerosr   )r=   rt   ru   rv   rw   rx   r4   target_heighttarget_widthr   r   rX   r   r   r   r   	pad_widthmasks                     r?   r   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rA   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   r}   )r   r   r  data_formatrZ   )rP   r+   r   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   	np_resize)	r=   rX   r   r   r  r4   r   r   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
 	
rA   r   c                 X    t        ||t        j                  t        j                        S )z/Rescale an image by a scale factor using NumPy.)r   r  rZ   )
np_rescaler   r   r   s       r?   r   zPilBackend.rescaleV  s)     (...44	
 	
rA   r   r   c                 Z    t        |||t        j                  t        j                        S )zNormalize an image using NumPy.)r   r   r  rZ   )np_normalizer   r   r   s        r?   r   zPilBackend.normalized  s,     (...44
 	
rA   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  rZ   )r   r   rc   r   np_center_cropr   r   )r=   rX   r   r4   s       r?   r   zPilBackend.center_cropt  sg     ;;$**"4\]a]f]f]h\ijkk++tzz*(...44	
 	
rA   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   )ru   r   r   )r   r   r   r   r   r   r	   )r=   rt   r   r   r   r   r   r   r   r   r   r   r   ru   r   r4   r   rX   s                     r?   r   zPilBackend._preprocess  s    &  		+E%dXN((	:UN;uj)D##E*		+ #xx(88xL.2B!CQ_``rA   c                 |    t         |          }|j                  dd      j                  d      r|d   d d |d<   |S )Nimage_processor_type Pil)r9   to_dictgetendswith)r=   processor_dictr>   s     r?   r  zPilBackend.to_dict  sK    *4b9BB5I5CDZ5[\_]_5`N12rA   )NN)Nr   r   F)$r   r   r   r   r!   r    r:   r   r   rJ   rT   rM   r   r   r   r   rn   r   rQ   r   r   rR   r   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  rA   r   )D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   r   r   processing_utilsr    r!   utilsr"   r#   r$   r%   r&   utils.import_utilsr'   r(   r)   r*   r+   r/   torchvision.transforms.v2r,   rd   r-   r.   
get_loggerr   rG   r3   r   BaseImageProcessorFastr7   rA   r?   <module>r&     s    %  ' '  / 6     3  v u /;]]&*#&*# 
		H	% 
+,Sa+ Sa -Sal
 
;A# A  AJ , rA   