nam_nguyenhoai_AI
fix bug
0d6a51b
raw
history blame
5.97 kB
import gradio as gr
import cv2
import os
import tempfile
import numpy as np
from utils import *
from algorithm import *
def make_video(video_path, outdir='./summarized_video',encoder='Kmeans'):
if encoder not in ["Kmeans", "Sum of Squared Difference 01", "Sum of Squared Difference 02"]:
encoder = "Kmeans"
# nen them vao cac truong hop mo hinh khac
margin_width = 50
model, processor, device = load_model()
# total_params = sum(param.numel() for param in model.parameters())
# print('Total parameters: {:.2f}M'.format(total_params / 1e6))
if os.path.isfile(video_path):
if video_path.endswith('txt'):
with open(video_path, 'r') as f:
lines = f.read().splitlines()
else:
filenames = [video_path]
else:
filenames = os.listdir(video_path)
filenames = [os.path.join(video_path, filename) for filename in filenames if not filename.startswith('.')]
filenames.sort()
for k, filename in enumerate(filenames):
print('Progress {:}/{:},'.format(k+1, len(filenames)), 'Processing', filename)
raw_video = cv2.VideoCapture(filename)
frame_width, frame_height = int(raw_video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(raw_video.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_rate = int(raw_video.get(cv2.CAP_PROP_FPS))
#length = int(raw_video.get(cv2.CAP_PROP_FRAME_COUNT))
output_width = frame_width * 2 + margin_width
filename = os.path.basename(filename)
# Find the size to resize
if "shortest_edge" in processor.size:
height = width = processor.size["shortest_edge"]
else:
height = processor.size["height"]
width = processor.size["width"]
resize_to = (height, width)
# F/Fs
clip_sample_rate = 1
# F
num_frames = 8
frames = []
features = []
# output_path = os.path.join(outdir, filename[:filename.rfind('.')] + '_video_depth.mp4')
with tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') as tmpfile:
output_path = tmpfile.name
#out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*"avc1"), frame_rate, (output_width, frame_height))
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, frame_rate, (output_width, frame_height))
# count=0
while raw_video.isOpened():
ret, raw_frame = raw_video.read()
if not ret:
break
raw_frame = cv2.resize(raw_frame, resize_to)
frames.append(raw_frame)
# Find key frames by selecting frames with clip_sample_rate
key_frames = frames[::clip_sample_rate]
#print('total of frames after sample:', len(selected_frames))
# Remove redundant frames to make the number of frames can be divided by num_frames
num_redudant_frames = len(key_frames) - (len(key_frames) % num_frames)
# Final key frames
final_key_frames = key_frames[:num_redudant_frames]
#print('total of frames after remove redundant frames:', len(selected_frames))
for i in range(0, len(final_key_frames), num_frames):
if i % num_frames*50 == 0:
print(f"Loading {i}/{len(final_key_frames)}")
# Input clip to the model
input_frames = final_key_frames[i:i+num_frames]
# Extract features
batch_features = extract_features(input_frames, device, model, processor)
# Convert to numpy array to decrease the memory usage
batch_features = np.array(batch_features.cpu().detach().numpy())
features.extend(batch_features)
number_of_clusters = round(len(features)*0.15)
selected_frames = []
if encoder == "Kmeans":
selected_frames = kmeans(features, number_of_clusters)
elif encoder == "Sum of Squared Difference 01":
selected_frames = tt01(features, 400)
else:
selected_frames = tt02(features, 400)
video_writer = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), frame_rate, (frames[0].shape[1], frames[0].shape[0]))
for idx in selected_frames:
video_writer.write(frames[idx])
raw_video.release()
video_writer.release()
print("Completed summarizing the video (wait for a moment to load).")
return output_path
css = """
#img-display-container {
max-height: 100vh;
}
#img-display-input {
max-height: 80vh;
}
#img-display-output {
max-height: 80vh;
}
"""
title = "# Video Summarization Demo"
description = """Video Summarization using Timesformer.
Author: Nguyen Hoai Nam.
"""
with gr.Blocks(css=css) as demo:
gr.Markdown(title)
gr.Markdown(description)
gr.Markdown("### Video Summarization demo")
with gr.Row():
input_video = gr.Video(label="Input Video")
algorithm_type = gr.Dropdown(["Kmeans", "Sum of Squared Difference 01", "Sum of Squared Difference 02"], type="value", label='Algorithm')
submit = gr.Button("Submit")
processed_video = gr.Video(label="Summarized Video")
def on_submit(uploaded_video,algorithm_type):
# Process the video and get the path of the output video
#output_video_path = make_video(uploaded_video,encoder=model_type)
pass
#return output_video_path
submit.click(on_submit, inputs=[input_video, algorithm_type], outputs=processed_video)
#example_files = os.listdir('assets/examples_video')
#example_files.sort()
#example_files = [os.path.join('assets/examples_video', filename) for filename in example_files]
#examples = gr.Examples(examples=example_files, inputs=[input_video], outputs=processed_video, fn=on_submit, cache_examples=True)
if __name__ == '__main__':
demo.queue().launch()