import torch IMAGE_TOKEN_INDEX = -200 DEFAULT_IMAGE_TOKEN = "" def tokenizer_image_token( prompt, tokenizer, image_token_index=IMAGE_TOKEN_INDEX, return_tensors=None ): prompt_chunks = [ tokenizer(chunk).input_ids for chunk in prompt.split(DEFAULT_IMAGE_TOKEN) ] def insert_separator(items, separator): return [ element for pair in zip(items, [separator] * len(items)) for element in pair ][:-1] input_ids = [] offset = 0 if ( len(prompt_chunks) > 0 and len(prompt_chunks[0]) > 0 and prompt_chunks[0][0] == tokenizer.bos_token_id ): offset = 1 input_ids.append(prompt_chunks[0][0]) for chunk in insert_separator(prompt_chunks, [image_token_index] * (offset + 1)): input_ids.extend(chunk[offset:]) if return_tensors is not None: if return_tensors == "pt": return torch.tensor(input_ids, dtype=torch.long) raise ValueError(f"Unsupported tensor type: {return_tensors}") return input_ids