Spaces:
Sleeping
Sleeping
Colin Leong
commited on
Commit
·
6e290b7
1
Parent(s):
4d840a0
Streamlit does not work intuitively
Browse files
app.py
CHANGED
@@ -9,7 +9,6 @@ from pyzstd import decompress
|
|
9 |
from PIL import Image
|
10 |
import cv2
|
11 |
import mediapipe as mp
|
12 |
-
import torch
|
13 |
|
14 |
mp_holistic = mp.solutions.holistic
|
15 |
FACEMESH_CONTOURS_POINTS = [
|
@@ -54,35 +53,6 @@ def pose_hide_legs(pose):
|
|
54 |
raise ValueError("Unknown pose header schema for hiding legs")
|
55 |
|
56 |
|
57 |
-
def preprocess_pose(pose):
|
58 |
-
pose = pose.get_components(
|
59 |
-
[
|
60 |
-
"POSE_LANDMARKS",
|
61 |
-
"FACE_LANDMARKS",
|
62 |
-
"LEFT_HAND_LANDMARKS",
|
63 |
-
"RIGHT_HAND_LANDMARKS",
|
64 |
-
],
|
65 |
-
{"FACE_LANDMARKS": FACEMESH_CONTOURS_POINTS},
|
66 |
-
)
|
67 |
-
|
68 |
-
pose = pose.normalize(pose_normalization_info(pose.header))
|
69 |
-
pose = pose_hide_legs(pose)
|
70 |
-
|
71 |
-
# from sign_vq.data.normalize import pre_process_mediapipe, normalize_mean_std
|
72 |
-
# from pose_anonymization.appearance import remove_appearance
|
73 |
-
|
74 |
-
# pose = remove_appearance(pose)
|
75 |
-
# pose = pre_process_mediapipe(pose)
|
76 |
-
# pose = normalize_mean_std(pose)
|
77 |
-
|
78 |
-
feat = np.nan_to_num(pose.body.data)
|
79 |
-
feat = feat.reshape(feat.shape[0], -1)
|
80 |
-
|
81 |
-
pose_frames = torch.from_numpy(np.expand_dims(feat, axis=0)).float()
|
82 |
-
|
83 |
-
return pose_frames
|
84 |
-
|
85 |
-
|
86 |
# @st.cache_data(hash_funcs={UploadedFile: lambda p: str(p.name)})
|
87 |
def load_pose(uploaded_file: UploadedFile) -> Pose:
|
88 |
|
@@ -129,147 +99,53 @@ if uploaded_file is not None:
|
|
129 |
with st.spinner(f"Loading {uploaded_file.name}"):
|
130 |
pose = load_pose(uploaded_file)
|
131 |
frames, images = get_pose_frames(pose=pose)
|
132 |
-
st.success("
|
133 |
-
|
134 |
-
|
135 |
-
header = pose.header
|
136 |
st.write("### File Info")
|
137 |
with st.expander(f"Show full Pose-format header from {uploaded_file.name}"):
|
138 |
-
|
139 |
-
st.write(header)
|
140 |
-
with st.expander(f"Show body information from {uploaded_file.name}"):
|
141 |
-
st.write(pose.body)
|
142 |
-
# st.write(pose.body.data.shape)
|
143 |
-
# st.write(pose.body.fps)
|
144 |
|
145 |
st.write(f"### Selection")
|
146 |
-
|
147 |
-
components = pose.header.components
|
148 |
-
|
149 |
-
component_names = [component.name for component in components]
|
150 |
-
chosen_component_names = component_names
|
151 |
-
|
152 |
component_selection = st.radio(
|
153 |
"How to select components?", options=["manual", "signclip"]
|
154 |
)
|
|
|
155 |
if component_selection == "manual":
|
156 |
-
st.
|
157 |
-
|
158 |
-
"Components to visualize",
|
159 |
-
options=component_names,
|
160 |
-
selection_mode="multi",
|
161 |
-
default=component_names,
|
162 |
)
|
163 |
-
|
164 |
-
# st.write(chosen_component_names)
|
165 |
-
|
166 |
-
st.write("### Point selection:")
|
167 |
-
point_names = []
|
168 |
-
new_chosen_components = []
|
169 |
-
points_dict = {}
|
170 |
-
for component in pose.header.components:
|
171 |
-
with st.expander(f"points for {component.name}"):
|
172 |
-
|
173 |
-
if component.name in chosen_component_names:
|
174 |
-
|
175 |
-
st.write(f"#### {component.name}")
|
176 |
-
selected_points = st.multiselect(
|
177 |
-
f"points for component {component.name}:",
|
178 |
-
options=component.points,
|
179 |
-
default=component.points,
|
180 |
-
)
|
181 |
-
if selected_points == component.points:
|
182 |
-
st.write(
|
183 |
-
f"All selected, no need to add a points dict entry for {component.name}"
|
184 |
-
)
|
185 |
-
else:
|
186 |
-
st.write(f"Adding dictionary for {component.name}")
|
187 |
-
points_dict[component.name] = selected_points
|
188 |
-
|
189 |
-
# selected_points = st.multiselect("points to visualize", options=point_names, default=point_names)
|
190 |
if chosen_component_names:
|
191 |
-
|
192 |
-
if not points_dict:
|
193 |
-
points_dict = None
|
194 |
-
# else:
|
195 |
-
# st.write(points_dict)
|
196 |
-
# st.write(chosen_component_names)
|
197 |
-
|
198 |
-
pose = pose.get_components(chosen_component_names, points=points_dict)
|
199 |
-
# st.write(pose.header)
|
200 |
|
201 |
elif component_selection == "signclip":
|
202 |
-
st.write("Selected landmarks used for SignCLIP.
|
203 |
pose = pose.get_components(
|
204 |
-
[
|
205 |
-
"POSE_LANDMARKS",
|
206 |
-
"FACE_LANDMARKS",
|
207 |
-
"LEFT_HAND_LANDMARKS",
|
208 |
-
"RIGHT_HAND_LANDMARKS",
|
209 |
-
],
|
210 |
-
{"FACE_LANDMARKS": FACEMESH_CONTOURS_POINTS},
|
211 |
)
|
212 |
-
|
213 |
-
# pose = pose.normalize(pose_normalization_info(pose.header)) Visualization goes blank
|
214 |
pose = pose_hide_legs(pose)
|
215 |
-
with st.expander("Show facemesh contour points:"):
|
216 |
-
st.write(f"{FACEMESH_CONTOURS_POINTS}")
|
217 |
-
with st.expander(f"Show header:"):
|
218 |
-
st.write(pose.header)
|
219 |
-
# st.write(f"signclip selected, new header:")
|
220 |
-
# st.write(pose.body.data.shape)
|
221 |
-
# st.write(pose.header)
|
222 |
-
else:
|
223 |
-
pass
|
224 |
-
|
225 |
-
filtered = st.button(f"Filter Components/Points")
|
226 |
-
if filtered:
|
227 |
-
|
228 |
-
|
229 |
|
|
|
|
|
230 |
st.write("### Filtered .pose file")
|
231 |
with st.expander("Show header"):
|
232 |
-
|
233 |
-
|
234 |
-
with st.expander(f"Show body"):
|
235 |
st.write(pose.body)
|
236 |
-
|
237 |
pose_file_out = Path(uploaded_file.name).with_suffix(".pose")
|
238 |
-
with pose_file_out.open("wb") as f:
|
239 |
pose.write(f)
|
240 |
|
241 |
-
with pose_file_out.open("rb") as f:
|
242 |
st.download_button("Download Filtered Pose", f, file_name=pose_file_out.name)
|
243 |
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
)
|
250 |
-
step = st.select_slider(
|
251 |
-
"Step value to select every nth image", list(range(1, len(frames))), value=1
|
252 |
-
)
|
253 |
-
fps = st.slider(
|
254 |
-
"fps for visualization: ",
|
255 |
-
min_value=1.0,
|
256 |
-
max_value=pose.body.fps,
|
257 |
-
value=pose.body.fps,
|
258 |
-
)
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
visualize_clicked = st.button(f"Visualize!")
|
264 |
-
|
265 |
-
|
266 |
-
if visualize_clicked:
|
267 |
-
|
268 |
-
st.write(f"Generating gif...")
|
269 |
-
|
270 |
-
# st.write(pose.body.data.shape)
|
271 |
|
272 |
-
st.image(get_pose_gif(pose=pose, step=step, fps=fps))
|
273 |
|
274 |
|
275 |
|
|
|
9 |
from PIL import Image
|
10 |
import cv2
|
11 |
import mediapipe as mp
|
|
|
12 |
|
13 |
mp_holistic = mp.solutions.holistic
|
14 |
FACEMESH_CONTOURS_POINTS = [
|
|
|
53 |
raise ValueError("Unknown pose header schema for hiding legs")
|
54 |
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
# @st.cache_data(hash_funcs={UploadedFile: lambda p: str(p.name)})
|
57 |
def load_pose(uploaded_file: UploadedFile) -> Pose:
|
58 |
|
|
|
99 |
with st.spinner(f"Loading {uploaded_file.name}"):
|
100 |
pose = load_pose(uploaded_file)
|
101 |
frames, images = get_pose_frames(pose=pose)
|
102 |
+
st.success("Done loading!")
|
103 |
+
|
|
|
|
|
104 |
st.write("### File Info")
|
105 |
with st.expander(f"Show full Pose-format header from {uploaded_file.name}"):
|
106 |
+
st.write(pose.header)
|
|
|
|
|
|
|
|
|
|
|
107 |
|
108 |
st.write(f"### Selection")
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
component_selection = st.radio(
|
110 |
"How to select components?", options=["manual", "signclip"]
|
111 |
)
|
112 |
+
|
113 |
if component_selection == "manual":
|
114 |
+
chosen_component_names = st.multiselect(
|
115 |
+
"Select components to visualize", options=[c.name for c in pose.header.components]
|
|
|
|
|
|
|
|
|
116 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
if chosen_component_names:
|
118 |
+
pose = pose.get_components(chosen_component_names)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
|
120 |
elif component_selection == "signclip":
|
121 |
+
st.write("Selected landmarks used for SignCLIP.")
|
122 |
pose = pose.get_components(
|
123 |
+
["POSE_LANDMARKS", "FACE_LANDMARKS", "LEFT_HAND_LANDMARKS", "RIGHT_HAND_LANDMARKS"]
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
)
|
|
|
|
|
125 |
pose = pose_hide_legs(pose)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
|
127 |
+
# Filter button logic
|
128 |
+
if st.button("Filter Components/Points"):
|
129 |
st.write("### Filtered .pose file")
|
130 |
with st.expander("Show header"):
|
131 |
+
st.write(pose.header)
|
132 |
+
with st.expander("Show body"):
|
|
|
133 |
st.write(pose.body)
|
134 |
+
|
135 |
pose_file_out = Path(uploaded_file.name).with_suffix(".pose")
|
136 |
+
with pose_file_out.open("wb") as f:
|
137 |
pose.write(f)
|
138 |
|
139 |
+
with pose_file_out.open("rb") as f:
|
140 |
st.download_button("Download Filtered Pose", f, file_name=pose_file_out.name)
|
141 |
|
142 |
+
# Visualization button logic
|
143 |
+
if st.button("Visualize"):
|
144 |
+
st.write("### Visualization")
|
145 |
+
step = st.select_slider("Step value to select every nth image", list(range(1, len(frames))), value=1)
|
146 |
+
fps = st.slider("FPS for visualization", min_value=1.0, max_value=pose.body.fps, value=pose.body.fps)
|
147 |
+
st.image(get_pose_gif(pose=pose, step=step, fps=fps))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
|
|
|
149 |
|
150 |
|
151 |
|