/usr/local/lib/python3.6/site-packages/transformers/pipelines
NameSizeModeActions
__pycache__/-0755rm
audio_classification.py58400644editdlrm
audio_utils.py77840644editdlrm
automatic_speech_recognition.py189920644editdlrm
base.py439580644editdlrm
conversational.py134660644editdlrm
feature_extraction.py35810644editdlrm
fill_mask.py98700644editdlrm
image_classification.py43250644editdlrm
image_segmentation.py80450644editdlrm
object_detection.py53040644editdlrm
pt_utils.py115130644editdlrm
question_answering.py260000644editdlrm
table_question_answering.py181100644editdlrm
text2text_generation.py151230644editdlrm
text_classification.py72900644editdlrm
text_generation.py124940644editdlrm
token_classification.py208380644editdlrm
zero_shot_classification.py108070644editdlrm
zero_shot_image_classification.py50880644editdlrm
__init__.py303590644editdlrm
Edit: /usr/local/lib/python3.6/site-packages/transformers/pipelines/zero_shot_image_classification.py (5088B)
from typing import List, Union from ..utils import ( add_end_docstrings, is_tf_available, is_torch_available, is_vision_available, logging, requires_backends, ) from .base import PIPELINE_INIT_ARGS, ChunkPipeline if is_vision_available(): from PIL import Image from ..image_utils import load_image if is_torch_available(): import torch if is_tf_available(): import tensorflow as tf logger = logging.get_logger(__name__) @add_end_docstrings(PIPELINE_INIT_ARGS) class ZeroShotImageClassificationPipeline(ChunkPipeline): """ Zero shot image classification pipeline using `CLIPModel`. This pipeline predicts the class of an image when you provide an image and a set of `candidate_labels`. This image classification pipeline can currently be loaded from [`pipeline`] using the following task identifier: `"zero-shot-image-classification"`. See the list of available models on [huggingface.co/models](https://huggingface.co/models?filter=zero-shot-image-classification). """ def __init__(self, **kwargs): super().__init__(**kwargs) requires_backends(self, "vision") # No specific FOR_XXX available yet # self.check_model_type(MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING) def __call__(self, images: Union[str, List[str], "Image", List["Image"]], **kwargs): """ Assign labels to the image(s) passed as inputs. Args: images (`str`, `List[str]`, `PIL.Image` or `List[PIL.Image]`): The pipeline handles three types of images: - A string containing a http link pointing to an image - A string containing a local path to an image - An image loaded in PIL directly candidate_labels (`List[str]`): The candidate labels for this image hypothesis_template (`str`, *optional*, defaults to `"This is a photo of {}"`): The sentence used in cunjunction with *candidate_labels* to attempt the image classification by replacing the placeholder with the candidate_labels. Then likelihood is estimated by using logits_per_image Return: A list of dictionaries containing result, one dictionnary per proposed label. The dictionaries contain the following keys: - **label** (`str`) -- The label identified by the model. It is one of the suggested `candidate_label`. - **score** (`float`) -- The score attributed by the model for that label (between 0 and 1). """ return super().__call__(images, **kwargs) def _sanitize_parameters(self, **kwargs): preprocess_params = {} if "candidate_labels" in kwargs: preprocess_params["candidate_labels"] = kwargs["candidate_labels"] if "hypothesis_template" in kwargs: preprocess_params["hypothesis_template"] = kwargs["hypothesis_template"] return preprocess_params, {}, {} def preprocess(self, image, candidate_labels=None, hypothesis_template="This is a photo of {}."): n = len(candidate_labels) for i, candidate_label in enumerate(candidate_labels): image = load_image(image) images = self.feature_extractor(images=[image], return_tensors=self.framework) sequence = hypothesis_template.format(candidate_label) inputs = self.tokenizer(sequence, return_tensors=self.framework) inputs["pixel_values"] = images.pixel_values yield {"is_last": i == n - 1, "candidate_label": candidate_label, **inputs} def _forward(self, model_inputs): is_last = model_inputs.pop("is_last") candidate_label = model_inputs.pop("candidate_label") outputs = self.model(**model_inputs) # Clip does crossproduct scoring by default, so we're only # interested in the results where image and text and in the same # batch position. diag = torch.diagonal if self.framework == "pt" else tf.linalg.diag_part logits_per_image = diag(outputs.logits_per_image) model_outputs = { "is_last": is_last, "candidate_label": candidate_label, "logits_per_image": logits_per_image, } return model_outputs def postprocess(self, model_outputs): candidate_labels = [outputs["candidate_label"] for outputs in model_outputs] if self.framework == "pt": logits = torch.cat([output["logits_per_image"] for output in model_outputs]) probs = logits.softmax(dim=0) scores = probs.tolist() else: logits = tf.concat([output["logits_per_image"] for output in model_outputs], axis=0) probs = tf.nn.softmax(logits, axis=0) scores = probs.numpy().tolist() result = [ {"score": score, "label": candidate_label} for score, candidate_label in sorted(zip(scores, candidate_labels), key=lambda x: -x[0]) ] return result