NourFakih's picture
Create app.py
f42cfc0 verified
raw
history blame
4.94 kB
import streamlit as st
import os
import cv2
import pandas as pd
from PIL import Image
from transformers import VisionEncoderDecoderModel, ViTFeatureExtractor, AutoTokenizer, pipeline, AutoModelForSeq2SeqLM
import nltk
import tempfile
import zipfile
nltk.download('wordnet')
nltk.download('omw-1.4')
# Load the pre-trained models for image captioning and summarization
model_name = "NourFakih/Vit-GPT2-COCO2017Flickr-85k-09"
model = VisionEncoderDecoderModel.from_pretrained(model_name)
feature_extractor = ViTFeatureExtractor.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model_sum_name = "google-t5/t5-base"
tokenizer_sum = AutoTokenizer.from_pretrained("google-t5/t5-base")
model_sum = AutoModelForSeq2SeqLM.from_pretrained("google-t5/t5-base")
summarize_pipe = pipeline("summarization", model=model_sum_name)
def generate_caption(image):
pixel_values = feature_extractor(images=image, return_tensors="pt").pixel_values
output_ids = model.generate(pixel_values)
caption = tokenizer.decode(output_ids[0], skip_special_tokens=True)
return caption
def get_synonyms(word):
synonyms = set()
for syn in wordnet.synsets(word):
for lemma in syn.lemmas():
synonyms.add(lemma.name())
return synonyms
def search_captions(query, captions):
query_words = query.split()
query_synonyms = set(query_words)
for word in query_words:
query_synonyms.update(get_synonyms(word))
results = []
for path, caption in captions.items():
if any(word in caption.split() for word in query_synonyms):
results.append((path, caption))
return results
def process_video(video_path, frame_interval):
cap = cv2.VideoCapture(video_path)
frames = []
captions = []
success, frame = cap.read()
count = 0
while success:
if count % frame_interval == 0:
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(frame_rgb)
caption = generate_caption(pil_image)
frames.append(frame)
captions.append(caption)
success, frame = cap.read()
count += 1
cap.release()
df = pd.DataFrame({'Frame': frames, 'Caption': captions})
return frames, df
st.title("Combined Video Captioning and Gallery App")
# Sidebar for search functionality
with st.sidebar:
query = st.text_input("Search videos by caption:")
# Options for input strategy
input_option = st.selectbox("Select input method:", ["Folder Path", "Upload Video", "Upload ZIP"])
video_files = []
if input_option == "Folder Path":
folder_path = st.text_input("Enter the folder path containing videos:")
if folder_path and os.path.isdir(folder_path):
video_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith(('mp4', 'avi', 'mov', 'mkv'))]
elif input_option == "Upload Video":
uploaded_files = st.file_uploader("Upload video files", type=["mp4", "avi", "mov", "mkv"], accept_multiple_files=True)
if uploaded_files:
for uploaded_file in uploaded_files:
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
temp_file.write(uploaded_file.read())
video_files.append(temp_file.name)
elif input_option == "Upload ZIP":
uploaded_zip = st.file_uploader("Upload a ZIP file containing videos", type=["zip"])
if uploaded_zip:
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
temp_file.write(uploaded_zip.read())
with zipfile.ZipFile(temp_file.name, 'r') as zip_ref:
zip_ref.extractall("/tmp/videos")
video_files = [os.path.join("/tmp/videos", f) for f in zip_ref.namelist() if f.lower().endswith(('mp4', 'avi', 'mov', 'mkv'))]
if video_files:
captions = {}
for video_file in video_files:
frames, captions_df = process_video(video_file, frame_interval=20)
if frames and not captions_df.empty:
generated_captions = ' '.join(captions_df['Caption'])
summary = summarize_pipe(generated_captions)[0]['summary_text']
captions[video_file] = summary
# Display videos in a 4-column grid
cols = st.columns(4)
for idx, (video_path, summary) in enumerate(captions.items()):
with cols[idx % 4]:
st.video(video_path, caption=summary)
if query:
results = search_captions(query, captions)
st.write("Search Results:")
for video_path, summary in results:
st.video(video_path, caption=summary)
# Save captions to CSV and provide a download button
if st.button("Generate CSV"):
df = pd.DataFrame(list(captions.items()), columns=['Video', 'Caption'])
csv = df.to_csv(index=False)
st.download_button(label="Download captions as CSV", data=csv, file_name="captions.csv", mime="text/csv")