vigneshwar472's picture
Update app.py 2
492def7 verified
# import libraries and load the model
import random
import requests
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import torch
from transformers import AutoProcessor, Owlv2ForObjectDetection
from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_CLIP_STD
obj_processor = AutoProcessor.from_pretrained("google/owlv2-base-patch16-ensemble")
obj_model = Owlv2ForObjectDetection.from_pretrained("google/owlv2-base-patch16-ensemble")
colors = [
(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 165, 0), (75, 0, 130),
(255, 255, 0), (0, 255, 255), (255, 105, 180), (138, 43, 226), (0, 128, 0),
(0, 128, 128), (255, 20, 147), (64, 224, 208), (128, 0, 128), (70, 130, 180),
(220, 20, 60), (255, 140, 0), (34, 139, 34), (218, 112, 214), (255, 99, 71),
(47, 79, 79), (186, 85, 211), (240, 230, 140), (169, 169, 169), (199, 21, 133)
]
def detect_objects(image, objects):
texts = [objects]
inputs = obj_processor(text=texts, images=image, return_tensors="pt")
with torch.no_grad():
outputs = obj_model(**inputs)
target_sizes = torch.Tensor([image.size[::-1]])
results = obj_processor.post_process_object_detection(
outputs=outputs, threshold=0.2, target_sizes=target_sizes
)
i = 0
text = texts[i]
boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"]
return image, boxes, scores, labels
def annotate_image(image, boxes, scores, labels, objects):
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
for i, (box, score, label) in enumerate(zip(boxes, scores, labels)):
box = [round(coord, 2) for coord in box.tolist()]
color = colors[label % len(colors)]
draw.rectangle(box, outline=color, width=3)
draw.text((box[0], box[1]), f"{objects[label]}: {score:.2f}", font=font, fill=color)
return image
from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from PIL import Image
import requests
#cbt_processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-2B-Instruct")
#cbt_model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-2B-Instruct", device_map="cuda")
cbt_model = Qwen2VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen2-VL-2B-Instruct",
torch_dtype="auto",
device_map="auto",
)
cbt_processor = AutoProcessor.from_pretrained(
"Qwen/Qwen2-VL-2B-Instruct"
)
import random
import time
import gradio as gr
global history
history = [
{
"role": "system",
"content" : [
{
"type": "image",
},
{
"type": "text",
"text": "You are an conversation image recognition chatbot. Communicate with humans using natural language. Recognize the images, have a spatial understanding and answer the questions in a concise manner. Generate the best response for a user query. It must be correct lexically and grammatically.",
}
]
}
]
with gr.Blocks() as demo:
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("## Upload an Image")
image_input = gr.Image(type="pil", label="Upload your image here")
objects_input = gr.Textbox(label="Enter the objects to detect (comma-separated)", placeholder="e.g. 'cat, dog, car'")
image_output = gr.Image(type="pil", label="Detected Objects")
def run_object_detection(image, objects):
object_list = [obj.strip() for obj in objects.split(",")]
image, boxes, scores, labels = detect_objects(image, object_list)
annotated_image = annotate_image(image, boxes, scores, labels, object_list)
history.append({
'role': 'system',
'content': [
{
'type': 'text',
'text': f'In the image the objects detected are {labels}'
}
]
})
return annotated_image
detect_button = gr.Button("Detect Objects")
detect_button.click(fn=run_object_detection, inputs=[image_input, objects_input], outputs=image_output)
with gr.Column(scale=2):
chatbot = gr.Chatbot()
msg = gr.Textbox(label='Chat with your image', placeholder='Describe the image and highlight the key visual information')
clear = gr.ClearButton([msg, chatbot])
def user(message, chat_history):
return "", chat_history + [[message, ""]]
def chat_function(image, chat_history):
message = ''
if chat_history[-1][0] is not None:
message = str(chat_history[-1][0])
history.append({
"role": "user",
"content" : [
{
"type": "text",
"text": message
}
]
})
text_prompt = cbt_processor.apply_chat_template(history, add_generation_prompt=True)
inputs = cbt_processor(
text = [text_prompt],
images = [image],
padding = True,
return_tensors = "pt"
)
#inputs = inputs.to("cuda")
output_ids = cbt_model.generate(**inputs, max_new_tokens=512)
generated_ids = [
output_ids[len(input_ids) :]
for input_ids, output_ids in zip(inputs.input_ids, output_ids)
]
bot_output = cbt_processor.batch_decode(
generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True
)
history.append({
"role": "assistant",
"content" : [
{
"type": "text",
"text": bot_output
}
]
})
bot_output_str = str(bot_output).replace('"', '').replace('[', '').replace(']', '').replace("\n", "<br>")
chat_history[-1][1] = ""
for character in bot_output_str:
chat_history[-1][1] += character
time.sleep(0.05)
yield chat_history
msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(chat_function, [image_input, chatbot], [chatbot])
clear.click(lambda :None, None, chatbot, queue=False)
demo.launch(debug=True)