
    ^j&                        d Z ddl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 ddl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  ej4                  e      Z G d ded      Z	 	 	 	 ddededededededefdZe G d de             Z dgZ!y)z#Image processor class for GLM-4.1V.    N)
functional   )TorchvisionBackend)BatchFeature)group_images_by_shapereorder_images)OPENAI_CLIP_MEANOPENAI_CLIP_STD
ImageInputPILImageResamplingSizeDict)ImagesKwargsUnpack)
TensorTypeauto_docstringloggingc                   0    e Zd ZU dZeed<   eed<   eed<   y)Glm4vImageProcessorKwargsaR  
    patch_size (`int`, *optional*, defaults to 14):
        The spatial patch size of the vision encoder.
    temporal_patch_size (`int`, *optional*, defaults to 2):
        The temporal patch size of the vision encoder.
    merge_size (`int`, *optional*, defaults to 2):
        The merge size of the vision encoder to llm encoder.
    
patch_sizetemporal_patch_size
merge_sizeN)__name__
__module____qualname____doc__int__annotations__     {/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/glm4v/image_processing_glm4v.pyr   r   &   s     OOr   r   F)total
num_framesheightwidthtemporal_factorfactor
min_pixels
max_pixelsc                 R   | |k  rt        d|  d|       ||k  s||k  r.t        ||z  ||z        }t        ||z        }t        ||z        }t        ||      t        ||      z  dkD  r%t        dt        ||      t        ||      z         t	        ||z        |z  }t	        ||z        |z  }	t	        | |z        |z  }
|
|z  |	z  |kD  rrt        j                  | |z  |z  |z        }t        |t        j                  ||z  |z        |z        }t        |t        j                  ||z  |z        |z        }	||	fS |
|z  |	z  |k  rZt        j                  || |z  |z  z        }t        j                  ||z  |z        |z  }t        j                  ||z  |z        |z  }	||	fS )Nzt:z% must be larger than temporal_factor:   z4absolute aspect ratio must be smaller than 200, got )	
ValueErrormaxr   minroundmathsqrtfloorceil)r"   r#   r$   r%   r&   r'   r(   scaleh_barw_bart_barbetas               r    smart_resizer8   5   s    O#2j\)NN_`aa%&.FVOVe^4Ve^$EEM"
65C..4B3vuCUX[\bdiXjCjBkl
 	
 &6/"V+E%&.!F*E*.//AEu}uz)yy*v-5CDFDJJv}v'=>GHFDJJut|f'<=FG %< 
		+yyzF':U'BCD		&4-&01F:		%$,/069%<r   c                   N    e Zd ZdZej
                  ZdddZdZdZ	dZ
dZeZeZdZdZdZdZeZd	d
gZdee   f fdZededee   def fd       Zdef fdZded   de de!ddde de"de de"ee"   z  dz  de"ee"   z  dz  de#de#de#de dz  d e$e%z  dz  defd!Z&d%d"e#d#e#fd$Z' xZ(S )&Glm4vImageProcessorT 1  iq )shortest_edgelongest_edgeFgp?      pixel_valuesimage_grid_thwkwargsc                     t        |   di | | j                  8| j                  j                  r| j                  j                  st        d      y y )N:size must contain 'shortest_edge' and 'longest_edge' keys.r   )super__init__sizer<   r=   r+   )selfrB   	__class__s     r    rF   zGlm4vImageProcessor.__init__k   sM    "6"99 99**$))2H2H !]^^ 3I !r   imagesreturnc                 $    t        |   |fi |S N)rE   
preprocess)rH   rJ   rB   rI   s      r    rN   zGlm4vImageProcessor.preprocessq   s    w!&3F33r   c                     t        |   di |}|j                  d| j                        }|j                  r|j
                  st        d      |S )z
        Update kwargs that need further processing before being validated
        Can be overridden by subclasses to customize the processing of kwargs.
        rG   rD   r   )rE   _standardize_kwargsgetrG   r<   r=   r+   )rH   rB   rG   rI   s      r    rP   z'Glm4vImageProcessor._standardize_kwargsu   sM    
 ,6v6zz&$)),!!):):YZZr   ztorch.Tensor	do_resizerG   resamplez7PILImageResampling | tvF.InterpolationMode | int | None
