batik / generate_embeddings.py
ncoria's picture
remove save_csv toggle
8cfd894 verified
import streamlit as st
import pandas as pd
from utils.utils import create_embeddings_csv_io, create_annot_fname_dict_io, generate_embeddings_stream_io
if "video_embeddings" not in st.session_state:
st.session_state.video_embeddings = None
st.session_state.video_frames = None
st.session_state.fnames = []
st.title('batik: embedding generator')
uploaded_files = st.file_uploader("Choose a video file", type=['seq', 'mp4'], accept_multiple_files=True)
with st.form('initial_settings'):
st.header('Embedding Generation Options')
model_select = st.selectbox('Select Model', ['SLIP', 'CLIP'])
downsample_rate = st.number_input('Downsample Rate',value=4)
#save_csv = st.toggle('Save Individual Results', value=False)
submit_initial_settings = st.form_submit_button('Create Embeddings', type='secondary')
if submit_initial_settings and uploaded_files is not None and len(uploaded_files) > 0:
video_embeddings, video_frames = generate_embeddings_stream_io(uploaded_files,
model_select,
downsample_rate,
False)
fnames = [vid_file.name for vid_file in uploaded_files]
st.session_state.video_embeddings = video_embeddings
st.session_state.video_frames = video_frames
st.session_state.fnames = fnames
if st.session_state.video_embeddings is not None:
st.header('CSV Configuration Options')
st.markdown('If using `.annot` files and multiple files should be grouped together, '\
'please ensure that they share a common name and end with a number describing '\
'the order of the files. For example:\n\n'\
'`mouse_224_file_1.annot`, `mouse_224_file_2.annot`.')
annot_files = st.file_uploader("Upload all annotation files", type=['.annot','.csv'], accept_multiple_files=True)
annot_options = []
if annot_files is not None and len(annot_files) > 0:
annot_fnames = [annot_file.name for annot_file in annot_files]
annot_fname_dict = create_annot_fname_dict_io(annot_fnames=annot_fnames,
annot_files=annot_files)
annot_options = [str(key) for key in annot_fname_dict.keys()]
if len(annot_options) > 0:
with st.form('csv_settings'):
csv_setting_def = pd.DataFrame(
{
"File Name" : st.session_state.fnames,
"Annotations" : [
"Upload File" for _ in st.session_state.fnames
],
"Test" : [
False for _ in st.session_state.fnames
],
"View" : [
"Top" for _ in st.session_state.fnames
],
"Condition" : [
"None" for _ in st.session_state.fnames
]
}
)
csv_settings = st.data_editor(
csv_setting_def,
column_config={
"Annotations" : st.column_config.SelectboxColumn(
"Annotations",
help="The annotation file(s) to use for the given video file.",
width="medium",
options=annot_options,
required=True
),
"Test" : st.column_config.CheckboxColumn(
"Test",
help="Designate file(s) to use as the test set.",
default=False,
required=True
),
"View" : st.column_config.SelectboxColumn(
"View",
help="The view used within the video (either Top or Front).",
options=["Top", "Front"],
required=True
),
"Condition" : st.column_config.TextColumn(
"Condition",
help="A condition the video has (i.e. Control).",
default="None",
max_chars=30,
validate=r"[a-z]+$",
)
},
hide_index=True
)
save_csv_bttn = st.form_submit_button("Create CSV")
if save_csv_bttn and csv_settings is not None:
annot_chosen_options = csv_settings['Annotations'].tolist()
annot_option = [annot_fname_dict[key] for key in annot_chosen_options]
test_chosen_option = csv_settings['Test'].tolist()
test_option = [st.session_state.fnames[i] for i, is_test in enumerate(test_chosen_option) if is_test]
view_option = csv_settings['View'].tolist()
condition_option = csv_settings['Condition'].tolist()
out_name = st.text_input("Embeddings Outpit File Name", "out.csv")
try:
df = create_embeddings_csv_io(out=out_name,
fnames=st.session_state.fnames,
embeddings=st.session_state.video_embeddings,
frames=st.session_state.video_frames,
annotations=annot_option,
test_fnames=test_option,
views=view_option,
conditions=condition_option,
downsample_rate=downsample_rate)
st.success('Created Embeddings File!', icon="✅")
st.download_button(
label="Download CSV",
data=df.to_csv().encode("utf-8"),
file_name=out_name,
mime="text/csv"
)
except:
st.error('Something went wrong.')
else:
st.text('Please Upload Files')
else:
st.text('Please Upload Files')