SMeyersMrOvkill
v0.6
4b2e1d6
raw
history blame
5.21 kB
import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM
import json
import torch
import requests
import time
import random
from PIL import Image
from typing import Union
import os
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device}" if device != "cpu" else "Using CPU")
def _load_model():
tokenizer = AutoTokenizer.from_pretrained("vikhyatk/moondream2", trust_remote_code=True, revision="2024-05-08", torch_dtype=(torch.bfloat16 if device == 'cuda' else torch.float32))
model = AutoModelForCausalLM.from_pretrained("vikhyatk/moondream2", device_map=device, trust_remote_code=True, revision="2024-05-08")
return (model, tokenizer)
class MoonDream():
def __init__(self, model=None, tokenizer=None):
self.model, self.tokenizer = (model, tokenizer)
if not model or model is None or not tokenizer or tokenizer is None:
self.model, self.tokenizer = _load_model()
self.device = device
self.model.to(self.device)
def __call__(self, question, imgs):
imn = 0
for img in imgs:
img = self.model.encode_image(img)
res = self.model.answer_question(question=question, image_embeds=img, tokenizer=self.tokenizer)
yield res
return
md = MoonDream()
def _respond_one(question, img):
txt = ""
yield (txt := txt + MoonDream()(question, [img]))
return txt
def respond_batch(question, **imgs):
md = MoonDream()
for img in imgs.values():
res = md(question, img)
for r in res:
yield r
yield "\n\n\n\n\n\n"
return
red = Image.new("RGB", (192,192), (255,0,0))
green = Image.new("RGB", (192,192), (0,255,0))
blue = Image.new("RGB", (192,192), (0,0,255))
res = respond_batch("What color is this? Elaborate upon what emotion registers most strongly with you upon viewing. ", imgs=[red, green, blue])
for r in res:
print(r)
if "\n\n\n\n\n\n" in r:
break
def dual_images(img1: Image):
# Ran once for each img to it's respective output. Output should be detailed str of description/feature extraction/interrogation.
md = MoonDream()
res = md("Describe the image in plain english ", [img1])
txt = ""
for r in res:
yield (txt := txt + r)
return
import os
def merge_descriptions_to_prompt(mi, d1, d2):
from together import Together
tog = Together(api_key=os.getenv("TOGETHER_KEY"))
res = tog.completions.create(prompt=f"""Describe what would result if the following two descriptions were describing one thing.
### Description 1:
```text
{d1}
```
### Description 2:
```text
{d2}
```
Merge-Specific Instructions:
```text
{mi}
```
Ensure you end your output with ```\\n
---
Complete Description:
```text""", model="meta-llama/Meta-Llama-3-70B", stop=["```"], max_tokens=1024)
return res.choices[0].text.split("```")[0]
def xform_image_description(img, inst):
#md = MoonDream()
from together import Together
desc = dual_images(img)
tog = Together(api_key=os.getenv("TOGETHER_KEY"))
prompt=f"""Describe the image in aggressively verbose detail. I must know every freckle upon a man's brow and each blade of the grass intimately.\nDescription: ```text\n{desc}\n```\nInstructions:\n```text\n{inst}\n```\n\n\n---\nDetailed Description:\n```text"""
res = tog.completions.create(prompt=prompt, model="meta-llama/Meta-Llama-3-70B", stop=["```"], max_tokens=1024)
return res.choices[0].text[len(prompt):].split("```")[0]
def simple_desc(img, prompt):
return md(img, prompt)
with gr.Blocks() as if_simple_description:
with gr.Row():
with gr.Column():
simple_img = gr.Image(type="pil")
with gr.Column():
simple_text = gr.Textbox(label="prompt ( Shift+Enter sends )")
simple_btn = gr.Button("Prompt & Image 2 Text")
simple_btn.click(simple_desc, inputs=[simple_img, simple_desc], outputs=[simple_desc])
"""
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
im1 = gr.Image(label="image 1", type='pil')
otp2 = gr.Textbox(label="image 1", interactive=True)
with gr.Column():
im2 = gr.Image(label="image 2", type='pil')
otp3 = gr.Textbox(label="image 2")
with gr.Row():
minst = gr.Textbox(label="Merge Instructions")
with gr.Row():
btn2 = gr.Button("submit batch")
with gr.Row():
with gr.Column():
im1 = gr.Image(label="image 1", type='pil')
otp2 = gr.Textbox(label="individual batch output (left)", interactive=True)
with gr.Column():
im2 = gr.Image(label="image 2", type='pil')
otp3 = gr.Textbox(label="individual batch output (right)", interactive=True)
with gr.Row():
otp4 = gr.Textbox(label="batch output ( combined )", interactive=True, lines=4)
with gr.Row():
btn_scd = gr.Button("Merge Descriptions to Single Combined Description")
btn2.click(dual_images, inputs=[im1], outputs=[otp2])
btn2.click(dual_images, inputs=[im2], outputs=[otp3])
btn.click(dual_images, inputs=[img], outputs=[otpt])
btn_scd.click(merge_descriptions_to_prompt, inputs=[minst, otp2, otp3], outputs=[otp4])
demo.launch(debug=True, share=True)
"""
with gr.TabbedInterface(if_simple_description) as ifc:
ifc.launch(share=False, server_host="0.0.0.0", server_port=7860)