do_rescalerescale_factordo_normalize
image_meanN	image_stdr   r   r   disable_groupingreturn_tensorsc                    t        ||      \  }}i }|j                         D ]i  \  }}|j                  dd \  }}|rKt        |||||
|z  |j                  |j
                        \  }}| j                  |t        ||      |      }|||<   k t        ||      }t        ||      \  }}i }i }|j                         D ]<  \  }}|j                  dd \  }}| j                  ||||||	      }|j                  dk(  r|j                  d      }|j                  d   |z  d	k7  rJ|ddd
df   j                  d||j                  d   |z  z
  ddd      }t        j                  ||gd      }|j                  dd \  }}} ||z  }!||
z  ||
z  }#}"|j                  ||!|| |"|z  ||
|#|z  ||

      }|j!                  d	ddddddddd
      }|j#                  ||!|"z  |#z  | |z  |
z  |
z        }$|$||<   |!|"|#gg|z  ||<   ? t        ||      }%t        ||      }t        j                  |%d	      }&t        j$                  |      }'t'        |&|'d|      S )z9
        Preprocess an image or batch of images.
        )rY   N)r"   r#   r$   r%   r&   r'   r(   )r#   r$   )rG   rS         r   )dimr            r?      	   )r@   rA   )datatensor_type)r   itemsshaper8   r<   r=   resizer   r   rescale_and_normalizendim	unsqueezerepeattorchcatviewpermutereshapetensorr   )(rH   rJ   rR   rG   rS   rT   rU   rV   rW   rX   r   r   r   rY   rZ   rB   grouped_imagesgrouped_images_indexresized_images_groupedri   stacked_imagesr#   r$   resized_heightresized_widthresized_imagesprocessed_images_groupedprocessed_gridspatchesrepeats
batch_sizet_lenchannelgrid_tgrid_hgrid_wflatten_patchesprocessed_imagesr@   rA   s(                                           r    _preprocesszGlm4vImageProcessor._preprocess   s    , 0EV^n/o,,!#%3%9%9%; 	;!E>*005MFE0<2!$7%
2#11#001- "&"!}M% "- "
 -;"5)#	;& ((>@TU/D^fv/w,,#% %3%9%9%; )	M!E>,:,@,@,E)NM00
NL*V_G ||q !++A.}}Q"55:!!RS&/00*gmmA.>AT.TUWXZ[]^  ))Wg$6A>)0r):&Jw11F+z9=J;VFFll#*$*$G ooaAq!Q1aCG%oo&(--
:ZGO />$U+'-vv&>%?*%LOE"S)	MV **BDXY(:NOyy!1q9o6"..Q_m
 	
r   r#   r$   c           	      0   |j                  d| j                        }|j                  d| j                        }|j                  d| j                        }||z  }t	        | j
                  ||||d   |d   | j
                        \  }}	||z  |	|z  }}
|
|z  S )a  
        A utility that returns number of image patches for a given image size.

        Args:
            height (`int`):
                Height of the input image.
            width (`int`):
                Width of the input image.
            images_kwargs (`dict`, *optional*)
                Any kwargs to override defaults of the image processor.
        Returns:
            `int`: Number of image patches per image.
        r   r   rG   r<   r=   )r"   r#   r$   r&   r'   r(   r%   )rQ   r   r   rG   r8   r   )rH   r#   r$   images_kwargsr   r   rG   r&   ry   rz   r   r   s               r    get_number_of_image_patchesz/Glm4vImageProcessor.get_number_of_image_patches   s     #&&|T__E
"&&|T__E
  3j((4//O,N+ 44)
% (:5}
7Rr   rM   ))r   r   r   rR   r   BICUBICrS   rG   default_to_squarerT   rU   rV   r	   rW   r
   rX   do_convert_rgbr   r   r   r   valid_kwargsmodel_input_namesr   rF   r   r   r   rN   dictrP   listboolr   floatr   strr   r   r   __classcell__)rI   s   @r    r:   r:   Y   s   I!))H&HDJNL!JINJJ,L')9:_(A!B _ 4 4v>W7X 4]i 4 4
t 
d
^$d
 d
 	d

 Ld
 d
 d
 d
 DK'$.d
 4;&-d
 d
 !d
 d
 +d
 j(4/d
" 
#d
L# c r   r:   )r?      r;   i   )"r   r/   ro   torchvision.transforms.v2r   tvFimage_processing_backendsr   image_processing_utilsr   image_transformsr   r   image_utilsr	   r
   r   r   r   processing_utilsr   r   utilsr   r   r   
get_loggerr   loggerr   r   r8   r:   __all__r   r   r    <module>r      s    *   7 ; 2 E  5 8 8 
		H	%E & 0!!! ! 	!
 ! ! !H j, j jZ !
!r   