multimodal-vqa-chatbot / src /streamlit_app.py
deepaksharma7532's picture
Update src/streamlit_app.py
f355d53 verified
Raw
History Blame Contribute Delete
3.73 kB
import streamlit as st
from PIL import Image
import torch
from transformers import BlipProcessor, BlipForConditionalGeneration, AutoTokenizer, AutoModelForSeq2SeqLM
st.set_page_config(page_title="Multimodal VQA Chatbot", page_icon="๐Ÿ‘๏ธ", layout="wide")
st.title("๐Ÿ‘๏ธ Multimodal Visual Question Answering Chatbot")
st.markdown("Upload an image and ask questions! This app cleanly connects Vision with Text.")
@st.cache_resource
def load_vqa_models():
# Load BLIP Vision Components
blip_id = "Salesforce/blip-image-captioning-base"
blip_processor = BlipProcessor.from_pretrained(blip_id)
blip_model = BlipForConditionalGeneration.from_pretrained(blip_id)
# Load LaMini Text Components
text_model_id = "MBZUAI/LaMini-Flan-T5-248M"
text_tokenizer = AutoTokenizer.from_pretrained(text_model_id)
text_model = AutoModelForSeq2SeqLM.from_pretrained(text_model_id)
return blip_processor, blip_model, text_tokenizer, text_model
blip_processor, blip_model, text_tokenizer, text_model = load_vqa_models()
# 3. CREATE TWO COLUMNS ON THE WEB SCREEN
col1, col2 = st.columns([1, 1])
# Column 1: For uploading and viewing the picture
with col1:
st.subheader("Step 1: Upload Source Image")
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded Image Source', use_column_width=True)
# Column 2: For typing questions and seeing the answer
with col2:
st.subheader("Step 2: Ask the AI Chatbot")
user_question = st.text_input("What would you like to know about this image?")
# When the user clicks the blue button, run this logic:
if st.button("Analyze & Generate Answer", type="primary"):
if uploaded_file is not None and user_question.strip():
with st.spinner("Processing visual components..."):
try:
inputs = blip_processor(images=image, text=user_question,return_tensors="pt")
with torch.no_grad():
vision_outputs = blip_model.generate(
**inputs,
no_repeat_ngram_size=3,
repetition_penalty=2.2,
max_new_tokens=80
)
clean_context_text = blip_processor.decode(vision_outputs[0], skip_special_tokens=True)
st.info(f"**BLIP Extracted Context:** {clean_context_text}")
prompt = f"Context: {clean_context_text}\nQuestion: {user_question}\nAnswer:"
text_inputs = text_tokenizer(prompt, return_tensors="pt")
with torch.no_grad():
text_outputs = text_model.generate(
**text_inputs,
max_new_tokens=150,
repetition_penalty=2.0,
no_repeat_ngram_size=3
)
final_answer = text_tokenizer.decode(text_outputs[0], skip_special_tokens=True)
st.success("### AI Chatbot Response:")
st.write(final_answer.strip())
except Exception as e:
st.error(f"An unexpected error occurred during execution: {str(e)}")
else:
st.warning("โš ๏ธ Please upload an image first and type a question.")