Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fcbd6729a9 |
@@ -20,10 +20,63 @@ from typing import List, Union
|
|||||||
|
|
||||||
from transformers.feature_extraction_utils import BatchFeature
|
from transformers.feature_extraction_utils import BatchFeature
|
||||||
from transformers.image_utils import ImageInput, get_image_size, to_numpy_array
|
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.tokenization_utils_base import PreTokenizedInput, TextInput
|
||||||
from transformers.utils import logging
|
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__)
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user