EVREAL / app.py
ercanburak's picture
first version of ffmpeg command
95312c3
raw
history blame
5.99 kB
import os
import subprocess
import streamlit as st
from utils import get_configs, get_display_names, get_path_for_viz, Layout
# st.header("EVREAL - Event-based Video Reconstruction Evaluation and Analysis Library")
#
# paper_link = "https://arxiv.org/abs/2305.00434"
# code_link = "https://github.com/ercanburak/EVREAL"
# page_link = "https://ercanburak.github.io/evreal.html"
# instructions_video = "https://www.youtube.com/watch?v="
#
# st.markdown("Paper: " + paper_link, unsafe_allow_html=True)
# st.markdown("Code: " + paper_link, unsafe_allow_html=True)
# st.markdown("Page: " + paper_link, unsafe_allow_html=True)
# st.markdown("Please see this video for instructions on how to use this tool: " + instructions_video, unsafe_allow_html=True)
st.title("Result Analysis Tool")
data_base_path = "/home/bercan/ebv/evreal_data"
font_path = "font/Ubuntu-B.ttf"
dataset_cfg_path = os.path.join("cfg", "dataset")
model_cfg_path = os.path.join("cfg", "model")
metric_cfg_path = os.path.join("cfg", "metric")
viz_cfg_path = os.path.join("cfg", "viz")
datasets = get_configs(dataset_cfg_path)
models = get_configs(model_cfg_path)
metrics = get_configs(metric_cfg_path)
visualizations = get_configs(viz_cfg_path)
dataset_display_names = get_display_names(datasets)
model_display_names = get_display_names(models)
metric_display_names = get_display_names(metrics)
viz_display_names = get_display_names(visualizations)
assert len(set(dataset_display_names)) == len(dataset_display_names), "Dataset display names are not unique"
assert len(set(model_display_names)) == len(model_display_names), "Model display names are not unique"
assert len(set(metric_display_names)) == len(metric_display_names), "Metric display names are not unique"
assert len(set(viz_display_names)) == len(viz_display_names), "Viz display names are not unique"
selected_model_names = st.multiselect('Select multiple methods to compare', model_display_names)
selected_models = [model for model in models if model['display_name'] in selected_model_names]
col1, col2 = st.columns(2)
with col1:
selected_dataset_name = st.selectbox('Select dataset', options=dataset_display_names)
selected_dataset = [dataset for dataset in datasets if dataset['display_name'] == selected_dataset_name][0]
with col2:
selected_sequence = st.selectbox('Select sequence', options=selected_dataset["sequences"].keys())
usable_metrics = [metric for metric in metrics if metric['no_ref'] == selected_dataset['no_ref']]
usable_metric_display_names = get_display_names(usable_metrics)
selected_metric_names = st.multiselect('Select metrics to display', usable_metric_display_names)
selected_metrics = [metric for metric in usable_metrics if metric['display_name'] in selected_metric_names]
if not selected_dataset['has_frames']:
usable_viz = [viz for viz in visualizations if viz['gt_type'] != 'frame']
else:
usable_viz = visualizations
usable_viz_display_names = get_display_names(usable_viz)
selected_viz = st.multiselect('Select other visualizations to display', usable_viz_display_names)
selected_visualizations = [viz for viz in visualizations if viz['display_name'] in selected_viz]
if not st.button('Get Results'):
st.stop()
gt_only_viz = [viz for viz in selected_visualizations if viz['viz_type'] == 'gt_only']
model_only_viz = [viz for viz in selected_visualizations if viz['viz_type'] == 'model_only']
both_viz = [viz for viz in selected_visualizations if viz['viz_type'] == 'both']
recon_viz = {"name": "recon", "display_name": "Reconstruction", "viz_type": "both", "gt_type": "frame"}
# ground_truth = {"name": "gt", "display_name": "Ground Truth", "model_id": "groundtruth"}
model_viz = [recon_viz] + both_viz + selected_metrics + model_only_viz
num_model_rows = len(model_viz)
gt_viz = []
if selected_dataset['has_frames']:
gt_viz.append(recon_viz)
gt_viz.extend([viz for viz in both_viz if viz['gt_type'] == 'frame'])
gt_viz.extend([viz for viz in gt_only_viz if viz['gt_type'] == 'frame'])
gt_viz.extend([viz for viz in both_viz if viz['gt_type'] == 'event'])
gt_viz.extend([viz for viz in gt_only_viz if viz['gt_type'] == 'event'])
# print(get_display_names(model_viz))
# print(get_display_names(gt_viz))
# st.stop()
num_gt_rows = len(gt_viz)
num_rows = max(num_model_rows, num_gt_rows)
num_model_columns = len(selected_models)
num_elements = num_rows * num_model_columns
layout = Layout(num_rows, num_model_columns)
layout_str = layout.get_layout_str()
video_paths = []
for row_idx in range(num_rows):
for col_idx in range(num_model_columns):
video_path = get_path_for_viz(data_base_path, selected_dataset, selected_sequence,
selected_models[col_idx], model_viz[row_idx])
print(video_path)
video_paths.append(video_path)
# if os.path.isfile(video_path):
# video_paths.append(video_path)
# else:
# print("Video path does not exist: " + video_path)
#
# assert len(video_paths) == num_elements, "Number of video paths is not equal to expected number of elements"
inputs_str = " ".join(["-i " + video_path for video_path in video_paths])
crop_str = "crop=trunc(iw/2)*2:trunc(ih/2)*2"
w = selected_dataset["width"]
input_scaling_parts = []
xstack_input_parts = []
for i in range(num_elements):
input_scaling_part = "[{}:v]scale={}:-1,{}[v{}]".format(i, w, crop_str, i)
input_scaling_parts.append(input_scaling_part)
xstack_input_part = "[v{}]".format(i)
xstack_input_parts.append(xstack_input_part)
input_scaling_str = ";".join(input_scaling_parts)
xstack_input_str = "".join(xstack_input_parts)
# opt = "-c:v libx264 -preset veryslow -crf 18 -c:a copy"
opt = ""
ffmpeg_command_str = "ffmpeg -y " + inputs_str + " -filter_complex \"" + input_scaling_str + ";" + xstack_input_str + "xstack=inputs=" + str(num_elements) + ":layout=" + layout_str + "\"" + opt + " output.mp4"
print(ffmpeg_command_str)
subprocess.call(ffmpeg_command_str, shell=True)