|
import torch |
|
import numpy as np |
|
import cv2 |
|
import tempfile, base64 |
|
import streamlit as st |
|
import os |
|
|
|
|
|
def readb64(uri): |
|
encoded_data = uri.split(',')[-1] |
|
nparr = np.frombuffer(base64.b64decode(encoded_data), np.uint8) |
|
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) |
|
return img |
|
|
|
def img2base64(img, extension="jpg"): |
|
_, img_encoded = cv2.imencode(f".{extension}", img) |
|
img_base64 = base64.b64encode(img_encoded) |
|
img_base64 = img_base64.decode('utf-8') |
|
return img_base64 |
|
|
|
def binary2video(video_binary): |
|
temp_ = tempfile.NamedTemporaryFile(suffix='.mp4') |
|
|
|
temp_.write(video_binary) |
|
video_capture = cv2.VideoCapture(temp_.name) |
|
ret, frame = video_capture.read() |
|
return video_capture |
|
|
|
def extract_frames(data_path, interval=30, max_frames=50): |
|
"""Method to extract frames""" |
|
cap = cv2.VideoCapture(data_path) |
|
frame_num = 0 |
|
frames = list() |
|
|
|
while cap.isOpened(): |
|
success, image = cap.read() |
|
if not success: |
|
break |
|
if frame_num % interval == 0: |
|
frames.append(image) |
|
frame_num += 1 |
|
if len(frames) > max_frames: |
|
break |
|
cap.release() |
|
return frames |
|
|
|
def update_dir(key): |
|
choice = st.session_state[key] |
|
if os.path.isdir(os.path.join(st.session_state[key+'curr_dir'], choice)): |
|
st.session_state[key+'curr_dir'] = os.path.normpath(os.path.join(st.session_state[key+'curr_dir'], choice)) |
|
files = sorted(os.listdir(st.session_state[key+'curr_dir'])) |
|
if "images" in files: |
|
files.remove("images") |
|
st.session_state[key+'files'] = files |
|
|
|
def st_file_selector(st_placeholder, path='.', label='Select a file/folder', key = 'selected'): |
|
if key+'curr_dir' not in st.session_state: |
|
base_path = '.' if path is None or path == '' else path |
|
base_path = base_path if os.path.isdir(base_path) else os.path.dirname(base_path) |
|
base_path = '.' if base_path is None or base_path == '' else base_path |
|
|
|
files = sorted(os.listdir(base_path)) |
|
files.insert(0, 'Choose a file...') |
|
if "images" in files: |
|
files.remove("images") |
|
st.session_state[key+'files'] = files |
|
st.session_state[key+'curr_dir'] = base_path |
|
else: |
|
base_path = st.session_state[key+'curr_dir'] |
|
|
|
selected_file = st_placeholder.selectbox(label=label, |
|
options=st.session_state[key+'files'], |
|
key=key, |
|
on_change = lambda: update_dir(key)) |
|
|
|
if selected_file == "Choose a file...": |
|
return None |
|
|
|
return selected_file |