Spaces:
Runtime error
Runtime error
| import re | |
| import gradio as gr | |
| from PIL import Image | |
| import torch | |
| from transformers import DonutProcessor, VisionEncoderDecoderModel | |
| pretrained_repo_name = "ivelin/donut-refexp-draft" | |
| processor = DonutProcessor.from_pretrained(pretrained_repo_name) | |
| model = VisionEncoderDecoderModel.from_pretrained(pretrained_repo_name) | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| model.to(device) | |
| def process_refexp(image: Image, prompt: str): | |
| # trim prompt to 80 characters and normalize to lowercase | |
| prompt = prompt[:80].lower() | |
| # prepare encoder inputs | |
| pixel_values = processor(image, return_tensors="pt").pixel_values | |
| # prepare decoder inputs | |
| task_prompt = "<s_refexp><s_prompt>{user_input}</s_prompt><s_refexp>" | |
| prompt = task_prompt.replace("{user_input}", prompt) | |
| decoder_input_ids = processor.tokenizer( | |
| prompt, add_special_tokens=False, return_tensors="pt").input_ids | |
| # generate answer | |
| outputs = model.generate( | |
| pixel_values.to(device), | |
| decoder_input_ids=decoder_input_ids.to(device), | |
| max_length=model.decoder.config.max_position_embeddings, | |
| early_stopping=True, | |
| pad_token_id=processor.tokenizer.pad_token_id, | |
| eos_token_id=processor.tokenizer.eos_token_id, | |
| use_cache=True, | |
| num_beams=1, | |
| bad_words_ids=[[processor.tokenizer.unk_token_id]], | |
| return_dict_in_generate=True, | |
| ) | |
| # postprocess | |
| sequence = processor.batch_decode(outputs.sequences)[0] | |
| sequence = sequence.replace(processor.tokenizer.eos_token, "").replace( | |
| processor.tokenizer.pad_token, "") | |
| # remove first task start token | |
| sequence = re.sub(r"<.*?>", "", sequence, count=1).strip() | |
| bbox = processor.token2json(sequence) | |
| print(f"predicted bounding box: {bbox}") | |
| width, height = image.size | |
| print(f"image width, height: {width, height}") | |
| print(f"prompt: {sample['prompt']}") | |
| xmin = math.floor(width*bbox["xmin"]) | |
| ymin = math.floor(height*bbox["ymin"]) | |
| xmax = math.floor(width*bbox["xmax"]) | |
| ymax = math.floor(height*bbox["ymax"]) | |
| print( | |
| f"to image pixel values: xmin, ymin, xmax, ymax: {xmin, ymin, xmax, ymax}") | |
| shape = [(xmin, ymin), (xmax, ymax)] | |
| # create rectangle image | |
| img1 = ImageDraw.Draw(image) | |
| img1.rectangle(shape, outline="green", width=5) | |
| return image, bbox | |
| description = "Gradio Demo for Donut RefExp task, an instance of `VisionEncoderDecoderModel` fine-tuned on UIBert RefExp Dataset (UI Referring Expression). To use it, simply upload your image and type a question and click 'submit', or click one of the examples to load them. Read more at the links below." | |
| article = "<p style='text-align: center'><a href='https://arxiv.org/abs/2111.15664' target='_blank'>Donut: OCR-free Document Understanding Transformer</a> | <a href='https://github.com/clovaai/donut' target='_blank'>Github Repo</a></p>" | |
| examples = [ | |
| ["example_1.jpg", "select the setting icon from top right corner"], | |
| ["example_2.jpg", "enter the text field next to the name"] | |
| ], | |
| demo = gr.Interface(fn=process_refexp, inputs=[gr.inputs.Image(type='pil'), "textbox"], | |
| outputs=[gr.inputs.Image(type='pil'), "textbox"], | |
| title=title, description=description, article=article, examples=examples, | |
| allow_flagging=False, allow_screenshot=False) | |
| demo.launch(cache_examples=True) | |