Chatbot1 / app.py
saherPervaiz's picture
Update app.py
c9deabe verified
raw
history blame
5.24 kB
import gradio as gr
from transformers import BlipProcessor, BlipForConditionalGeneration
import torch
from PIL import Image
# Load the BLIP image captioning model and processor
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
# Function to generate description for an image using BLIP
def describe_image(image: Image.Image):
try:
# Preprocess the image and pass it to the model
inputs = processor(images=image, return_tensors="pt")
# Generate caption using the model
out = model.generate(**inputs)
description = processor.decode(out[0], skip_special_tokens=True)
return description
except Exception as e:
return f"Error describing the image: {e}"
# Define chatbot interaction function
def chat(user_input, chat_history, image):
try:
# Generate text response (text processing happens via your custom function)
response = f"AI Response: {user_input}" # Placeholder response for now
# If an image is uploaded, describe it using the image captioning model
if image is not None:
image_description = describe_image(image)
response += f"\n\n[Image Description]: {image_description}"
else:
image_description = "No image uploaded."
# Update chat history with both user input and AI response
chat_history.append(("User", user_input))
chat_history.append(("AI", response))
# Format chat history for display
formatted_history = "\n".join(
[f"{role}: {message}" for role, message in chat_history]
)
return formatted_history, chat_history
except Exception as e:
return f"Error: {e}", chat_history
# Create Gradio interface with updated light boundary design and image upload
with gr.Blocks(css="""
body {
background-color: #f7f7f7;
color: #333;
font-family: 'Roboto', sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.gradio-container {
width: 70%;
max-width: 500px;
background-color: #ffffff;
padding: 30px;
border-radius: 15px;
box-shadow: 0px 10px 30px rgba(0, 0, 0, 0.1);
border: 1px solid #dcdcdc; /* Light border */
}
.gradio-container .textbox, .gradio-container .button {
background-color: #eeeeee;
color: #333;
border: 1px solid #dcdcdc; /* Light border */
border-radius: 10px;
padding: 12px;
font-size: 16px;
}
.gradio-container .textbox:focus, .gradio-container .button:focus {
border-color: #007bff;
box-shadow: 0px 0px 5px rgba(0, 123, 255, 0.5);
}
.gradio-container .button:hover {
background-color: #007bff;
color: #fff;
cursor: pointer;
}
.textbox {
margin-bottom: 20px;
}
#chatbox {
height: 350px;
overflow-y: auto;
border: 1px solid #dcdcdc; /* Light border */
padding: 20px;
border-radius: 10px;
background-color: #f9f9f9;
color: #333;
margin-bottom: 20px;
font-size: 14px;
line-height: 1.6;
font-family: 'Arial', sans-serif;
}
.user-message {
background-color: #e0f7fa;
padding: 10px;
border-radius: 10px;
margin-bottom: 8px;
max-width: 75%;
}
.ai-message {
background-color: #e8f5e9;
padding: 10px;
border-radius: 10px;
margin-bottom: 8px;
max-width: 75%;
margin-left: auto;
}
""") as demo:
gr.Markdown("## 🤖 **Professional Groq Chatbot with Image Description**")
gr.Markdown("Type your message below or upload an image to get a description!")
# Define layout with vertical alignment
with gr.Column():
user_input = gr.Textbox(
label="Your Message",
placeholder="Ask me anything!",
lines=2,
interactive=True,
)
submit_button = gr.Button("Send")
clear_button = gr.Button("Clear Chat")
chatbot_output = gr.Textbox(
label="Chat History",
placeholder="AI's responses will appear here.",
lines=15,
interactive=False,
elem_id="chatbox",
)
# Image upload component
image_input = gr.Image(
label="Upload Image for Description",
type="pil", # PIL (Python Imaging Library) type for image input
interactive=True,
elem_id="image-upload",
)
# State to hold chat history
chat_history = gr.State([])
# Button functionalities
submit_button.click(
fn=chat,
inputs=[user_input, chat_history, image_input],
outputs=[chatbot_output, chat_history],
)
clear_button.click(
fn=lambda: ("", []),
inputs=[],
outputs=[chatbot_output, chat_history],
)
# Launch locally
if __name__ == "__main__":
demo.launch()