text-generation-webui/extensions/send_pictures/script.py

48 lines
2.1 KiB
Python
Raw Normal View History

2023-02-25 03:26:15 +00:00
import base64
from io import BytesIO
import gradio as gr
2023-03-22 18:55:03 +00:00
import torch
from transformers import BlipForConditionalGeneration, BlipProcessor
2023-03-02 04:23:18 +00:00
from modules import chat, shared
2023-04-12 13:27:06 +00:00
from modules.ui import gather_interface_values
2023-02-25 05:13:24 +00:00
# If 'state' is True, will hijack the next chat generation with
2023-02-25 12:23:02 +00:00
# custom input text given by 'value' in the format [text, visible_text]
2023-02-25 03:26:15 +00:00
input_hijack = {
2023-02-25 05:13:24 +00:00
'state': False,
2023-02-25 04:08:17 +00:00
'value': ["", ""]
}
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base", torch_dtype=torch.float32).to("cpu")
def caption_image(raw_image):
inputs = processor(raw_image.convert('RGB'), return_tensors="pt").to("cpu", torch.float32)
out = model.generate(**inputs, max_new_tokens=100)
return processor.decode(out[0], skip_special_tokens=True)
2023-02-25 03:26:15 +00:00
def generate_chat_picture(picture, name1, name2):
2023-04-08 04:55:16 +00:00
text = f'*{name1} sends {name2} a picture that contains the following: “{caption_image(picture)}”*'
# lower the resolution of sent images for the chat, otherwise the log size gets out of control quickly with all the base64 values in visible history
2023-03-22 19:09:48 +00:00
picture.thumbnail((300, 300))
2023-02-25 03:26:15 +00:00
buffer = BytesIO()
picture.save(buffer, format="JPEG")
img_str = base64.b64encode(buffer.getvalue()).decode('utf-8')
visible_text = f'<img src="data:image/jpeg;base64,{img_str}" alt="{text}">'
2023-02-25 03:26:15 +00:00
return text, visible_text
2023-02-25 03:26:15 +00:00
def ui():
picture_select = gr.Image(label='Send a picture', type='pil')
2023-04-12 13:30:12 +00:00
# Prepare the input hijack, update the interface values, call the generation function, and clear the picture
2023-04-12 13:27:06 +00:00
picture_select.upload(
2023-04-12 13:30:12 +00:00
lambda picture, name1, name2: input_hijack.update({"state": True, "value": generate_chat_picture(picture, name1, name2)}), [picture_select, shared.gradio['name1'], shared.gradio['name2']], None).then(
2023-04-12 13:27:06 +00:00
gather_interface_values, [shared.gradio[k] for k in shared.input_elements], shared.gradio['interface_state']).then(
2023-05-11 18:37:04 +00:00
chat.generate_chat_reply_wrapper, shared.input_params, shared.gradio['display'], show_progress=False).then(
2023-04-12 13:27:06 +00:00
lambda: None, None, picture_select, show_progress=False)