import gradio as gr import numpy as np from transformers import LayoutLMv2Processor, LayoutLMv2ForTokenClassification from datasets import load_dataset from PIL import Image, ImageDraw, ImageFont from gradio.themes.utils import sizes theme = gr.themes.Default(radius_size=sizes.radius_none).set( block_label_text_color = '#4D63FF', block_title_text_color = '#4D63FF', button_primary_text_color = '#4D63FF', button_primary_background_fill='#FFFFFF', button_primary_border_color='#4D63FF', button_primary_background_fill_hover='#EDEFFF', ) processor = LayoutLMv2Processor.from_pretrained("microsoft/layoutlmv2-base-uncased") model = LayoutLMv2ForTokenClassification.from_pretrained("nielsr/layoutlmv2-finetuned-funsd") labels = ['O', 'B-HEADER', 'I-HEADER', 'B-QUESTION', 'I-QUESTION', 'B-ANSWER', 'I-ANSWER'] id2label = {0: 'O', 1: 'B-HEADER', 2: 'I-HEADER', 3: 'B-QUESTION', 4: 'I-QUESTION', 5: 'B-ANSWER', 6: 'I-ANSWER'} label2color = {'question':'blue', 'answer':'green', 'header':'orange', 'other':'violet'} def unnormalize_box(bbox, width, height): return [ width * (bbox[0] / 1000), height * (bbox[1] / 1000), width * (bbox[2] / 1000), height * (bbox[3] / 1000), ] def iob_to_label(label): label = label[2:] if not label: return 'other' return label def process_image(image): width, height = image.size # encode encoding = processor(image, truncation=True, return_offsets_mapping=True, return_tensors="pt") offset_mapping = encoding.pop('offset_mapping') # forward pass outputs = model(**encoding) # get predictions predictions = outputs.logits.argmax(-1).squeeze().tolist() token_boxes = encoding.bbox.squeeze().tolist() # only keep non-subword predictions is_subword = np.array(offset_mapping.squeeze().tolist())[:,0] != 0 true_predictions = [id2label[pred] for idx, pred in enumerate(predictions) if not is_subword[idx]] true_boxes = [unnormalize_box(box, width, height) for idx, box in enumerate(token_boxes) if not is_subword[idx]] # draw predictions over the image draw = ImageDraw.Draw(image) font = ImageFont.load_default() for prediction, box in zip(true_predictions, true_boxes): predicted_label = iob_to_label(prediction).lower() draw.rectangle(box, outline=label2color[predicted_label]) draw.text((box[0]+10, box[1]-10), text=predicted_label, fill=label2color[predicted_label], font=font) return image with gr.Blocks(theme=theme, css="footer {visibility: hidden}") as demo: with gr.Row(): with gr.Column(): image_input =gr.inputs.Image(type="pil", label="图片") with gr.Row(): button = gr.Button("提交", variant="primary") image_output = gr.Image(label="图片") button.click(fn=process_image, inputs=image_input, outputs=image_output) examples = gr.Examples(examples=[['document.png']], inputs=[image_input], label="例子") if __name__ == "__main__": demo.queue(concurrency_count=3).launch(server_name = "0.0.0.0")