video_screen / app.py
AlexCool2024's picture
Update app.py
07ecc9d verified
raw
history blame
2.74 kB
import streamlit as st
import numpy as np
import cv2
import torch
from PIL import Image
from transformers import AutoTokenizer, ViTFeatureExtractor, VisionEncoderDecoderModel
# Инициализация модели
model_id = "nttdataspain/vit-gpt2-stablediffusion2-lora"
model = VisionEncoderDecoderModel.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
feature_extractor = ViTFeatureExtractor.from_pretrained(model_id)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
# Функция для получения текста из изображения
def predict(image):
img = image.convert('RGB')
model.eval()
pixel_values = feature_extractor(images=[img], return_tensors="pt").pixel_values.to(device)
with torch.no_grad():
output_ids = model.generate(pixel_values, max_length=16, num_beams=4, return_dict_in_generate=True).sequences
preds = tokenizer.batch_decode(output_ids, skip_special_tokens=True)
preds = [pred.strip() for pred in preds]
return preds[0]
# Streamlit интерфейс
st.title("Video Frame to Image Description")
# Загрузка видеофайла
uploaded_file = st.file_uploader("Upload a video file", type=["mp4", "avi", "mov"])
cap = None # Инициализируем объект cap как None
if uploaded_file is not None:
# Создаем временный файл для хранения видео
tfile = tempfile.NamedTemporaryFile(delete=False)
tfile.write(uploaded_file.read())
# Захват видео
cap = cv2.VideoCapture(tfile.name)
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
if length > 0:
# Выбор случайного кадра
random_frame = np.random.randint(length)
cap.set(cv2.CAP_PROP_POS_FRAMES, random_frame)
ret, frame = cap.read()
if ret:
# Конвертация кадра OpenCV в PIL Image
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(frame_rgb)
# Отображение выбранного кадра
st.image(pil_image, caption=f"Random Frame {random_frame}")
# Получение текста из изображения
description = predict(pil_image)
st.success(f"Generated Description: {description}")
else:
st.error("Error: Could not read a frame from the video.")
else:
st.error("Error: Video file does not contain any frames.")
# Проверяем, был ли cap создан, и только тогда освобождаем ресурсы
if cap is not None:
cap.release()