-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.py
179 lines (143 loc) · 6.92 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import copy
import os
import random
import streamlit as st
import yaml
from variables import ALLOWED_EXTENSIONS, CAPTION_PATH_OPTIONS
def caption_path_selectbox() -> str | None:
options = copy.deepcopy(CAPTION_PATH_OPTIONS)
caption_dirpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), "captions")
caption_paths = []
for root, dirs, files in os.walk(caption_dirpath):
for file in files:
if file.endswith((".yaml", ".yml", ".YAML", ".YML")):
caption_paths.append(os.path.relpath(os.path.join(root, file), caption_dirpath))
caption_paths = sorted(caption_paths)
options.extend(caption_paths)
default_caption_path = st.session_state.get("caption_path", None)
if default_caption_path is not None:
if default_caption_path in options:
options.remove(default_caption_path)
options.insert(0, st.session_state["caption_path"])
caption_path = st.selectbox("Path to a Caption File", options=options, key="input_caption_path")
if caption_path == "none":
caption_path = None
return caption_path
def match_file(dirpath: str, name: str) -> str:
for ext in ALLOWED_EXTENSIONS:
if os.path.exists(os.path.join(dirpath, name + "." + ext)):
return name + "." + ext
elif os.path.exists(os.path.join(dirpath, name + "." + ext.upper())):
return name + "." + ext.upper()
return name
def allowed_file(filename: str) -> bool:
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
def get_file_names(dirpaths: list[str], seed: int) -> list[str]:
all_files = []
for dirpath in dirpaths:
print(os.getcwd(), dirpath)
dirpath = dirpath.strip()
if dirpath == "" or not os.path.isdir(dirpath):
file_names = []
else:
file_names = [f.rsplit(".", 1)[0] for f in os.listdir(dirpath) if allowed_file(f)]
all_files.append(file_names)
name_sets = [set(names) for names in all_files]
file_names = sorted(list(set.intersection(*name_sets)))
if seed >= 0:
random.Random(seed).shuffle(file_names)
return file_names
def get_caption(captions: dict[str, str], file_name: str) -> str | None:
if captions is not None:
return captions.get(file_name, None)
else:
return None
def set_default_values():
if "num_folders" not in st.session_state:
st.session_state["num_folders"] = 2
if "random_seed" not in st.session_state:
st.session_state["input_random_seed"] = 0
if "page_id" not in st.session_state:
st.session_state["page_id"] = 0
if "num_samples_per_page" not in st.session_state:
st.session_state["input_num_samples_per_page"] = 5
if "caption_path" not in st.session_state:
st.session_state["caption_path"] = None
def set_default_display_names(display_names: list[str]) -> list[str]:
new_display_names = []
for i, name in enumerate(display_names):
name = name.strip()
if name == "":
new_display_names.append(f"Folder {i + 1}")
else:
new_display_names.append(name)
return new_display_names
def unique_display_names(display_names: list[str]) -> bool:
return len(set(display_names)) == len(display_names)
def add_folder(
position: int, folder_path_format: str = "input_folder_path_{}", display_name_format: str = "input_display_name_{}"
):
st.session_state.num_folders = st.session_state["num_folders"] + 1
for j in range(st.session_state.num_folders, position, -1):
st.session_state[folder_path_format.format(j)] = st.session_state.get(folder_path_format.format(j - 1), "")
st.session_state[display_name_format.format(j)] = st.session_state.get(display_name_format.format(j - 1), "")
st.session_state[folder_path_format.format(position)] = ""
st.session_state[display_name_format.format(position)] = ""
st.rerun()
def remove_folder(
position: int, folder_path_format: str = "input_folder_path_{}", display_name_format: str = "input_display_name_{}"
):
for j in range(position, st.session_state.num_folders - 1):
st.session_state[folder_path_format.format(j)] = st.session_state.get(folder_path_format.format(j + 1), "")
st.session_state[display_name_format.format(j)] = st.session_state.get(display_name_format.format(j + 1), "")
st.session_state.num_folders = st.session_state.num_folders - 1
st.rerun()
def get_current_config(
folder_path_format: str = "input_folder_path_{}", display_name_format: str = "input_display_name_{}"
) -> dict:
config = {}
config["num_folders"] = st.session_state.get("num_folders", 2)
config["random_seed"] = st.session_state.get("random_seed", 0)
config["num_samples_per_page"] = st.session_state.get("num_samples_per_page", 5)
config["caption_path"] = st.session_state.get("caption_path", None)
config["folder_paths"] = []
config["display_names"] = []
for i in range(config["num_folders"]):
folder_path = st.session_state.get(folder_path_format.format(i), "")
display_name = st.session_state.get(display_name_format.format(i), "")
config["folder_paths"].append(folder_path)
config["display_names"].append(display_name)
return config
def restore_from_config(
path: str, folder_path_format: str = "input_folder_path_{}", display_name_format: str = "input_display_name_{}"
):
if not os.path.exists(path) or not path.endswith(".yaml"):
return
config = yaml.load(open(path, "r"), Loader=yaml.FullLoader)
st.session_state["num_folders"] = config["num_folders"]
st.session_state["input_random_seed"] = config["random_seed"]
st.session_state["input_num_samples_per_page"] = config["num_samples_per_page"]
st.session_state["caption_path"] = config["caption_path"]
for i in range(config["num_folders"]):
st.session_state[folder_path_format.format(i)] = config["folder_paths"][i]
st.session_state[display_name_format.format(i)] = config["display_names"][i]
def save_config(
save_name: str, folder_path_format: str = "input_folder_path_{}", display_name_format: str = "input_display_name_{}"
):
if not save_name.endswith((".yaml", ".yml", ".YAML", ".YML")):
save_name += ".yaml"
config = get_current_config(folder_path_format, display_name_format)
root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "configs")
path = os.path.join(root, save_name)
save_dir = os.path.dirname(os.path.abspath(path))
os.makedirs(save_dir, exist_ok=True)
with open(path, "w") as f:
yaml.dump(config, f)
def load_config(
load_name: str, folder_path_format: str = "input_folder_path_{}", display_name_format: str = "input_display_name_{}"
):
root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "configs")
restore_from_config(
os.path.join(root, load_name), folder_path_format=folder_path_format, display_name_format=display_name_format
)
st.rerun()