Fix transformers update compatibility
This commit is contained in:
@@ -20,10 +20,63 @@ from typing import List, Union
|
||||
|
||||
from transformers.feature_extraction_utils import BatchFeature
|
||||
from transformers.image_utils import ImageInput, get_image_size, to_numpy_array
|
||||
from transformers.processing_utils import ProcessingKwargs, ProcessorMixin, Unpack, _validate_images_text_input_order
|
||||
from transformers.processing_utils import ProcessingKwargs, ProcessorMixin, Unpack
|
||||
from transformers.tokenization_utils_base import PreTokenizedInput, TextInput
|
||||
from transformers.utils import logging
|
||||
|
||||
def _validate_images_text_input_order(images, text):
|
||||
"""
|
||||
For backward compatibility: reverse the order of `images` and `text` inputs if they are swapped.
|
||||
This method should only be called for processors where `images` and `text` have been swapped for uniformization purposes.
|
||||
Note that this method assumes that two `None` inputs are valid inputs. If this is not the case, it should be handled
|
||||
in the processor's `__call__` method before calling this method.
|
||||
"""
|
||||
|
||||
def _is_valid_images_input_for_processor(imgs):
|
||||
# If we have an list of images, make sure every image is valid
|
||||
if isinstance(imgs, (list, tuple)):
|
||||
for img in imgs:
|
||||
if not _is_valid_images_input_for_processor(img):
|
||||
return False
|
||||
# If not a list or tuple, we have been given a single image or batched tensor of images
|
||||
elif imgs is None:
|
||||
return False
|
||||
return True
|
||||
|
||||
def _is_valid_text_input_for_processor(t):
|
||||
if isinstance(t, str):
|
||||
# Strings are fine
|
||||
return True
|
||||
elif isinstance(t, (list, tuple)):
|
||||
# List are fine as long as they are...
|
||||
if len(t) == 0:
|
||||
# ... not empty
|
||||
return False
|
||||
for t_s in t:
|
||||
return _is_valid_text_input_for_processor(t_s)
|
||||
return False
|
||||
|
||||
def _is_valid(input, validator):
|
||||
return validator(input) or input is None
|
||||
|
||||
images_is_valid = _is_valid(images, _is_valid_images_input_for_processor)
|
||||
images_is_text = _is_valid_text_input_for_processor(images)
|
||||
|
||||
text_is_valid = _is_valid(text, _is_valid_text_input_for_processor)
|
||||
text_is_images = _is_valid_images_input_for_processor(text)
|
||||
# Handle cases where both inputs are valid
|
||||
if images_is_valid and text_is_valid:
|
||||
return images, text
|
||||
|
||||
# Handle cases where inputs need to and can be swapped
|
||||
if (images is None and text_is_images) or (text is None and images_is_text) or (images_is_text and text_is_images):
|
||||
logger.warning_once(
|
||||
"You may have used the wrong order for inputs. `images` should be passed before `text`. "
|
||||
"The `images` and `text` inputs will be swapped. This behavior will be deprecated in transformers v4.47."
|
||||
)
|
||||
return text, images
|
||||
|
||||
raise ValueError("Invalid input type. Check that `images` and/or `text` are valid inputs.")
|
||||
|
||||
logger = logging.get_logger(__name__)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user